Changeset: 67ce7e1f0900 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=67ce7e1f0900
Modified Files:
        NT/monetdb_config.h.in
        NT/rules.msc
        clients/Tests/exports.stable.out
        configure.ag
        gdk/gdk_atomic.h
        gdk/gdk_system.c
        gdk/gdk_system.h
        gdk/gdk_utils.c
        monetdb5/mal/mal.c
        monetdb5/mal/mal_resource.c
        monetdb5/mal/mal_resource.h
Branch: default
Log Message:

Atomic cleanup; use libatomic_ops if available.


diffs (truncated from 860 to 300 lines):

diff --git a/NT/monetdb_config.h.in b/NT/monetdb_config.h.in
--- a/NT/monetdb_config.h.in
+++ b/NT/monetdb_config.h.in
@@ -210,6 +210,9 @@
 /* Define to 1 if you have the <langinfo.h> header file. */
 /* #undef HAVE_LANGINFO_H */
 
+/* Define if you have the atomic_ops library */
+/* #undef HAVE_LIBATOMIC_OPS */
+
 /* Define if you have the bz2 library */
 /* #undef HAVE_LIBBZ2 */
 
diff --git a/NT/rules.msc b/NT/rules.msc
--- a/NT/rules.msc
+++ b/NT/rules.msc
@@ -137,6 +137,13 @@ LTLIBICONV = "$(LIBICONV)\lib\iconv$(DEB
 ICONV_CFLAGS = -DHAVE_ICONV "-I$(LIBICONV)\include"
 !ENDIF
 
+!IFDEF HAVE_ATOMIC_OPS
+!IFNDEF LIBATOMIC_OPS
+LIBATOMIC_OPS = C:\atomic_ops-7.2
+!ENDIF
+ATOMIC_OPS_CFLAGS = -DHAVE_LIBATOMIC_OPS "-I$(LIBATOMIC_OPS)"
+!endif
+
 !IFDEF HAVE_LIBZ
 # This is the location of the ZLIB library
 !IFNDEF LIBZLIB
@@ -207,7 +214,7 @@ COMPILERFLAGS = -GF -W3 $(W_CFLAGS) -MDd
 # add -Zi flag (implies -debug, not -D_DEBUG) to get symbol info in .pdb files
 COMPILERFLAGS = -GF -W3 $(W_CFLAGS) -MD -nologo -Ox -Zi
 !ENDIF
-CFLAGS = $(COMPILERFLAGS)  -I. -I$(TOPDIR) $(LIBC_INCS) $(INCLUDES) 
$(WINCONFIG_INCS) $(ICONV_CFLAGS)
+CFLAGS = $(COMPILERFLAGS)  -I. -I$(TOPDIR) $(LIBC_INCS) $(INCLUDES) 
$(WINCONFIG_INCS) $(ICONV_CFLAGS) $(ATOMIC_OPS_CFLAGS)
 
 # No general LDFLAGS needed
 INSTALL = copy
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
@@ -273,7 +273,7 @@ BAT *GDKkey;
 ATOMIC_TYPE volatile GDKlockcnt;
 ATOMIC_TYPE volatile GDKlockcontentioncnt;
 MT_Lock *volatile GDKlocklist;
-int volatile GDKlocklistlock;
+ATOMIC_FLAG volatile GDKlocklistlock;
 ATOMIC_TYPE volatile GDKlocksleepcnt;
 void GDKlockstatistics(int);
 void *GDKmalloc(size_t size);
@@ -2618,6 +2618,7 @@ void initNamespace(void);
 void initParser(void);
 void initProfiler(MalBlkPtr mb);
 int initQlog(void);
+void initResource(void);
 int inlineMALblock(MalBlkPtr mb, int pc, MalBlkPtr mc);
 int inlineProp;
 str inplaceRef;
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -2285,6 +2285,13 @@ if test "x$enable_fits" != xno; then
 fi
 AM_CONDITIONAL(HAVE_CFITSIO, test x"$have_cfitsio" != xno)
 
+PKG_CHECK_MODULES([atomic_ops], [atomic_ops], [have_atomic_ops="yes"], 
[have_atomic_ops="no"])
+if test x"$have_atomic_ops" = x"yes" ; then
+       AC_DEFINE(HAVE_LIBATOMIC_OPS, 1, [Define if you have the libatomic_ops 
library])
+       CFLAGS="$CFLAGS $atomic_ops_CFLAGS"
+       LIBS="$LIBS $atomic_ops_LIBS"
+fi
+
 dnl     checks for header files
 AC_HEADER_STDBOOL
 AC_HEADER_STDC
