Changeset: e2c83d9aab17 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e2c83d9aab17
Modified Files:
gdk/gdk_atomic.h
gdk/gdk_utils.c
Branch: Apr2019
Log Message:
New macro ATOMIC_ISSET since ATOMIC_TAS doesn't necessarily use 0 for unset.
diffs (81 lines):
diff --git a/gdk/gdk_atomic.h b/gdk/gdk_atomic.h
--- a/gdk/gdk_atomic.h
+++ b/gdk/gdk_atomic.h
@@ -29,10 +29,12 @@
* In addition, the following operations are defined:
* ATOMIC_TAS -- test-and-set: set variable to "true" and return old value
* ATOMIC_CLEAR -- set variable to "false"
- * These two operations are only defined on variables of type
+ * ATOMIC_ISSET -- returns whether value is "true"
+ * These three operations are only defined on variables of type
* ATOMIC_FLAG, and the only values defined for such a variable are
- * "false" (zero) and "true" (non-zero). The variable can be statically
- * initialized using the ATOMIC_FLAG_INIT macro.
+ * "false" and "true", and they should only be tested through the
+ * ATOMIC_ISSET macro. The variable can be statically initialized
+ * using the ATOMIC_FLAG_INIT macro.
*/
#ifndef _GDK_ATOMIC_H_
@@ -60,6 +62,7 @@
#define ATOMIC_FLAG_INIT { AO_TS_INITIALIZER }
#define ATOMIC_CLEAR(var, lck) AO_CLEAR(&var)
#define ATOMIC_TAS(var, lck) (AO_test_and_set_full(&var) != AO_TS_CLEAR)
+#define ATOMIC_ISSET(var, lck) (var != AO_TS_CLEAR)
#else
@@ -108,6 +111,7 @@
#define ATOMIC_FLAG_INIT { 0 }
#define ATOMIC_CLEAR(var, lck) _InterlockedExchange(&var, 0)
#define ATOMIC_TAS(var, lck) _InterlockedCompareExchange(&var, 1, 0)
+#define ATOMIC_ISSET(var, lck) (var != 0)
#pragma intrinsic(_InterlockedCompareExchange)
#elif (defined(__GNUC__) || defined(__INTEL_COMPILER)) && !(defined(__sun__)
&& SIZEOF_SIZE_T == 8) && !defined(_MSC_VER) && !defined(NO_ATOMIC_INSTRUCTIONS)
@@ -132,6 +136,7 @@
#define ATOMIC_FLAG_INIT { 0 }
#define ATOMIC_CLEAR(var, lck) __atomic_clear(&var, __ATOMIC_SEQ_CST)
#define ATOMIC_TAS(var, lck) __atomic_test_and_set(&var,
__ATOMIC_SEQ_CST)
+#define ATOMIC_ISSET(var, lck) (var != 0)
#else
@@ -147,6 +152,7 @@
#define ATOMIC_FLAG_INIT { 0 }
#define ATOMIC_CLEAR(var, lck) __sync_lock_release(&var)
#define ATOMIC_TAS(var, lck) __sync_lock_test_and_set(&var, 1)
+#define ATOMIC_ISSET(var, lck) (var != 0)
#endif
@@ -256,6 +262,17 @@ static inline void
}
#define ATOMIC_CLEAR(var, lck) __ATOMIC_CLEAR(&var, &(lck).lock)
+static inline bool
+__ATOMIC_ISSET(volatile ATOMIC_FLAG *var, pthread_mutex_t *lck)
+{
+ ATOMIC_FLAG val;
+ pthread_mutex_lock(lck);
+ val = *var;
+ pthread_mutex_unlock(lck);
+ return val != 0;
+}
+#define ATOMIC_ISSET(var, lck) __ATOMIC_ISSET(&var, &(lck).lock)
+
#endif
#endif /* LIBATOMIC_OPS */
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -678,7 +678,7 @@ GDKexiting(void)
#ifdef ATOMIC_LOCK
pthread_mutex_lock(&GDKstoppedLock.lock);
#endif
- stopped = GDKstopped != 0;
+ stopped = ATOMIC_ISSET(GDKstopped, GDKstoppedLock);
#ifdef ATOMIC_LOCK
pthread_mutex_unlock(&GDKstoppedLock.lock);
#endif
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list