Changeset: 9c14fb4f6e18 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9c14fb4f6e18
Modified Files:
        gdk/gdk_atomic.h
        gdk/gdk_bat.c
        gdk/gdk_mapreduce.c
        gdk/gdk_utils.c
        monetdb5/mal/mal_resource.c
        monetdb5/mal/mal_runtime.c
Branch: default
Log Message:

Merge with Feb2013 branch.


diffs (truncated from 849 to 300 lines):

diff --git a/gdk/gdk_atomic.h b/gdk/gdk_atomic.h
--- a/gdk/gdk_atomic.h
+++ b/gdk/gdk_atomic.h
@@ -17,86 +17,365 @@
  * All Rights Reserved.
  */
 
+/* This file provides interfaces to perform certain atomic operations
+ * on variables.  Atomic in this sense means that an operation
+ * performed in one thread shows up in another thread either
+ * completely or not at all.
+ *
+ * If the symbol ATOMIC_LOCK is defined, a variable of type MT_Lock
+ * must be declared and initialized.  The latter can be done using the
+ * macro ATOMIC_INIT which expands to nothing if ATOMIC_LOCK is not
+ * defined.
+ *
+ * The following operations are defined:
+ * ATOMIC_GET -- return the value of a variable;
+ * ATOMIC_SET -- set the value of a variable;
+ * ATOMIC_ADD -- add a value to a variable, return original value;
+ * 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.
+ */
+
 #ifndef _GDK_ATOMIC_H_
 #define _GDK_ATOMIC_H_
 
 #if defined(_MSC_VER)
+
 #include <intrin.h>
-#if SIZEOF_SSIZE_T == SIZEOF___INT64
-#define ATOMIC_TYPE            __int64
-#define ATOMIC_ADD(var, val)   _InterlockedExchangeAdd64(&var, (__int64) (val))
-#define ATOMIC_INC(var)                _InterlockedIncrement64(&var)
-#define ATOMIC_SUB(var, val)   _InterlockedExchangeAdd64(&var, -(__int64) 
(val))
-#define ATOMIC_DEC(var)                _InterlockedDecrement64(&var)
+
+#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)
+
+#pragma intrinsic(_InterlockedIncrement16)
+#pragma intrinsic(_InterlockedDecrement16)
+#pragma intrinsic(_InterlockedCompareExchange16)
+
+#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)
+
+#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(_InterlockedExchangeAdd64)
 #pragma intrinsic(_InterlockedIncrement64)
 #pragma intrinsic(_InterlockedDecrement64)
+#pragma intrinsic(_InterlockedCompareExchange64)
+#endif
+
+#define ATOMIC_INIT(lck, fcn)  ((void) 0)
+
+#elif defined(__GNUC__) || defined(__INTEL_COMPILER)
+
+#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)
+
+#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)
+
+#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)
+
 #else
-#define ATOMIC_TYPE            long
-#define ATOMIC_ADD(var, val)   _InterlockedExchangeAdd(&var, (long) (val))
-#define ATOMIC_INC(var)                _InterlockedIncrement(&var)
-#define ATOMIC_SUB(var, val)   _InterlockedExchangeAdd(&var, -(long) (val))
-#define ATOMIC_DEC(var)                _InterlockedDecrement(&var)
-#pragma intrinsic(_InterlockedExchangeAdd)
-#pragma intrinsic(_InterlockedIncrement)
-#pragma intrinsic(_InterlockedDecrement)
-#endif
-#define ATOMIC_START(lock, func)
-#define ATOMIC_END(lock, func)
-#define ATOMIC_INIT(lock, func)
-#define ATOMIC_COMP_SWAP(var, old, new, lock, func)    \
-       _InterlockedCompareExchange(&var, new, old)
-#pragma intrinsic(_InterlockedCompareExchange)
-#define ATOMIC_GET(var, lock, func)    var
-#elif defined(__GNUC__) || defined(__INTEL_COMPILER)
-#if SIZEOF_SSIZE_T == SIZEOF_LONG_LONG
-#define ATOMIC_TYPE            long long
-#else
-#define ATOMIC_TYPE            long
-#endif
-#define ATOMIC_ADD(var, val)   __sync_fetch_and_add(&var, (ATOMIC_TYPE) (val))
-#define ATOMIC_INC(var)                __sync_add_and_fetch(&var, 
(ATOMIC_TYPE) 1)
-#define ATOMIC_SUB(var, val)   __sync_fetch_and_sub(&var, (ATOMIC_TYPE) (val))
-#define ATOMIC_DEC(var)                __sync_sub_and_fetch(&var, 
(ATOMIC_TYPE) 1)
-#define ATOMIC_START(lock, func)
-#define ATOMIC_END(lock, func)
-#define ATOMIC_INIT(lock, func)
-#define ATOMIC_COMP_SWAP(var, old, new, lock, func)    \
-       __sync_val_compare_and_swap(&var, old, new)
-#define ATOMIC_GET(var, lock, func)    var
-#else
-#define ATOMIC_LOCK            PTHREAD_MUTEX_INITIALIZER /* must use locks */
-#define ATOMIC_TYPE            ssize_t
-#define ATOMIC_ADD(var, val)   var += (ssize_t) (val)
-#define ATOMIC_INC(var)                var++
-#define ATOMIC_SUB(var, val)   var -= (ssize_t) (val)
-#define ATOMIC_DEC(var)                var--
-#define ATOMIC_START(lock, func)       MT_lock_set(&lock, func)
-#define ATOMIC_END(lock, func) MT_lock_unset(&lock, func)
-#define ATOMIC_INIT(lock, func)        MT_lock_init(&lock, func)
-static inline int
-atomic_comp_swap(volatile int *var, int old, int new, MT_Lock *lock, const 
char *func)
+
+static inline sht
+__ATOMIC_GET_sht(volatile sht *var, MT_Lock *lck, const char *fcn)
 {
-       int orig;
-       MT_lock_set(lock, func);
+       sht old;
+       MT_lock_set(lck, fcn);
+       old = *var;
+       MT_lock_unset(lck, fcn);
+       return old;
+}
+#define ATOMIC_GET_sht(var, lck, fcn)  __ATOMIC_GET_sht(&var, &lck, fcn)
+
+static inline sht
+__ATOMIC_SET_sht(volatile sht *var, sht val, MT_Lock *lck, const char *fcn)
+{
+       sht new;
+       MT_lock_set(lck, fcn);
+       *var = val;
+       new = *var;
+       MT_lock_unset(lck, fcn);
+       return new;
+}
+#define ATOMIC_SET_sht(var, val, lck, fcn)     __ATOMIC_SET_sht(&var, (val), 
&lck, fcn)
+
+static inline sht
+__ATOMIC_INC_sht(volatile sht *var, MT_Lock *lck, const char *fcn)
+{
+       sht new;
+       MT_lock_set(lck, fcn);
+       new = ++*var;
+       MT_lock_unset(lck, fcn);
+       return new;
+}
+#define ATOMIC_INC_sht(var, lck, fcn)          __ATOMIC_INC_sht(&var, &lck, 
fcn)
+
+static inline sht
+__ATOMIC_DEC_sht(volatile sht *var, MT_Lock *lck, const char *fcn)
+{
+       sht new;
+       MT_lock_set(lck, fcn);
+       new = --*var;
+       MT_lock_unset(lck, fcn);
+       return new;
+}
+#define ATOMIC_DEC_sht(var, lck, fcn)          __ATOMIC_DEC_sht(&var, &lck, 
fcn)
+
+static inline sht
+__ATOMIC_CAS_sht(volatile sht *var, sht old, sht new, MT_Lock *lck, const char 
*fcn)
+{
+       sht orig;
+       MT_lock_set(lck, fcn);
        orig = *var;
        if (*var == old)
                *var = new;
-       MT_lock_unset(lock, func);
+       MT_lock_unset(lck, fcn);
        return orig;
 }