diff --git a/gdk/gdk_atomic.h b/gdk/gdk_atomic.h
--- a/gdk/gdk_atomic.h
+++ b/gdk/gdk_atomic.h
@@ -34,155 +34,204 @@
  * ATOMIC_SUB -- subtract a value from a variable, return original value;
  * ATOMIC_INT -- increment a variable's value, return new value;
  * ATOMIC_DEC -- decrement a variable's value, return new value;
- * ATOMIC_CAS -- compare-and-set: compare the variable's value with
- *               old and if it matches, replace with new, return
- *               original value.
- * As written, these interfaces work on variables of type ATOMIC_TYPE
- * (int or lng depending on architecture).  There are also versions of
- * these interfaces specifically for int, and on 64-bit architectures,
- * for lng.  In addition, all but add and sub are also defined for sht
- * (Windows restriction).  To get the type-specific interface, append
- * _sht, _int, or _lng to the above names.
+ * These interfaces work on variables of type ATOMIC_TYPE
+ * (int or lng depending on architecture).
+ *
+ * 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_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.
  */
 
 #ifndef _GDK_ATOMIC_H_
 #define _GDK_ATOMIC_H_
 
+#ifdef HAVE_LIBATOMIC_OPS
+
+#include <atomic_ops.h>
+
+#define ATOMIC_TYPE                    AO_t
+
+#define ATOMIC_GET(var, lck, fcn)      AO_load_full(&var)
+#define ATOMIC_SET(var, val, lck, fcn) AO_store_full(&var, (val))
+#define ATOMIC_ADD(var, val, lck, fcn) AO_fetch_and_add(&var, (val))
+#define ATOMIC_SUB(var, val, lck, fcn) AO_fetch_and_add(&var, -(val))
+#define ATOMIC_INC(var, lck, fcn)      AO_fetch_and_add1(&var)
+#define ATOMIC_DEC(var, lck, fcn)      AO_fetch_and_sub1(&var)
+
+#define ATOMIC_INIT(lck, fcn)          ((void) 0)
+
+#define ATOMIC_FLAG                    AO_TS_t
+#define ATOMIC_FLAG_INIT               { AO_TS_INITIALIZER }
+#define ATOMIC_CLEAR(var, lck, fcn)    AO_CLEAR(&var)
+#define ATOMIC_TAS(var, lck, fcn)      (AO_test_and_set_full(&var) != 
AO_TS_CLEAR)
+
+#else
+
 #if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
 
 #include <intrin.h>
 
-#define ATOMIC_GET_sht(var, lck, fcn)          var
-#define ATOMIC_SET_sht(var, val, lck, fcn)     (var = (val))
-#define ATOMIC_INC_sht(var, lck, fcn)          _InterlockedIncrement16(&(var))
-#define ATOMIC_DEC_sht(var, lck, fcn)          _InterlockedDecrement16(&(var))
-#define ATOMIC_CAS_sht(var, old, new, lck, fcn)        
_InterlockedCompareExchange16(&(var), new, old)
+#if SIZEOF_SSIZE_T == SIZEOF_LNG
 
-#pragma intrinsic(_InterlockedIncrement16)
-#pragma intrinsic(_InterlockedDecrement16)
-#pragma intrinsic(_InterlockedCompareExchange16)
+#define ATOMIC_TYPE                    lng
 
-#define ATOMIC_GET_int(var, lck, fcn)          var
-#define ATOMIC_SET_int(var, val, lck, fcn)     (var = (val))
-#define ATOMIC_ADD_int(var, val, lck, fcn)     _InterlockedExchangeAdd(&(var), 
(val))
-#define ATOMIC_SUB_int(var, val, lck, fcn)     _InterlockedExchangeAdd(&(var), 
-(val))
-#define ATOMIC_INC_int(var, lck, fcn)          _InterlockedIncrement(&(var))
-#define ATOMIC_DEC_int(var, lck, fcn)          _InterlockedDecrement(&(var))
-#define ATOMIC_CAS_int(var, old, new, lck, fcn)        
_InterlockedCompareExchange(&(var), new, old)
+#define ATOMIC_GET(var, lck, fcn)      var
+#define ATOMIC_SET(var, val, lck, fcn) _InterlockedExchange64(&var, (val))
+#define ATOMIC_ADD(var, val, lck, fcn) _InterlockedExchangeAdd64(&var, val)
+#define ATOMIC_SUB(var, val, lck, fcn) _InterlockedExchangeAdd64(&var, -(val))
+#define ATOMIC_INC(var, lck, fcn)      _InterlockedIncrement64(&var)
+#define ATOMIC_DEC(var, lck, fcn)      _InterlockedDecrement64(&var)
 
