Changeset: c2b7ecc6bea5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c2b7ecc6bea5
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_private.h
        gdk/gdk_system.c
        gdk/gdk_utils.c
Branch: default
Log Message:

Improve hot restart.
The shutdown test started crashing.  This has been fixed.


diffs (236 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -3530,9 +3530,8 @@ gdk_bbp_reset(void)
                BBPlimit -= BBPINIT;
                assert(BBPlimit >= 0);
                GDKfree(BBP[BBPlimit >> BBPINITLOG]);
+               BBP[BBPlimit >> BBPINITLOG] = NULL;
        }
-       memset(BBP, 0, sizeof(BBP));
-       BBPlimit = 0;
        ATOMIC_SET(&BBPsize, 0);
        for (i = 0; i < MAXFARMS; i++)
                GDKfree((void *) BBPfarms[i].dirname); /* loose "const" */
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -160,8 +160,6 @@ void BBPdump(void)          /* never called: for
 __hidden gdk_return GDKssort(void *restrict h, void *restrict t, const void 
*restrict base, size_t n, int hs, int ts, int tpe)
        __attribute__((__warn_unused_result__))
        __attribute__((__visibility__("hidden")));
-__hidden void gdk_system_reset(void)
-       __attribute__((__visibility__("hidden")));
 __hidden gdk_return GDKunlink(int farmid, const char *dir, const char *nme, 
const char *extension)
        __attribute__((__visibility__("hidden")));
 __hidden void HASHfree(BAT *b)
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -285,15 +285,6 @@ MT_thread_getdata(void)
        return w ? w->data : NULL;
 }
 
-void
-gdk_system_reset(void)
-{
-       assert(threadslot != TLS_OUT_OF_INDEXES);
-       TlsFree(threadslot);
-       threadslot = TLS_OUT_OF_INDEXES;
-       DeleteCriticalSection(&winthread_cs);
-}
-
 static void
 rm_winthread(struct winthread *w)
 {
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -436,11 +436,11 @@ GDKsetverbose(int verbose)
 gdk_return
 GDKinit(opt *set, int setlen)
 {
+       static bool first = true;
        char *dbpath = mo_find_option(set, setlen, "gdk_dbpath");
        const char *p;
        opt *n;
        int i, nlen = 0;
-       int farmid;
        char buf[16];
 
        /* some sanity checks (should also find if symbols are not defined) */
@@ -467,32 +467,39 @@ GDKinit(opt *set, int setlen)
        static_assert(SIZEOF_OID == SIZEOF_INT || SIZEOF_OID == SIZEOF_LNG,
                      "SIZEOF_OID should be equal to SIZEOF_INT or SIZEOF_LNG");
 
