Changeset: 4f92b93e0c4c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4f92b93e0c4c
Modified Files:
clients/Tests/exports.stable.out
gdk/gdk_atomic.h
gdk/gdk_utils.c
Branch: default
Log Message:
Merge with Apr2019 branch.
diffs (92 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -315,7 +315,6 @@ bool MT_path_absolute(const char *path);
void MT_sleep_ms(unsigned int ms);
void *MT_thread_getdata(void);
const char *MT_thread_getname(void);
-struct thread_info *MT_thread_info(int *nthreads);
bool MT_thread_init(void);
void MT_thread_setdata(void *data);
void MT_thread_setname(const char *name);
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
@@ -720,7 +720,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