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.
@@ -370,8 +370,8 @@ int fscache_enable(size_t initial_size)
370370 * opendir and lstat function pointers are redirected if
371371 * any threads are using the fscache.
372372 */
373+ EnterCriticalSection (& fscache_cs );
373374 if (!initialized ) {
374- InitializeCriticalSection (& mutex );
375375 if (!dwTlsIndex ) {
376376 dwTlsIndex = TlsAlloc ();
377377 if (dwTlsIndex == TLS_OUT_OF_INDEXES )
@@ -382,12 +382,13 @@ int fscache_enable(size_t initial_size)
382382 opendir = fscache_opendir ;
383383 lstat = fscache_lstat ;
384384 }
385- InterlockedIncrement (& initialized );
385+ initialized ++ ;
386+ LeaveCriticalSection (& fscache_cs );
386387
387388 /* refcount the thread specific initialization */
388389 cache = fscache_getcache ();
389390 if (cache ) {
390- InterlockedIncrement ( & cache -> enabled ) ;
391+ cache -> enabled ++ ;
391392 } else {
392393 cache = (struct fscache * )xcalloc (1 , sizeof (* cache ));
393394 cache -> enabled = 1 ;
@@ -421,7 +422,7 @@ void fscache_disable(void)
421422 BUG ("fscache_disable() called on a thread where fscache has not been initialized" );
422423 if (!cache -> enabled )
423424 BUG ("fscache_disable() called on an fscache that is already disabled" );
424- InterlockedDecrement ( & cache -> enabled ) ;
425+ cache -> enabled -- ;
425426 if (!cache -> enabled ) {
426427 TlsSetValue (dwTlsIndex , NULL );
427428 trace_printf_key (& trace_fscache , "fscache_disable: lstat %u, opendir %u, "
@@ -434,12 +435,14 @@ void fscache_disable(void)
434435 }
435436
436437 /* update the global fscache initialization */
437- InterlockedDecrement (& initialized );
438+ EnterCriticalSection (& fscache_cs );
439+ initialized -- ;
438440 if (!initialized ) {
439441 /* reset opendir and lstat to the original implementations */
440442 opendir = dirent_opendir ;
441443 lstat = mingw_lstat ;
442444 }
445+ LeaveCriticalSection (& fscache_cs );
443446
444447 trace_printf_key (& trace_fscache , "fscache: disable\n" );
445448 return ;
@@ -606,7 +609,7 @@ void fscache_merge(struct fscache *dest)
606609 * isn't being used so the critical section only needs to prevent
607610 * the the child threads from stomping on each other.
608611 */
609- EnterCriticalSection (& mutex );
612+ EnterCriticalSection (& fscache_cs );
610613
611614 hashmap_iter_init (& cache -> map , & iter );
612615 while ((e = hashmap_iter_next (& iter )))
@@ -618,9 +621,9 @@ void fscache_merge(struct fscache *dest)
618621 dest -> opendir_requests += cache -> opendir_requests ;
619622 dest -> fscache_requests += cache -> fscache_requests ;
620623 dest -> fscache_misses += cache -> fscache_misses ;
621- LeaveCriticalSection (& mutex );
624+ initialized -- ;
625+ LeaveCriticalSection (& fscache_cs );
622626
623627 free (cache );
624628
625- InterlockedDecrement (& initialized );
626629}
0 commit comments