-       if (!MT_thread_init())
-               return GDK_FAIL;
+       if (first) {
+               /* some things are really only initialized once */
+               if (!MT_thread_init())
+                       return GDK_FAIL;
 
-       for (i = 0; i <= BBP_BATMASK; i++) {
-               char name[16];
-               snprintf(name, sizeof(name), "GDKswapLock%d", i);
-               MT_lock_init(&GDKbatLock[i].swap, name);
-               snprintf(name, sizeof(name), "GDKhashLock%d", i);
-               MT_lock_init(&GDKbatLock[i].hash, name);
-               snprintf(name, sizeof(name), "GDKimpsLock%d", i);
-               MT_lock_init(&GDKbatLock[i].imprints, name);
-       }
-       for (i = 0; i <= BBP_THREADMASK; i++) {
-               char name[16];
-               snprintf(name, sizeof(name), "GDKcacheLock%d", i);
-               MT_lock_init(&GDKbbpLock[i].cache, name);
-               snprintf(name, sizeof(name), "GDKtrimLock%d", i);
-               MT_lock_init(&GDKbbpLock[i].trim, name);
-               GDKbbpLock[i].free = 0;
+               for (i = 0; i <= BBP_BATMASK; i++) {
+                       char name[16];
+                       snprintf(name, sizeof(name), "GDKswapLock%d", i);
+                       MT_lock_init(&GDKbatLock[i].swap, name);
+                       snprintf(name, sizeof(name), "GDKhashLock%d", i);
+                       MT_lock_init(&GDKbatLock[i].hash, name);
+                       snprintf(name, sizeof(name), "GDKimpsLock%d", i);
+                       MT_lock_init(&GDKbatLock[i].imprints, name);
+               }
+               for (i = 0; i <= BBP_THREADMASK; i++) {
+                       char name[16];
+                       snprintf(name, sizeof(name), "GDKcacheLock%d", i);
+                       MT_lock_init(&GDKbbpLock[i].cache, name);
+                       snprintf(name, sizeof(name), "GDKtrimLock%d", i);
+                       MT_lock_init(&GDKbbpLock[i].trim, name);
+                       GDKbbpLock[i].free = 0;
+               }
+               if (mnstr_init() < 0)
+                       return GDK_FAIL;
+               first = false;
+       } else {
+               /* BBP was locked by BBPexit() */
+               BBPunlock();
        }
        errno = 0;
        if (!GDKenvironment(dbpath))
                return GDK_FAIL;
 
-       if (mnstr_init() < 0)
-               return GDK_FAIL;
        MT_init_posix();
        if (THRinit() < 0)
                return GDK_FAIL;
@@ -511,14 +518,13 @@ GDKinit(opt *set, int setlen)
 
        /* now try to lock the database: go through all farms, and if
         * we see a new directory, lock it */
-       for (farmid = 0; farmid < MAXFARMS; farmid++) {
+       for (int farmid = 0; farmid < MAXFARMS; farmid++) {
                if (BBPfarms[farmid].dirname != NULL) {
-                       int skip = 0;
-                       int j;
-                       for (j = 0; j < farmid; j++) {
+                       bool skip = false;
+                       for (int j = 0; j < farmid; j++) {
                                if (BBPfarms[j].dirname != NULL &&
                                    strcmp(BBPfarms[farmid].dirname, 
BBPfarms[j].dirname) == 0) {
-                                       skip = 1;
+                                       skip = true;
                                        break;
                                }
                        }
@@ -543,15 +549,14 @@ GDKinit(opt *set, int setlen)
                return GDK_FAIL;
 
        for (i = 0; i < setlen; i++) {
-               int done = 0;
-               int j;
+               bool done = false;
 
-               for (j = 0; j < nlen; j++) {
+               for (int j = 0; j < nlen; j++) {
                        if (strcmp(n[j].name, set[i].name) == 0) {
                                if (n[j].kind < set[i].kind) {
                                        n[j] = set[i];
                                }
-                               done = 1;
+                               done = true;
                                break;
                        }
                }
@@ -750,9 +755,17 @@ GDKreset(int status)
                GDKval = NULL;
        }
 
-       /* GDKprepareExit() must have been called at this point since
-        * GDKstopped is set, so the serverthread list must be
-        * empty */
+       MT_lock_set(&GDKthreadLock);
+       while (serverthread != NULL) {
+               struct serverthread *st = serverthread;
+               serverthread = st->next;
+               MT_lock_unset(&GDKthreadLock);
+               MT_join_thread(st->pid);
+               GDKfree(st);
+               MT_lock_set(&GDKthreadLock);
+       }
+       MT_lock_unset(&GDKthreadLock);
+       join_detached_threads();
 
        if (status == 0) {
                /* they had their chance, now kill them */
@@ -819,21 +832,13 @@ GDKreset(int status)
                ATOMIC_SET(&GDKnrofthreads, 0);
                close_stream((stream *) THRdata[0]);
                close_stream((stream *) THRdata[1]);
-               for (int i = 0; i <= BBP_BATMASK; i++) {
-                       MT_lock_destroy(&GDKbatLock[i].swap);
-                       MT_lock_destroy(&GDKbatLock[i].hash);
-                       MT_lock_destroy(&GDKbatLock[i].imprints);
-               }
                for (int i = 0; i <= BBP_THREADMASK; i++) {
-                       MT_lock_destroy(&GDKbbpLock[i].cache);
-                       MT_lock_destroy(&GDKbbpLock[i].trim);
                        GDKbbpLock[i].free = 0;
                }
 
                memset(THRdata, 0, sizeof(THRdata));
                gdk_bbp_reset();
                MT_lock_unset(&GDKthreadLock);
-               //gdk_system_reset(); CHECK OUT
        }
        ATOMunknown_clean();
 }
@@ -1442,6 +1447,9 @@ THRdel(Thread t)
 
        GDKfree(t->name);
        t->name = NULL;
+       for (int i = 0; i < THREADDATA; i++)
+               t->data[i] = NULL;
+       t->sp = 0;
        ATOMIC_SET(&t->pid, 0); /* deallocate */
        (void) ATOMIC_DEC(&GDKnrofthreads);
 }
@@ -1474,6 +1482,7 @@ THRinit(void)
 {
        int i = 0;
        Thread s;
+       static bool first = true;
 
        if ((THRdata[0] = (void *) file_wastream(stdout, "stdout")) == NULL)
                return -1;
@@ -1482,9 +1491,12 @@ THRinit(void)
                THRdata[0] = NULL;
                return -1;
        }
-       for (i = 0; i < THREADS; i++) {
-               GDKthreads[i].tid = i + 1;
-               ATOMIC_INIT(&GDKthreads[i].pid, 0);
+       if (first) {
+               for (i = 0; i < THREADS; i++) {
+                       GDKthreads[i].tid = i + 1;
+                       ATOMIC_INIT(&GDKthreads[i].pid, 0);
+               }
+               first = false;
        }
        if ((s = THRnew("main thread", MT_getpid())) == NULL) {
                mnstr_destroy(THRdata[0]);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to