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

Reply via email to