Changeset: 9e52f69914de for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9e52f69914de
Added Files:
gdk/gdk_atomic.h
Modified Files:
gdk/Makefile.ag
gdk/gdk_utils.c
Branch: Feb2013
Log Message:
Move atomic definitions into separate include file.
diffs (252 lines):
diff --git a/gdk/Makefile.ag b/gdk/Makefile.ag
--- a/gdk/Makefile.ag
+++ b/gdk/Makefile.ag
@@ -23,7 +23,7 @@ lib_gdk = {
VERSION = $(GDK_VERSION)
NAME = bat
SOURCES = \
- gdk.h gdk_batop.c gdk_select.c \
+ gdk.h gdk_atomic.h gdk_batop.c gdk_select.c \
gdk_search.c gdk_search.h gdk_tm.c \
gdk_align.c gdk_bbp.c gdk_bbp.h \
gdk_heap.c gdk_setop.mx gdk_utils.c gdk_utils.h \
diff --git a/gdk/gdk_atomic.h b/gdk/gdk_atomic.h
new file mode 100644
--- /dev/null
+++ b/gdk/gdk_atomic.h
@@ -0,0 +1,102 @@
+/*
+ * The contents of this file are subject to the MonetDB Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.monetdb.org/Legal/MonetDBLicense
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * The Original Code is the MonetDB Database System.
+ *
+ * The Initial Developer of the Original Code is CWI.
+ * Portions created by CWI are Copyright (C) 1997-July 2008 CWI.
+ * Copyright August 2008-2013 MonetDB B.V.
+ * All Rights Reserved.
+ */
+
+#ifndef _GDK_ATOMIC_H_
+#define _GDK_ATOMIC_H_
+
+#if defined(__GNUC__)
+#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
+#elif 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)
+#pragma intrinsic(_InterlockedExchangeAdd64)
+#pragma intrinsic(_InterlockedIncrement64)
+#pragma intrinsic(_InterlockedDecrement64)
+#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
+#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)
+{
+ int orig;
+ MT_lock_set(lock, func);
+ orig = *var;
+ if (*var == old)
+ *var = new;
+ MT_lock_unset(lock, func);
+ return orig;
+}
+#define ATOMIC_COMP_SWAP(var, old, new, lock, func) \
+ atomic_comp_swap(&var, old, new, &lock, func)
+static inline int
+atomic_get(volatile int *var, MT_Lock *lock, const char *func)
+{
+ int orig;
+ MT_lock_set(lock, func);
+ orig = *var;
+ MT_lock_unset(lock, func);
+ return orig;
+}
+#define ATOMIC_GET(var, lock, func) atomic_get(&var, &lock, func)
+#endif
+
+#endif /* _GDK_ATOMIC_H_ */
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -317,123 +317,18 @@ int GDK_vm_trim = 1;
* the compiler) for both the GNU C compiler and Microsoft Visual
* Studio. By doing this, we avoid locking overhead. There is also a
* fall-back for other compilers. */
-#if defined(__GNUC__)
-#if SIZEOF_SSIZE_T == SIZEOF_LONG_LONG
-static volatile long long GDK_mallocedbytes_estimate = 0;
-static volatile long long GDK_vm_cursize = 0;
+#include "gdk_atomic.h"
+static volatile ATOMIC_TYPE GDK_mallocedbytes_estimate = 0;
+static volatile ATOMIC_TYPE GDK_vm_cursize = 0;
#ifdef GDK_VM_KEEPHISTO
-volatile long long GDK_vm_nallocs[MAX_BIT] = { 0 };
+volatile ATOMIC_TYPE GDK_vm_nallocs[MAX_BIT] = { 0 };
#endif
#ifdef GDK_MEM_KEEPHISTO
-volatile long long GDK_nmallocs[MAX_BIT] = { 0 };
+volatile ATOMIC_TYPE GDK_nmallocs[MAX_BIT] = { 0 };
#endif
-#define ATOMIC_ADD(var, val) __sync_add_and_fetch(&var, (long long) (val))
-#define ATOMIC_INC(var) __sync_add_and_fetch(&var, (long long)
1)
-#define ATOMIC_SUB(var, val) __sync_sub_and_fetch(&var, (long long) (val))
-#define ATOMIC_DEC(var) __sync_sub_and_fetch(&var, (long long)
1)
-#else
-static volatile long GDK_mallocedbytes_estimate = 0;
-static volatile long GDK_vm_cursize = 0;
-#ifdef GDK_VM_KEEPHISTO
-volatile long GDK_vm_nallocs[MAX_BIT] = { 0 };
-#endif
-#ifdef GDK_MEM_KEEPHISTO
-volatile long GDK_nmallocs[MAX_BIT] = { 0 };
-#endif
-#define ATOMIC_ADD(var, val) __sync_add_and_fetch(&var, (long) (val))
-#define ATOMIC_INC(var) __sync_add_and_fetch(&var, (long) 1)
-#define ATOMIC_SUB(var, val) __sync_sub_and_fetch(&var, (long) (val))
-#define ATOMIC_DEC(var) __sync_sub_and_fetch(&var, (long) 1)
-#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) \
- __sync_val_compare_and_swap(&var, old, new)
-#define ATOMIC_GET(var, lock, func) var
-#elif defined(_MSC_VER)
-#include <intrin.h>
-#if SIZEOF_SSIZE_T == SIZEOF___INT64
-static volatile __int64 GDK_mallocedbytes_estimate = 0;
-static volatile __int64 GDK_vm_cursize = 0;
-#ifdef GDK_VM_KEEPHISTO
-volatile __int64 GDK_vm_nallocs[MAX_BIT] = { 0 };
-#endif
-#ifdef GDK_MEM_KEEPHISTO
-volatile __int64 GDK_nmallocs[MAX_BIT] = { 0 };
-#endif
-#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)
-#pragma intrinsic(_InterlockedExchangeAdd64)
-#pragma intrinsic(_InterlockedIncrement64)
-#pragma intrinsic(_InterlockedDecrement64)
-#else
-static volatile long GDK_mallocedbytes_estimate = 0;
-static volatile long GDK_vm_cursize = 0;
-#ifdef GDK_VM_KEEPHISTO
-volatile long GDK_vm_nallocs[MAX_BIT] = { 0 };
-#endif
-#ifdef GDK_MEM_KEEPHISTO
-volatile long GDK_nmallocs[MAX_BIT] = { 0 };
-#endif
-#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
-#else
-static volatile ssize_t GDK_mallocedbytes_estimate = 0;
-static volatile ssize_t GDK_vm_cursize = 0;
-#ifdef GDK_VM_KEEPHISTO
-volatile ssize_t GDK_vm_nallocs[MAX_BIT] = { 0 };
-#endif
-#ifdef GDK_MEM_KEEPHISTO
-volatile ssize_t GDK_nmallocs[MAX_BIT] = { 0 };
-#endif
+#ifdef ATOMIC_LOCK
static MT_Lock mbyteslock;
static MT_Lock GDKstoppedLock;
-#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)
-{
- int orig;
- MT_lock_set(lock, func);
- orig = *var;
- if (*var == old)
- *var = new;
- MT_lock_unset(lock, func);
- return orig;
-}
-#define ATOMIC_COMP_SWAP(var, old, new, lock, func) \
- atomic_comp_swap(&var, old, new, &lock, func)
-static inline int
-atomic_get(volatile int *var, MT_Lock *lock, const char *func)
-{
- int orig;
- MT_lock_set(lock, func);
- orig = *var;
- MT_lock_unset(lock, func);
- return orig;
-}
-#define ATOMIC_GET(var, lock, func) atomic_get(&var, &lock, func)
#endif
size_t _MT_pagesize = 0; /* variable holding memory size */
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list