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