Changeset: 078c1b6f27f4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=078c1b6f27f4
Modified Files:
        monetdb5/mal/mal.c
        monetdb5/mal/mal_namespace.c
Branch: default
Log Message:

Avoid deadlocks
The mal_context locks was used in both mal_profiler
and mal_namespace, which could lead to a deadlock.


diffs (98 lines):

diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c
--- a/monetdb5/mal/mal.c
+++ b/monetdb5/mal/mal.c
@@ -190,12 +190,12 @@ size_t monet_memory;
 #include "mal_recycle.h"
 
 MT_Lock     mal_contextLock;
+MT_Lock     mal_namespaceLock;
 MT_Lock     mal_remoteLock;
 MT_Lock        mal_profileLock ;
 MT_Lock     mal_copyLock;
 MT_Lock     mal_delayLock;
 /*
- * @-
  * Initialization of the MAL context
  * The compiler directive STRUCT_ALIGNED tells that the
  * fields in the VALrecord all start at the same offset.
@@ -228,6 +228,7 @@ void tstAligned(void)
 }
 int mal_init(void){
        MT_lock_init( &mal_contextLock, "mal_contextLock");
+       MT_lock_init( &mal_namespaceLock, "mal_namespaceLock");
        MT_lock_init( &mal_remoteLock, "mal_remoteLock");
        MT_lock_init( &mal_profileLock, "mal_profileLock");
        MT_lock_init( &mal_copyLock, "mal_copyLock");
diff --git a/monetdb5/mal/mal_namespace.c b/monetdb5/mal/mal_namespace.c
--- a/monetdb5/mal/mal_namespace.c
+++ b/monetdb5/mal/mal_namespace.c
@@ -108,7 +108,7 @@ void initNamespace(void) {
 void finishNamespace(void) {
        int i;
 
-       MT_lock_set(&mal_contextLock, "putName");
+       MT_lock_set(&mal_namespaceLock, "putName");
        for(i=0;i<namespace.nmetop; i++) {
                if( namespace.nme[i])
                        GDKfree(namespace.nme[i]);
@@ -117,7 +117,7 @@ void finishNamespace(void) {
        GDKfree(namespace.nme); namespace.nme= 0;
        GDKfree(namespace.link); namespace.link= 0;
        GDKfree(namespace.length); namespace.length= 0;
-       MT_lock_unset(&mal_contextLock, "putName");
+       MT_lock_unset(&mal_namespaceLock, "putName");
 }
 
 /*
@@ -131,15 +131,15 @@ str getName(str nme, size_t len)
        size_t l;
        if(len == 0 || nme== NULL || *nme==0) return 0;
 
-       MT_lock_set(&mal_contextLock, "putName");
+       MT_lock_set(&mal_namespaceLock, "putName");
        for(l= NMEHASH(nme,len); l && namespace.nme[l]; l= namespace.link[l]){
                if (namespace.length[l] == len  &&
                        strncmp(nme,namespace.nme[l],len)==0) {
-                       MT_lock_unset(&mal_contextLock, "putName");
+                       MT_lock_unset(&mal_namespaceLock, "putName");
                        return namespace.nme[l];
            }
        }
-       MT_lock_unset(&mal_contextLock, "putName");
+       MT_lock_unset(&mal_namespaceLock, "putName");
        return 0;
 }
 /*
@@ -157,8 +157,8 @@ void delName(str nme, size_t len){
        if( nme[0]==0 || n == 0) return ;
 
        /*Namespace garbage collection not available yet 
-       MT_lock_set(&mal_contextLock, "putName");
-       MT_lock_unset(&mal_contextLock, "putName");
+       MT_lock_set(&mal_namespaceLock, "putName");
+       MT_lock_unset(&mal_namespaceLock, "putName");
        */
 }
 str putName(str nme, size_t len)
@@ -169,11 +169,11 @@ str putName(str nme, size_t len)
        if( nme == NULL || len == 0)
                return NULL;
        /* protect this, as it will be updated by multiple threads */
-       MT_lock_set(&mal_contextLock, "putName");
+       MT_lock_set(&mal_namespaceLock, "putName");
        for(l= NMEHASH(nme,len); l && namespace.nme[l]; l= namespace.link[l]){
            if( namespace.length[l] == len  &&
                        strncmp(nme,namespace.nme[l],len) == 0 ) {
-                       MT_lock_unset(&mal_contextLock, "putName");
+                       MT_lock_unset(&mal_namespaceLock, "putName");
                        return namespace.nme[l];
            }
        }
@@ -193,6 +193,6 @@ str putName(str nme, size_t len)
                namespace.link[l] = (int)top;
        namespace.length[top]= len;
        namespace.nmetop++;
-       MT_lock_unset(&mal_contextLock, "putName");
+       MT_lock_unset(&mal_namespaceLock, "putName");
        return putName(nme, len);       /* just to be sure */
 }
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to