Changeset: 8b5c802e24b4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8b5c802e24b4
Modified Files:
gdk/gdk_utils.c
gdk/gdk_utils.h
tools/embedded/embedded.c
Branch: embedded
Log Message:
Only do jumping games if initializing. Otherwise, cross-thread jumps happen and
those are very naughty
diffs (114 lines):
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1576,6 +1576,7 @@ GDKclrerr(void)
jmp_buf GDKfataljump;
str GDKfatalmsg;
+bit GDKfataljumpenable = 0;
/* coverity[+kill] */
void
@@ -1598,31 +1599,31 @@ 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);
+ if (!GDKfataljumpenable) {
+ fputs(message, stderr);
+ fputs("\n", stderr);
+ fflush(stderr);
- /*
- * Real errors should be saved in the log file for post-crash
- * inspection.
- */
- if (GDKexiting()) {
- fflush(stdout);
- MT_exit_thread(1);
- /* exit(1); */
- } else {
- GDKlog("%s", message);
-#ifdef COREDUMP
- abort();
-#else
- GDKexit(1);
-#endif
+ /*
+ * Real errors should be saved in the log file for post-crash
+ * inspection.
+ */
+ if (GDKexiting()) {
+ fflush(stdout);
+ MT_exit_thread(1);
+ /* exit(1); */
+ } else {
+ GDKlog("%s", message);
+ #ifdef COREDUMP
+ abort();
+ #else
+ GDKexit(1);
+ #endif
+ }
+ } else { // in embedded mode, we really don't want to kill our host
+ GDKfatalmsg = GDKstrdup(message);
+ longjmp(GDKfataljump, 42);
}
-#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
@@ -98,5 +98,7 @@ gdk_export gdk_return GDKextractParentAn
// these are used in embedded mode to jump out of GDKfatal
gdk_export jmp_buf GDKfataljump;
gdk_export str GDKfatalmsg;
+gdk_export bit GDKfataljumpenable;
+
#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
@@ -63,7 +63,7 @@ int monetdb_startup(char* dir, char sile
int retval = -1;
void* res = NULL;
char mod_path[1000];
-
+ GDKfataljumpenable = 1;
if(setjmp(GDKfataljump) != 0) {
// we will get here if GDKfatal was called.
if (GDKfatalmsg != NULL) {
@@ -125,6 +125,9 @@ int monetdb_startup(char* dir, char sile
(*SQLinitClient_ptr)(&mal_clients[0]);
((backend *) mal_clients[0].sqlcontext)->mvc->session->auto_commit = 1;
monetdb_embedded_initialized = true;
+
+ GDKfataljumpenable = 0;
+
// sanity check, run a SQL query
if (monetdb_query("SELECT * FROM tables;", res) != NULL) {
monetdb_embedded_initialized = false;
@@ -147,14 +150,6 @@ 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