Changeset: 28230e499272 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/28230e499272
Modified Files:
        gdk/gdk.h
        gdk/gdk_bbp.c
        gdk/gdk_private.h
        gdk/gdk_system.c
        gdk/gdk_system_private.h
        gdk/gdk_utils.c
Branch: default
Log Message:

Move freebats info to mtthread.


diffs (165 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1989,8 +1989,6 @@ typedef struct threadStruct {
                                 * into this array + 1 (0 is
                                 * invalid) */
        ATOMIC_TYPE pid;        /* thread id, 0 = unallocated */
-       bat freebats;           /* linked list of free bats */
-       uint32_t nfreebats;     /* number of free bats in .freebats */
 } *Thread;
 
 
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2408,7 +2408,7 @@ BBPinsert(BAT *bn)
        char dirname[24];
        bat i;
        int len = 0;
-       Thread t = (Thread) MT_thread_getdata();
+       struct freebats *t = MT_thread_getfreebats();
 
        if (t->freebats == 0) {
                /* critical section: get a new BBP entry */
@@ -2563,7 +2563,7 @@ BBPuncacheit(bat i, bool unloaddesc)
  * BBPclear removes a BAT from the BBP directory forever.
  */
 static inline void
-BBPhandover(Thread t, uint32_t n)
+BBPhandover(struct freebats *t, uint32_t n)
 {
        bat *p, bid;
        /* take one bat from our private free list and hand it over to
@@ -2611,7 +2611,7 @@ printlist(bat bid)
 static inline void
 bbpclear(bat i, bool lock)
 {
-       Thread t = (Thread) MT_thread_getdata();
+       struct freebats *t = MT_thread_getfreebats();
 
        TRC_DEBUG(BAT_, "clear %d (%s)\n", (int) i, BBP_logical(i));
        BBPuncacheit(i, true);
@@ -2660,8 +2660,10 @@ BBPclear(bat i)
 }
 
 void
-BBPrelinquish(Thread t)
+BBPrelinquish(void)
 {
+       struct freebats *t = MT_thread_getfreebats();
+
        if (t->nfreebats == 0)
                return;
        MT_lock_set(&GDKcacheLock);
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -115,7 +115,7 @@ bat BBPinsert(BAT *bn)
        __attribute__((__visibility__("hidden")));
 void BBPprintinfo(void)
        __attribute__((__visibility__("hidden")));
-void BBPrelinquish(Thread t)
+void BBPrelinquish(void)
        __attribute__((__visibility__("hidden")));
 int BBPselectfarm(role_t role, int type, enum heaptype hptype)
        __attribute__((__visibility__("hidden")));
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -207,6 +207,7 @@ static struct mtthread {
        MT_Id tid;
        uintptr_t sp;
        char *errbuf;
+       struct freebats freebats;
 } *mtthreads = NULL;
 struct mtthread mainthread = {
        .threadname = "main thread",
@@ -457,6 +458,17 @@ GDKgetbuf(void)
        return self->errbuf;
 }
 
+struct freebats *
+MT_thread_getfreebats(void)
+{
+       struct mtthread *self;
+
+       self = thread_self();
+       if (self == NULL)
+               self = &mainthread;
+       return &self->freebats;
+}
+
 void
 MT_thread_setdata(void *data)
 {
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
@@ -38,3 +38,10 @@ Thread THRnew(MT_Id pid)
                SetLastError(0);                                        \
        } while (0)
 #endif
+
+struct freebats {
+       bat freebats;
+       uint32_t nfreebats;
+};
+struct freebats *MT_thread_getfreebats(void)
+       __attribute__((__visibility__("hidden")));
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1299,6 +1299,8 @@ GDKreset(int status)
        if (status == 0) {
                /* they had their chance, now kill them */
                bool killed = MT_kill_threads();
+               for (int i = 0; i < THREADS; i++)
+                       ATOMIC_SET(&GDKthreads[i].pid, 0);
                /* all threads ceased running, now we can clean up */
                if (!killed) {
                        /* we can't clean up after killing threads */
@@ -1618,11 +1620,7 @@ THRnew(MT_Id pid)
                ATOMIC_BASE_TYPE npid = 0;
                if (ATOMIC_CAS(&s->pid, &npid, pid)) {
                        /* successfully allocated, fill in rest */
-                       s->freebats = 0;
-                       s->nfreebats = 0;
-                       TRC_DEBUG(PAR, "%d %zu\n",
-                                 s->tid,
-                                 (size_t) ATOMIC_GET(&s->pid));
+                       TRC_DEBUG(PAR, "%d %zu\n", s->tid, (size_t) pid);
                        TRC_DEBUG(PAR, "Number of threads: %d\n",
                                  (int) ATOMIC_GET(&GDKnrofthreads) + 1);
                        ATOMIC_INC(&GDKnrofthreads);
@@ -1701,7 +1699,7 @@ void
 THRdel(Thread t)
 {
        assert(GDKthreads <= t && t < GDKthreads + THREADS);
-       BBPrelinquish(t);
+       BBPrelinquish();
        MT_thread_setdata(NULL);
        TRC_DEBUG(PAR, "pid = %zu, disconnected, %d left\n",
                  (size_t) ATOMIC_GET(&t->pid),
@@ -1711,11 +1709,6 @@ THRdel(Thread t)
        ATOMIC_DEC(&GDKnrofthreads);
 }
 
-/*
- * I/O is organized per thread, because users may gain access through
- * the network.  The code below should be improved to gain speed.
- */
-
 static int
 THRinit(void)
 {
@@ -1748,6 +1741,9 @@ THRinit(void)
                return -1;
        }
        MT_thread_setdata(s);
+       struct freebats *t = MT_thread_getfreebats();
+       t->freebats = 0;
+       t->nfreebats = 0;
        return 0;
 }
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to