Changeset: 9e0a4ebebf3d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9e0a4ebebf3d
Modified Files:
        gdk/gdk_bbp.c
Branch: default
Log Message:

Put all accesses to callback_list inside the lock.


diffs (60 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -4431,7 +4431,6 @@ gdk_add_callback(char *name, gdk_callbac
 {
 
        gdk_callback *callback = NULL;
-       gdk_callback *p = callback_list.head;
 
        if (!(callback = GDKmalloc(sizeof(gdk_callback) + sizeof(void *) * 
argc))) {
                TRC_CRITICAL(GDK, "Failed to allocate memory!");
@@ -4450,6 +4449,7 @@ gdk_add_callback(char *name, gdk_callbac
        }
 
        MT_lock_set(&GDKCallbackListLock);
+       gdk_callback *p = callback_list.head;
        if (p) {
                int cnt = 1;
                do {
@@ -4483,12 +4483,13 @@ gdk_add_callback(char *name, gdk_callbac
 gdk_return
 gdk_remove_callback(char *cb_name, gdk_callback_func *argsfree)
 {
-       gdk_callback *curr = callback_list.head;
        gdk_callback *prev = NULL;
        gdk_return res = GDK_FAIL;
+
+       MT_lock_set(&GDKCallbackListLock);
+       gdk_callback *curr = callback_list.head;
        while(curr) {
                if (strcmp(cb_name, curr->name) == 0) {
-                       MT_lock_set(&GDKCallbackListLock);
                        if (curr == callback_list.head && prev == NULL) {
                                callback_list.head = curr->next;
                        } else {
@@ -4500,12 +4501,12 @@ gdk_remove_callback(char *cb_name, gdk_c
                        curr = NULL;
                        callback_list.cnt -=1;
                        res = GDK_SUCCEED;
-                       MT_lock_unset(&GDKCallbackListLock);
                } else {
                        prev = curr;
                        curr = curr->next;
                }
        }
+       MT_lock_unset(&GDKCallbackListLock);
        return res;
 }
 
@@ -4529,9 +4530,9 @@ should_call(gdk_callback *cb)
 static void
 BBPcallbacks(void)
 {
+       MT_lock_set(&GDKCallbackListLock);
        gdk_callback *next = callback_list.head;
 
-       MT_lock_set(&GDKCallbackListLock);
        while (next) {
                if(should_call(next))
                        do_callback(next);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to