Changeset: 3277ea9bc090 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3277ea9bc090
Modified Files:
gdk/gdk_system.h
gdk/gdk_utils.c
monetdb5/extras/rapi/rapi.c
sql/backends/monet5/UDF/pyapi/pyapi.c
sql/backends/monet5/vaults/lidar/lidar.c
Branch: Jul2017
Log Message:
Make sure locks are initialized only once.
diffs (154 lines):
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -209,8 +209,11 @@ gdk_export ATOMIC_TYPE volatile GDKlocks
/* SQL storage allocator, and hence we have no control */ \
/* over when the lock is destroyed and the memory freed */ \
if (strncmp((n), "sa_", 3) != 0) { \
+ MT_Lock * volatile _p; \
while (ATOMIC_TAS(GDKlocklistlock, dummy) != 0) \
; \
+ for (_p = GDKlocklist; _p; _p = _p->next) \
+ assert(_p != (l)); \
(l)->next = GDKlocklist; \
GDKlocklist = (l); \
ATOMIC_CLEAR(GDKlocklistlock, dummy); \
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -700,6 +700,7 @@ GDKreset(int status, int exit)
Thread t, s;
struct serverthread *st;
int farmid;
+ int i;
if( GDKkey){
BBPunfix(GDKkey->batCacheid);
@@ -788,8 +789,16 @@ GDKreset(int status, int exit)
GDKnrofthreads = 0;
close_stream((stream *) THRdata[0]);
close_stream((stream *) THRdata[1]);
- memset((char*) GDKbatLock,0, sizeof(GDKbatLock));
- memset((char*) GDKbbpLock,0,sizeof(GDKbbpLock));
+ for (i = 0; i <= BBP_BATMASK; i++) {
+ MT_lock_destroy(&GDKbatLock[i].swap);
+ MT_lock_destroy(&GDKbatLock[i].hash);
+ MT_lock_destroy(&GDKbatLock[i].imprints);
+ }
+ for (i = 0; i <= BBP_THREADMASK; i++) {
+ MT_lock_destroy(&GDKbbpLock[i].alloc);
+ MT_lock_destroy(&GDKbbpLock[i].trim);
+ GDKbbpLock[i].free = 0;
+ }
memset((char*) GDKthreads, 0, sizeof(GDKthreads));
memset((char*) THRdata, 0, sizeof(THRdata));
@@ -798,6 +807,19 @@ GDKreset(int status, int exit)
MT_lock_unset(&GDKthreadLock);
//gdk_system_reset(); CHECK OUT
}
+#ifdef NEED_MT_LOCK_INIT
+ MT_lock_destroy(&MT_system_lock);
+#if defined(USE_PTHREAD_LOCKS) && defined(ATOMIC_LOCK)
+ MT_lock_destroy(&GDKstoppedLock);
+ MT_lock_destroy(&mbyteslock);
+#endif
+ MT_lock_destroy(&GDKnameLock);
+ MT_lock_destroy(&GDKthreadLock);
+ MT_lock_destroy(&GDKtmLock);
+#ifndef NDEBUG
+ MT_lock_destroy(&mallocsuccesslock);
+#endif
+#endif
#ifndef HAVE_EMBEDDED
if (exit) {
MT_global_exit(status);
diff --git a/monetdb5/extras/rapi/rapi.c b/monetdb5/extras/rapi/rapi.c
--- a/monetdb5/extras/rapi/rapi.c
+++ b/monetdb5/extras/rapi/rapi.c
@@ -57,7 +57,7 @@ int RAPIEnabled(void) {
}
// The R-environment should be single threaded, calling for some protective
measures.
-static MT_Lock rapiLock;
+static MT_Lock rapiLock MT_LOCK_INITIALIZER("rapiLock");
static int rapiInitialized = FALSE;
static char* rtypenames[] = { "NIL", "SYM", "LIST", "CLO", "ENV", "PROM",
"LANG", "SPECIAL", "BUILTIN", "CHAR", "LGL", "unknown",
"unknown",
@@ -511,8 +511,14 @@ void* RAPIloopback(void *query) {
str RAPIprelude(void *ret) {
+#ifdef NEED_MT_LOCK_INIT
+ static int initialized = 0;
+ /* since we don't destroy the lock, only initialize it once */
+ if (!initialized)
+ MT_lock_init(&rapiLock, "rapi_lock");
+ initialized = 1;
+#endif
(void) ret;
- MT_lock_init(&rapiLock, "rapi_lock");
if (RAPIEnabled()) {
MT_lock_set(&rapiLock);
diff --git a/sql/backends/monet5/UDF/pyapi/pyapi.c
b/sql/backends/monet5/UDF/pyapi/pyapi.c
--- a/sql/backends/monet5/UDF/pyapi/pyapi.c
+++ b/sql/backends/monet5/UDF/pyapi/pyapi.c
@@ -68,8 +68,8 @@ static char *FunctionBasePath(void)
return basepath;
}
-static MT_Lock pyapiLock;
-static MT_Lock queryLock;
+static MT_Lock pyapiLock MT_LOCK_INITIALIZER("pyapiLock");
+static MT_Lock queryLock MT_LOCK_INITIALIZER("queryLock");
static int pyapiInitialized = FALSE;
int PYFUNCNAME(PyAPIInitialized)(void) {
@@ -1300,9 +1300,16 @@ wrapup:
str
PYFUNCNAME(PyAPIprelude)(void *ret) {
+#ifdef NEED_MT_LOCK_INIT
+ static int initialized = 0;
+ /* since we don't destroy the lock, only initialize it once */
+ if (!initialized) {
+ MT_lock_init(&pyapiLock, "pyapi_lock");
+ MT_lock_init(&queryLock, "query_lock");
+ }
+ initialized = 1;
+#endif
(void) ret;
- MT_lock_init(&pyapiLock, "pyapi_lock");
- MT_lock_init(&queryLock, "query_lock");
MT_lock_set(&pyapiLock);
if (!pyapiInitialized) {
#ifdef IS_PY3K
diff --git a/sql/backends/monet5/vaults/lidar/lidar.c
b/sql/backends/monet5/vaults/lidar/lidar.c
--- a/sql/backends/monet5/vaults/lidar/lidar.c
+++ b/sql/backends/monet5/vaults/lidar/lidar.c
@@ -36,7 +36,7 @@
#define DEL_TABLE "DELETE FROM lidarfiles;"
#define ATTACHDIR "CALL lidarattach('%s');"
-static MT_Lock mt_lidar_lock;
+static MT_Lock mt_lidar_lock MT_LOCK_INITIALIZER("mt_lidar_lock");
#ifndef NDEBUG
static
@@ -1076,8 +1076,14 @@ str LIDARloadTable(Client cntxt, MalBlkP
str
LIDARprelude(void *ret) {
+#ifdef NEED_MT_LOCK_INIT
+ static int initialized = 0;
+ /* since we don't destroy the lock, only initialize it once */
+ if (!initialized)
+ MT_lock_init(&mt_lidar_lock, "lidar.lock");
+ initialized = 1;
+#endif
(void) ret;
- MT_lock_init(&mt_lidar_lock, "lidar.lock");
return MAL_SUCCEED;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list