(svn r8508) -Codechange (r5762): [win32] Use an atomic operation to query and set the value of _global_dir_is_in_use for opendir etc to guarantee concurrency.
authorDarkvater
Thu, 01 Feb 2007 13:01:05 +0000
changeset 6142 3afbecfa23a7
parent 6141 400b8bb355e3
child 6143 87e99d425124
(svn r8508) -Codechange (r5762): [win32] Use an atomic operation to query and set the value of _global_dir_is_in_use for opendir etc to guarantee concurrency.
src/win32.cpp
--- a/src/win32.cpp	Thu Feb 01 12:51:10 2007 +0000
+++ b/src/win32.cpp	Thu Feb 01 13:01:05 2007 +0000
@@ -625,20 +625,19 @@
 
 /* suballocator - satisfies most requests with a reusable static instance.
  * this avoids hundreds of alloc/free which would fragment the heap.
- * To guarantee reentrancy, we fall back to malloc if the instance is
+ * To guarantee concurrency, we fall back to malloc if the instance is
  * already in use (it's important to avoid suprises since this is such a
  * low-level routine). */
 static DIR _global_dir;
-static bool _global_dir_is_in_use = false;
+static LONG _global_dir_is_in_use = false;
 
 static inline DIR *dir_calloc(void)
 {
 	DIR *d;
 
-	if (_global_dir_is_in_use) {
+	if (InterlockedExchange(&_global_dir_is_in_use, true) == (LONG)true) {
 		d = CallocT<DIR>(1);
 	} else {
-		_global_dir_is_in_use = true;
 		d = &_global_dir;
 		memset(d, 0, sizeof(*d));
 	}
@@ -648,7 +647,7 @@
 static inline void dir_free(DIR *d)
 {
 	if (d == &_global_dir) {
-		_global_dir_is_in_use = false;
+		_global_dir_is_in_use = (LONG)false;
 	} else {
 		free(d);
 	}