Changeset: 67dbd1ca0e08 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=67dbd1ca0e08
Modified Files:
        gdk/gdk_system.c
        gdk/gdk_system_private.h
        gdk/gdk_utils.c
        monetdb5/modules/mal/mal_mapi.c
Branch: Jun2016
Log Message:

Start thread serving client as detached thread.
When started as joinable and registered thread, we only join at server
exit, causing a limit in the number of times we can fork off a thread
(and also a massive use of memory).


diffs (94 lines):

diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -497,6 +497,30 @@ join_threads(void)
        pthread_mutex_unlock(&posthread_lock);
 }
 
+void
+join_detached_threads(void)
+{
+       struct posthread *p;
+       int waited;
+       pthread_t tid;
+
+       pthread_mutex_lock(&posthread_lock);
+       do {
+               waited = 0;
+               for (p = posthreads; p; p = p->next) {
+                       tid = p->tid;
+                       rm_posthread_locked(p);
+                       free(p);
+                       pthread_mutex_unlock(&posthread_lock);
+                       pthread_join(tid, NULL);
+                       pthread_mutex_lock(&posthread_lock);
+                       waited = 1;
+                       break;
+               }
+       } while (waited);
+       pthread_mutex_unlock(&posthread_lock);
+}
+
 int
 MT_create_thread(MT_Id *t, void (*f) (void *), void *arg, enum MT_thr_detach d)
 {
diff --git a/gdk/gdk_system_private.h b/gdk/gdk_system_private.h
--- a/gdk/gdk_system_private.h
+++ b/gdk/gdk_system_private.h
@@ -12,6 +12,8 @@
 #error this file should not be included outside its source directory
 #endif
 
+__hidden void join_detached_threads(void)
+       __attribute__((__visibility__("hidden")));
 __declspec(noreturn) void MT_exit_thread(int status)
        __attribute__((__noreturn__));
 __hidden void MT_global_exit(int status)
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -749,6 +749,7 @@ GDKreset(int status)
                GDKfree(st);
        }
        MT_lock_unset(&GDKthreadLock);
+       join_detached_threads();
 
        if (status == 0) {
                /* they had their chance, now kill them */
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -392,7 +392,7 @@ SERVERlistenThread(SOCKET *Sock)
                                                  "cannot allocate stream");
                        continue;
                }
-               if (MT_create_thread(&tid, doChallenge, data, MT_THR_JOINABLE)) 
{
+               if (MT_create_thread(&tid, doChallenge, data, MT_THR_DETACHED)) 
{
                        mnstr_destroy(data->in);
                        mnstr_destroy(data->out);
                        GDKfree(data);
@@ -401,7 +401,6 @@ SERVERlistenThread(SOCKET *Sock)
                                                  "cannot fork new client 
thread");
                        continue;
                }
-               GDKregister(tid);
        } while (!ATOMIC_GET(serverexiting, atomicLock) &&
                         !GDKexiting());
        (void) ATOMIC_DEC(nlistener, atomicLock);
@@ -789,7 +788,7 @@ SERVERclient(void *res, const Stream *In
                throw(MAL,"serverClient",MAL_MALLOC_FAIL);
        data->in = *In;
        data->out = *Out;
-       if (MT_create_thread(&tid, doChallenge, data, MT_THR_JOINABLE)) {
+       if (MT_create_thread(&tid, doChallenge, data, MT_THR_DETACHED)) {
                mnstr_printf(data->out, "!internal server error (cannot fork 
new "
                                         "client thread), please try again 
later\n");
                mnstr_flush(data->out);
@@ -797,7 +796,6 @@ SERVERclient(void *res, const Stream *In
                                          "cannot fork new client thread");
                free(data);
        }
-       GDKregister(tid);
        return MAL_SUCCEED;
 }
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to