Changeset: 77f32fe1e0bf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/77f32fe1e0bf
Modified Files:
        gdk/gdk.h
        gdk/gdk_bbp.c
        sql/backends/monet5/sql.c
Branch: strheapvacuum
Log Message:

refactor register callback api


diffs (191 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2386,7 +2386,6 @@ typedef struct gdk_callback {
        int interval;  // units sec
        lng last_called; // timestamp GDKusec
        gdk_return (*func)(int argc, void *argv[]);
-       gdk_return (*argsfree)(int argc, void *argv[]);
        struct gdk_callback *next;
        void *argv[FLEXIBLE_ARRAY_MEMBER];
 } gdk_callback;
@@ -2397,7 +2396,11 @@ typedef struct gdk_callback_list {
        gdk_callback *head;
 } gdk_callback_list;
 
-int gdk_add_callback(gdk_callback *);
-int gdk_remove_callback(char *);
+typedef gdk_return callback_func(int argc, void *argv[]);
+typedef void callback_args_free_func(int argc, void *argv[]);
+
+gdk_return gdk_add_callback(char *name, callback_func *f, int argc, void
+               *argv[], int interval);
+gdk_return gdk_remove_callback(char *, callback_args_free_func *f);
 
 #endif /* _GDK_H_ */
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1394,6 +1394,7 @@ BBPmanager(void *dummy)
                }
                BBPtrim(false);
                BBPcallbacks();
+               MT_sleep_ms(1000);
                if (GDKexiting())
                        return;
        }
@@ -4251,17 +4252,37 @@ static gdk_callback_list callback_list =
  * Adds new callback to the callback list.
  * Returns the count of the callbacks in the callback_list.
  */
-int
-gdk_add_callback(gdk_callback *callback)
+gdk_return
+gdk_add_callback(char *name, callback_func *f, int argc, void *argv[], int
+               interval)
 {
+
+       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!");
+               return GDK_FAIL;
+       }
+
+       *callback = (gdk_callback) {
+               .name = name,
+               .argc = argc,
+               .interval = interval,
+               .func = f,
+       };
+
+       for (int i=0; i < argc; i++) {
+               callback->argv[i] = argv[i];
+       }
+
        MT_lock_set(&(callback_list.lock));
        if (p) {
                int cnt = 1;
                do {
                        // check if already added
                        if (strcmp(callback->name, p->name) == 0)
-                               return callback_list.cnt;
+                               return GDK_FAIL;
                        if (p->next == NULL) {
                                p->next = callback;
                                p = callback->next;
@@ -4276,7 +4297,7 @@ gdk_add_callback(gdk_callback *callback)
                callback_list.head = callback;
        }
        MT_lock_unset(&(callback_list.lock));
-       return callback_list.cnt;
+       return GDK_SUCCEED;
 }
 
 /*
@@ -4284,11 +4305,12 @@ gdk_add_callback(gdk_callback *callback)
  * Removes a callback from the callback list with a given name as an argument.
  * Returns the count of the callbacks in the callback_list.
  */
-int
-gdk_remove_callback(char *cb_name)
+gdk_return
+gdk_remove_callback(char *cb_name, callback_args_free_func *argsfree)
 {
        gdk_callback *curr = callback_list.head;
        gdk_callback *prev = NULL;
+       gdk_return res = GDK_FAIL;
        while(curr) {
                if (strcmp(cb_name, curr->name) == 0) {
                        MT_lock_set(&(callback_list.lock));
@@ -4297,18 +4319,19 @@ gdk_remove_callback(char *cb_name)
                        } else {
                                prev->next = curr->next;
                        }
-                       if (curr->argsfree)
-                               curr->argsfree(curr->argc, curr->argv);
+                       if (argsfree)
+                               argsfree(curr->argc, curr->argv);
                        GDKfree(curr);
                        curr = NULL;
                        callback_list.cnt -=1;
+                       res = GDK_SUCCEED;
                        MT_lock_unset(&(callback_list.lock));
                } else {
                        prev = curr;
                        curr = curr->next;
                }
        }
-       return callback_list.cnt;
+       return res;
 }
 
 static gdk_return
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -5133,13 +5133,22 @@ str_column_vacuum_callback(int argc, voi
        return res;
 }
 
+static void
+str_column_vacuum_callback_args_free(int argc, void *argv[])
+{
+       assert(argc == 4);
+       // free up sname, tname, cname
+       GDKfree(argv[1]);
+       GDKfree(argv[2]);
+       GDKfree(argv[3]);
+}
 
 str
 SQLstr_column_auto_vacuum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci)
 {
        mvc *m = NULL;
        str msg = NULL;
-       gdk_callback *callback = NULL;
+       // gdk_callback *callback = NULL;
        char *sname = *getArgReference_str(stk, pci, 1);
        char *tname = *getArgReference_str(stk, pci, 2);
        char *cname = *getArgReference_str(stk, pci, 3);
@@ -5160,23 +5169,14 @@ SQLstr_column_auto_vacuum(Client cntxt, 
                throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42S02) 
"Invalid or missing table %s.%s",sname,tname);
        if ((c = mvc_bind_column(m, t, cname)) == NULL)
                throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42S22) 
"Column not found %s.%s",sname,tname);
-       // register callback
-       if (!(callback = GDKmalloc(sizeof(gdk_callback) + sizeof(void *) * 4)))
-               return createException(SQL, "sql.str_column_auto_vacuum", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       *callback = (gdk_callback) {
-               .name = "str_column_vacuum",
-               .argc = 4,
-               .interval = (int) interval,
-               .func = str_column_vacuum_callback,
-       };
-
-       if (!(*callback->argv = GDKmalloc(sizeof(void *[callback->argc]))))
-               return createException(SQL, "sql.str_column_auto_vacuum", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       callback->argv[0] = m->store;
-       callback->argv[1] = strdup(sname);
-       callback->argv[2] = strdup(tname);
-       callback->argv[3] = strdup(cname);
-       gdk_add_callback(callback);
+
+       void *argv[4] = {m->store, strdup(sname), strdup(tname), strdup(cname)};
+
+       gdk_return res;
+       if((res = gdk_add_callback("str_column_vacuum", 
str_column_vacuum_callback, 4, argv, interval)) != GDK_SUCCEED) {
+               str_column_vacuum_callback_args_free(4, argv);
+               throw(SQL, "sql.str_column_auto_vacuum", "adding vacuum 
callback failed!");
+       }
 
        // TODO REMOVE test the callback
        // callback->func(callback->argc, callback->argv);
@@ -5185,6 +5185,7 @@ SQLstr_column_auto_vacuum(Client cntxt, 
 }
 
 
+
 #include "wlr.h"
 #include "sql_cat.h"
 #include "sql_rank.h"
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to