-#define ATOMIC_COMP_SWAP(var, old, new, lock, func)    \
-       atomic_comp_swap(&var, old, new, &lock, func)
+#define ATOMIC_CAS_sht(var, old, new, lck, fcn)        __ATOMIC_CAS_sht(&var, 
(old), (new), &lck, fcn)
+
+
 static inline int
-atomic_get(volatile int *var, MT_Lock *lock, const char *func)
+__ATOMIC_GET_int(volatile int *var, MT_Lock *lck, const char *fcn)
+{
+       int old;
+       MT_lock_set(lck, fcn);
+       old = *var;
+       MT_lock_unset(lck, fcn);
+       return old;
+}
+#define ATOMIC_GET_int(var, lck, fcn)  __ATOMIC_GET_int(&var, &lck, fcn)
+
+static inline int
+__ATOMIC_SET_int(volatile int *var, int val, MT_Lock *lck, const char *fcn)
+{
+       int new;
+       MT_lock_set(lck, fcn);
+       *var = val;
+       new = *var;
+       MT_lock_unset(lck, fcn);
+       return new;
+}
+#define ATOMIC_SET_int(var, val, lck, fcn)     __ATOMIC_SET_int(&var, (val), 
&lck, fcn)
+
+static inline int
+__ATOMIC_ADD_int(volatile int *var, int val, MT_Lock *lck, const char *fcn)
+{
+       int old;
+       MT_lock_set(lck, fcn);
+       old = *var;
+       *var += val;
+       MT_lock_unset(lck, fcn);
+       return old;
+}
+#define ATOMIC_ADD_int(var, val, lck, fcn)     __ATOMIC_ADD_int(&var, (val), 
&lck, fcn)
+
+static inline int
+__ATOMIC_SUB_int(volatile int *var, int val, MT_Lock *lck, const char *fcn)
+{
+       int old;
+       MT_lock_set(lck, fcn);
+       old = *var;
+       *var -= val;
+       MT_lock_unset(lck, fcn);
+       return old;
+}
+#define ATOMIC_SUB_int(var, val, lck, fcn)     __ATOMIC_SUB_int(&var, (val), 
&lck, fcn)
+
+static inline int
+__ATOMIC_INC_int(volatile int *var, MT_Lock *lck, const char *fcn)
+{
+       int new;
+       MT_lock_set(lck, fcn);
+       new = ++*var;
+       MT_lock_unset(lck, fcn);
+       return new;
+}
+#define ATOMIC_INC_int(var, lck, fcn)          __ATOMIC_INC_int(&var, &lck, 
fcn)
+
+static inline int
+__ATOMIC_DEC_int(volatile int *var, MT_Lock *lck, const char *fcn)
+{
+       int new;
+       MT_lock_set(lck, fcn);
+       new = --*var;
+       MT_lock_unset(lck, fcn);
+       return new;
+}
+#define ATOMIC_DEC_int(var, lck, fcn)          __ATOMIC_DEC_int(&var, &lck, 
fcn)
+
+static inline int
+__ATOMIC_CAS_int(volatile int *var, int old, int new, MT_Lock *lck, const char 
*fcn)
 {
        int orig;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to