-#pragma intrinsic(_InterlockedExchangeAdd)
-#pragma intrinsic(_InterlockedIncrement)
-#pragma intrinsic(_InterlockedDecrement)
-#pragma intrinsic(_InterlockedCompareExchange)
-
-#if SIZEOF_SSIZE_T == SIZEOF_LNG
-#define ATOMIC_GET_lng(var, lck, fcn)          var
-#define ATOMIC_SET_lng(var, val, lck, fcn)     (var = (val))
-#define ATOMIC_ADD_lng(var, val, lck, fcn)     
_InterlockedExchangeAdd64(&(var), val)
-#define ATOMIC_SUB_lng(var, val, lck, fcn)     
_InterlockedExchangeAdd64(&(var), -(val))
-#define ATOMIC_INC_lng(var, lck, fcn)          _InterlockedIncrement64(&(var))
-#define ATOMIC_DEC_lng(var, lck, fcn)          _InterlockedDecrement64(&(var))
-#define ATOMIC_CAS_lng(var, old, new, lck, fcn)        
_InterlockedCompareExchange64(&(var), new, old)
-
+#pragma intrinsic(_InterlockedExchange64)
 #pragma intrinsic(_InterlockedExchangeAdd64)
 #pragma intrinsic(_InterlockedIncrement64)
 #pragma intrinsic(_InterlockedDecrement64)
 #pragma intrinsic(_InterlockedCompareExchange64)
+
+#else
+
+#define ATOMIC_TYPE                    int
+
+#define ATOMIC_GET(var, lck, fcn)      var
+#define ATOMIC_SET(var, val, lck, fcn) _InterlockedExchange(&var, (val))
+#define ATOMIC_ADD(var, val, lck, fcn) _InterlockedExchangeAdd(&var, (val))
+#define ATOMIC_SUB(var, val, lck, fcn) _InterlockedExchangeAdd(&var, -(val))
+#define ATOMIC_INC(var, lck, fcn)      _InterlockedIncrement(&var)
+#define ATOMIC_DEC(var, lck, fcn)      _InterlockedDecrement(&var)
+
+#pragma intrinsic(_InterlockedExchange)
+#pragma intrinsic(_InterlockedExchangeAdd)
+#pragma intrinsic(_InterlockedIncrement)
+#pragma intrinsic(_InterlockedDecrement)
+
 #endif
 
-#define ATOMIC_INIT(lck, fcn)  ((void) 0)
+#define ATOMIC_INIT(lck, fcn)          ((void) 0)
+
+#define ATOMIC_FLAG                    int
+#define ATOMIC_FLAG_INIT               { 0 }
+#define ATOMIC_CLEAR(var, lck, fcn)    _InterlockedExchange(&var, 0)
+#define ATOMIC_TAS(var, lck, fcn)      _InterlockedCompareExchange(&var, 1, 0)
+#pragma intrinsic(_InterlockedCompareExchange)
 
 #elif (defined(__GNUC__) || defined(__INTEL_COMPILER)) && !(defined(__sun__) 
&& SIZEOF_SIZE_T == SIZEOF_LNG) && !defined(_MSC_VER)
 
-#define ATOMIC_GET_sht(var, lck, fcn)          var
-#define ATOMIC_SET_sht(var, val, lck, fcn)     (var = (val))
-#define ATOMIC_INC_sht(var, lck, fcn)          __sync_add_and_fetch(&(var), 1)
-#define ATOMIC_DEC_sht(var, lck, fcn)          __sync_sub_and_fetch(&(var), 1)
-#define ATOMIC_CAS_sht(var, old, new, lck, fcn)        
__sync_val_compare_and_swap(&(var), old, new)
+#if SIZEOF_SSIZE_T == SIZEOF_LNG
 
-#define ATOMIC_GET_int(var, lck, fcn)          var
-#define ATOMIC_SET_int(var, val, lck, fcn)     (var = (val))
-#define ATOMIC_ADD_int(var, val, lck, fcn)     __sync_fetch_and_add(&(var), 
(val))
-#define ATOMIC_SUB_int(var, val, lck, fcn)     __sync_fetch_and_sub(&(var), 
(val))
-#define ATOMIC_INC_int(var, lck, fcn)          __sync_add_and_fetch(&(var), 1)
-#define ATOMIC_DEC_int(var, lck, fcn)          __sync_sub_and_fetch(&(var), 1)
-#define ATOMIC_CAS_int(var, old, new, lck, fcn)        
__sync_val_compare_and_swap(&(var), old, new)
+#define ATOMIC_TYPE                    lng
 
