Changeset: 7324567896f0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7324567896f0
Modified Files:
        gdk/gdk_utils.c
        gdk/gdk_utils.h
        tools/embedded/embedded.c
Branch: embedded
Log Message:

gdkfatal workaround


diffs (139 lines):

diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1574,6 +1574,9 @@ GDKclrerr(void)
                *buf = 0;
 }
 
+jmp_buf GDKfataljump;
+str GDKfatalmsg;
+
 /* coverity[+kill] */
 void
 GDKfatal(const char *format, ...)
@@ -1595,12 +1598,13 @@ GDKfatal(const char *format, ...)
        vsnprintf(message + len, sizeof(message) - (len + 2), format, ap);
        va_end(ap);
 
+#ifndef HAVE_EMBEDDED
        fputs(message, stderr);
        fputs("\n", stderr);
        fflush(stderr);
 
        /*
-        * Real errors should be saved in the lock file for post-crash
+        * Real errors should be saved in the log file for post-crash
         * inspection.
         */
        if (GDKexiting()) {
@@ -1615,6 +1619,10 @@ GDKfatal(const char *format, ...)
                GDKexit(1);
 #endif
        }
+#else // in embedded mode, we really don't want to kill our host
+       GDKfatalmsg = GDKstrdup(message);
+    longjmp(GDKfataljump, 42);
+#endif
 }
 
 
diff --git a/gdk/gdk_utils.h b/gdk/gdk_utils.h
--- a/gdk/gdk_utils.h
+++ b/gdk/gdk_utils.h
@@ -10,6 +10,7 @@
 #define _GDK_UTILS_H_
 
 #include <monet_options.h>
+#include <setjmp.h>
 
 gdk_export BAT *GDKkey;
 gdk_export BAT *GDKval;
@@ -94,4 +95,8 @@ gdk_export const char *GDKversion(void);
 
 gdk_export int GDKextractParentAndLastDirFromPath(const char *path, char 
*last_dir_parent, char *last_dir);
 
+// these are used in embedded mode to jump out of GDKfatal
+gdk_export jmp_buf GDKfataljump;
+gdk_export str GDKfatalmsg;
+
 #endif /* _GDK_UTILS_H_ */
diff --git a/tools/embedded/embedded.c b/tools/embedded/embedded.c
--- a/tools/embedded/embedded.c
+++ b/tools/embedded/embedded.c
@@ -20,6 +20,7 @@
 #include "mal_linker.h"
 #include "msabaoth.h"
 #include "sql_scenario.h"
+#include "gdk_utils.h"
 
 typedef str (*SQLstatementIntern_ptr_tpe)(Client, str*, str, bit, bit, 
res_table**);
 SQLstatementIntern_ptr_tpe SQLstatementIntern_ptr = NULL;
@@ -63,6 +64,17 @@ int monetdb_startup(char* dir, char sile
        void* res = NULL;
        char mod_path[1000];
 
+       if(setjmp(GDKfataljump) != 0) {
+               // we will get here if GDKfatal was called.
+               if (GDKfatalmsg != NULL) {
+                       fputs(GDKfatalmsg, stderr);
+                       fputs("\n", stderr);
+                       GDKfree(GDKfatalmsg);
+               }
+               retval = -2;
+               goto cleanup;
+       }
+
        MT_lock_init(&monetdb_embedded_lock, "monetdb_embedded_lock");
        MT_lock_set(&monetdb_embedded_lock, "monetdb.startup");
        if (monetdb_embedded_initialized) goto cleanup;
@@ -70,7 +82,7 @@ int monetdb_startup(char* dir, char sile
        setlen = mo_builtin_settings(&set);
        setlen = mo_add_option(&set, setlen, opt_cmdline, "gdk_dbpath", dir);
        if (GDKinit(set, setlen) == 0) {
-               retval = -2;
+               retval = -3;
                goto cleanup;
        }
 
@@ -83,7 +95,7 @@ int monetdb_startup(char* dir, char sile
        if (silent) THRdata[0] = stream_blackhole_create();
        msab_dbpathinit(GDKgetenv("gdk_dbpath"));
        if (mal_init() != 0) {
-               retval = -3;
+               retval = -4;
                goto cleanup;
        }
        if (silent) mal_clients[0].fdout = THRdata[0];
@@ -106,7 +118,7 @@ int monetdb_startup(char* dir, char sile
                        res_table_destroy_ptr == NULL || mvc_append_wrap_ptr == 
NULL ||
                        mvc_bind_schema_ptr == NULL || mvc_bind_table_ptr == 
NULL ||
                        sqlcleanup_ptr == NULL || mvc_trans_ptr == NULL) {
-               retval = -4;
+               retval = -5;
                goto cleanup;
        }
        // call this, otherwise c->sqlcontext is empty
@@ -116,7 +128,7 @@ int monetdb_startup(char* dir, char sile
        // sanity check, run a SQL query
        if (monetdb_query("SELECT * FROM tables;", res) != NULL) {
                monetdb_embedded_initialized = false;
-               retval = -5;
+               retval = -6;
                goto cleanup;
        }
        retval = 0;
@@ -135,6 +147,14 @@ char* monetdb_query(char* query, void** 
                return NULL;
        }
 
+       if(setjmp(GDKfataljump) != 0) {
+               // we will get here if GDKfatal was called.
+               if (GDKfatalmsg == NULL) {
+                       return GDKstrdup("Fatal GDK error. This is bad. ");
+               }
+               return GDKfatalmsg;
+       }
+
        while (*query == ' ' || *query == '\t') query++;
        if (strncasecmp(query, "START", 5) == 0) { // START TRANSACTION
                m->session->auto_commit = 0;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to