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