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