-#if SIZEOF_SSIZE_T == SIZEOF_LNG
-#define ATOMIC_GET_lng(var, lck, fcn)          var
-#define ATOMIC_SET_lng(var, val, lck, fcn)     (var = (val))
-#define ATOMIC_ADD_lng(var, val, lck, fcn)     __sync_fetch_and_add(&(var), 
(val))
-#define ATOMIC_SUB_lng(var, val, lck, fcn)     __sync_fetch_and_sub(&(var), 
(val))
-#define ATOMIC_INC_lng(var, lck, fcn)          __sync_add_and_fetch(&(var), 1)
-#define ATOMIC_DEC_lng(var, lck, fcn)          __sync_sub_and_fetch(&(var), 1)
-#define ATOMIC_CAS_lng(var, old, new, lck, fcn)        
__sync_val_compare_and_swap(&(var), old, new)
-#endif
-
-#define ATOMIC_INIT(lck, fcn)  ((void) 0)
+#define ATOMIC_GET(var, lck, fcn)      __atomic_load_n(&var, __ATOMIC_SEQ_CST)
+#define ATOMIC_SET(var, val, lck, fcn) __atomic_store_n(&var, (val), 
__ATOMIC_SEQ_CST)
+#define ATOMIC_ADD(var, val, lck, fcn) __atomic_fetch_add(&var, (val), 
__ATOMIC_SEQ_CST)
+#define ATOMIC_SUB(var, val, lck, fcn) __atomic_fetch_sub(&var, (val), 
__ATOMIC_SEQ_CST)
+#define ATOMIC_INC(var, lck, fcn)      __atomic_add_fetch(&var, 1, 
__ATOMIC_SEQ_CST)
+#define ATOMIC_DEC(var, lck, fcn)      __atomic_sub_fetch(&var, 1, 
__ATOMIC_SEQ_CST)
 
 #else
 
-static inline short
-__ATOMIC_GET_sht(volatile short *var, pthread_mutex_t *lck)
+#define ATOMIC_TYPE                    int
+
+#define ATOMIC_GET(var, lck, fcn)      __atomic_load_n(&var, __ATOMIC_SEQ_CST)
+#define ATOMIC_SET(var, val, lck, fcn) __atomic_store_n(&var, (val), 
__ATOMIC_SEQ_CST)
+#define ATOMIC_ADD(var, val, lck, fcn) __atomic_fetch_add(&var, (val), 
__ATOMIC_SEQ_CST)
+#define ATOMIC_SUB(var, val, lck, fcn) __atomic_fetch_sub(&var, (val), 
__ATOMIC_SEQ_CST)
+#define ATOMIC_INC(var, lck, fcn)      __atomic_add_fetch(&var, 1, 
__ATOMIC_SEQ_CST)
+#define ATOMIC_DEC(var, lck, fcn)      __atomic_sub_fetch(&var, 1, 
__ATOMIC_SEQ_CST)
+
+#endif
+
+#define ATOMIC_INIT(lck, fcn)          ((void) 0)
+
+#define ATOMIC_FLAG                    char
+#define ATOMIC_FLAG_INIT               { 0 }
+#define ATOMIC_CLEAR(var, lck, fcn)    __atomic_clear(&var, __ATOMIC_SEQ_CST)
+#define ATOMIC_TAS(var, lck, fcn)      __atomic_test_and_set(&var, 
__ATOMIC_SEQ_CST)
+
+#else
+
+#if SIZEOF_SSIZE_T == SIZEOF_LNG
+
+#define ATOMIC_TYPE                    lng
+
+static inline lng
+__ATOMIC_GET(volatile lng *var, pthread_mutex_t *lck)
 {
-       short old;
+       lng old;
        pthread_mutex_lock(lck);
        old = *var;
        pthread_mutex_unlock(lck);
        return old;
 }
-#define ATOMIC_GET_sht(var, lck, fcn)  __ATOMIC_GET_sht(&(var), &(lck))
+#define ATOMIC_GET(var, lck, fcn)      __ATOMIC_GET(&var, &(lck))
 
-static inline short
-__ATOMIC_SET_sht(volatile short *var, short val, pthread_mutex_t *lck)
+static inline lng
+__ATOMIC_SET(volatile lng *var, lng val, pthread_mutex_t *lck)
 {
-       short new;
+       lng new;
        pthread_mutex_lock(lck);
        *var = val;
        new = *var;
        pthread_mutex_unlock(lck);
        return new;
 }
-#define ATOMIC_SET_sht(var, val, lck, fcn)     __ATOMIC_SET_sht(&(var), (val), 
&(lck))
+#define ATOMIC_SET(var, val, lck, fcn) __ATOMIC_SET(&var, (val), &(lck))
 
-static inline short
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to