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