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]