Changeset: a61ae7e30676 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a61ae7e30676
Modified Files:
        gdk/gdk_system.c
        gdk/gdk_system.h
        monetdb5/extras/pyapi/pyapi.c
Branch: pyapi
Log Message:

To prevent deadlocks in forked processes set # of threads to 1 and ignore locks 
and semaphores.


diffs (101 lines):

diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -55,6 +55,8 @@
 
 #include <unistd.h>            /* for sysconf symbols */
 
+int forked_process = 0;
+
 MT_Lock MT_system_lock MT_LOCK_INITIALIZER("MT_system_lock");
 
 #if !defined(USE_PTHREAD_LOCKS) && !defined(NDEBUG)
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -126,14 +126,15 @@ typedef struct {
 #define MT_lock_destroy(l)     pthread_mutex_destroy(&(l)->lock)
 #define MT_lock_set(l, n)                                              \
        do {                                                            \
-               TEMDEBUG fprintf(stderr, "#%s: locking %s...\n",        \
-                                (n), (l)->name);                       \
+               if (forked_process) break;    \
+               TEMDEBUG fprintf(stderr, "#%s: locking %s...\n",        (n), 
(l)->name);                \
                pthread_mutex_lock(&(l)->lock);                         \
-               TEMDEBUG fprintf(stderr, "#%s: locking %s complete\n",  \
+               if (forked_process) fprintf(stderr, "#%s: locking %s 
complete\n",       \
                                 (n), (l)->name);                       \
        } while (0)
 #define MT_lock_unset(l, n)                                            \
        do {                                                            \
+               if (forked_process) break;                 \
                TEMDEBUG fprintf(stderr, "#%s: unlocking %s\n",         \
                                 (n), (l)->name);                       \
                pthread_mutex_unlock(&(l)->lock);                       \
@@ -256,8 +257,11 @@ gdk_export ATOMIC_TYPE volatile GDKlocks
 
 #endif
 
+extern int forked_process;
+
 #define MT_lock_set(l, n)                                              \
        do {                                                            \
+               if (forked_process) break; \
                _DBG_LOCK_COUNT_0(l, n);                                \
                if (ATOMIC_TAS((l)->lock, dummy, n) != 0) {             \
                        /* we didn't get the lock */                    \
@@ -334,16 +338,16 @@ typedef struct {
 #define MT_sema_destroy(s)     pthread_sema_destroy(&(s)->sema)
 #define MT_sema_up(s, n)                                       \
        do {                                                    \
-               TEMDEBUG fprintf(stderr, "#%s: sema %s up\n",   \
-                                (n), (s)->name);               \
+               if (forked_process) break;            \
+               TEMDEBUG fprintf(stderr, "#%s: sema %s up\n", (n), (s)->name);  
        \
                pthread_sema_up(&(s)->sema);                    \
        } while (0)
 #define MT_sema_down(s, n)                                             \
        do {                                                            \
-               TEMDEBUG fprintf(stderr, "#%s: sema %s down...\n",      \
-                                (n), (s)->name);                       \
+               if (forked_process) break;                    \
+               TEMDEBUG fprintf(stderr, "#%s: sema %s down...\n",(n), 
(s)->name);              \
                pthread_sema_down(&(s)->sema);                          \
-               TEMDEBUG fprintf(stderr, "#%s: sema %s down complete\n", \
+               if (forked_process) fprintf(stderr, "#%s: sema %s down 
complete\n", \
                                 (n), (s)->name);                       \
        } while (0)
 
diff --git a/monetdb5/extras/pyapi/pyapi.c b/monetdb5/extras/pyapi/pyapi.c
--- a/monetdb5/extras/pyapi/pyapi.c
+++ b/monetdb5/extras/pyapi/pyapi.c
@@ -15,6 +15,7 @@
 #include "sql_catalog.h"
 #include "pyapi.h"
 #include "connection.h"
+#include "mal_dataflow.h"
 
 // Python library
 #undef _GNU_SOURCE
@@ -555,6 +556,8 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
         }
         else if (pid == 0)
         {
+            forked_process = 1;
+            GDKnr_threads = 1;
             child_process = true;
 #ifdef _PYAPI_TESTING_
             if (!disable_testing && !option_disablemalloctracking && 
benchmark_output != NULL) { init_hook(); }
@@ -566,11 +569,11 @@ str PyAPIeval(Client cntxt, MalBlkPtr mb
             //main process
             int status;
             bool success = true;
-
             //wait for child processes
             MT_lock_unset(&pyapiLock, "pyapi.evaluate");
 
             waitpid(pid, &status, 0);
+
             if (status != 0)
                 success = false;
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to