77
88static volatile long initialized ;
99static DWORD dwTlsIndex ;
10- static CRITICAL_SECTION mutex ;
10+ CRITICAL_SECTION fscache_cs ;
1111
1212/*
1313 * Store one fscache per thread to avoid thread contention and locking.
@@ -383,8 +383,8 @@ int fscache_enable(size_t initial_size)
383383 * opendir and lstat function pointers are redirected if
384384 * any threads are using the fscache.
385385 */
386+ EnterCriticalSection (& fscache_cs );
386387 if (!initialized ) {
387- InitializeCriticalSection (& mutex );
388388 if (!dwTlsIndex ) {
389389 dwTlsIndex = TlsAlloc ();
390390 if (dwTlsIndex == TLS_OUT_OF_INDEXES )
@@ -395,12 +395,13 @@ int fscache_enable(size_t initial_size)
395395 opendir = fscache_opendir ;
396396 lstat = fscache_lstat ;
397397 }
398- InterlockedIncrement (& initialized );
398+ initialized ++ ;
399+ LeaveCriticalSection (& fscache_cs );
399400
400401 /* refcount the thread specific initialization */
401402 cache = fscache_getcache ();
402403 if (cache ) {
403- InterlockedIncrement ( & cache -> enabled ) ;
404+ cache -> enabled ++ ;
404405 } else {
405406 cache = (struct fscache * )xcalloc (1 , sizeof (* cache ));
406407 cache -> enabled = 1 ;
@@ -434,7 +435,7 @@ void fscache_disable(void)
434435 BUG ("fscache_disable() called on a thread where fscache has not been initialized" );
435436 if (!cache -> enabled )
436437 BUG ("fscache_disable() called on an fscache that is already disabled" );
437- InterlockedDecrement ( & cache -> enabled ) ;
438+ cache -> enabled -- ;
438439 if (!cache -> enabled ) {
439440 TlsSetValue (dwTlsIndex , NULL );
440441 trace_printf_key (& trace_fscache , "fscache_disable: lstat %u, opendir %u, "
@@ -447,12 +448,14 @@ void fscache_disable(void)
447448 }
448449
449450 /* update the global fscache initialization */
450- InterlockedDecrement (& initialized );
451+ EnterCriticalSection (& fscache_cs );
452+ initialized -- ;
451453 if (!initialized ) {
452454 /* reset opendir and lstat to the original implementations */
453455 opendir = dirent_opendir ;
454456 lstat = mingw_lstat ;
455457 }
458+ LeaveCriticalSection (& fscache_cs );
456459
457460 trace_printf_key (& trace_fscache , "fscache: disable\n" );
458461 return ;
@@ -619,7 +622,7 @@ void fscache_merge(struct fscache *dest)
619622 * isn't being used so the critical section only needs to prevent
620623 * the the child threads from stomping on each other.
621624 */
622- EnterCriticalSection (& mutex );
625+ EnterCriticalSection (& fscache_cs );
623626
624627 hashmap_iter_init (& cache -> map , & iter );
625628 while ((e = hashmap_iter_next (& iter )))
@@ -631,9 +634,9 @@ void fscache_merge(struct fscache *dest)
631634 dest -> opendir_requests += cache -> opendir_requests ;
632635 dest -> fscache_requests += cache -> fscache_requests ;
633636 dest -> fscache_misses += cache -> fscache_misses ;
634- LeaveCriticalSection (& mutex );
637+ initialized -- ;
638+ LeaveCriticalSection (& fscache_cs );
635639
636640 free (cache );
637641
638- InterlockedDecrement (& initialized );
639642}
0 commit comments