Changeset: 87faa75fd59f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/87faa75fd59f
Modified Files:
clients/Tests/exports.stable.out
gdk/gdk.h
gdk/gdk_system.c
gdk/gdk_system.h
gdk/gdk_utils.c
monetdb5/mal/mal_client.c
monetdb5/mal/mal_dataflow.c
Branch: default
Log Message:
Thread cleanup: remote THRdata, change GDKstd{in,out}, GDKerrbuf definitions.
diffs (284 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -276,6 +276,7 @@ bit GDKfataljumpenable;
str GDKfatalmsg;
char *GDKfilepath(int farmid, const char *dir, const char *nme, const char
*ext);
void GDKfree(void *blk);
+char *GDKgetbuf(void);
unsigned GDKgetdebug(void);
const char *GDKgetenv(const char *name);
int GDKgetenv_int(const char *name, int def);
@@ -306,9 +307,12 @@ void GDKqsort(void *restrict h, void *re
void *GDKrealloc(void *pold, size_t size) __attribute__((__alloc_size__(2)))
__attribute__((__warn_unused_result__));
gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, BAT *st, void
**segment_tree, oid **levels_offset, oid *nlevels);
void GDKreset(int status);
+void GDKsetbuf(char *);
void GDKsetdebug(unsigned debug);
gdk_return GDKsetenv(const char *name, const char *value);
void GDKsetmallocsuccesscount(lng count);
+stream *GDKstdin;
+stream *GDKstdout;
ssize_t GDKstrFromStr(unsigned char *restrict dst, const unsigned char
*restrict src, ssize_t len, char quote);
str GDKstrdup(const char *s) __attribute__((__malloc__))
__attribute__((__warn_unused_result__));
str GDKstrndup(const char *s, size_t n) __attribute__((__malloc__))
__attribute__((__warn_unused_result__));
@@ -402,12 +406,9 @@ gdk_return STRMPcreate(BAT *b, BAT *s);
void STRMPdestroy(BAT *b);
BAT *STRMPfilter(BAT *b, BAT *s, const char *q, const bool keep_nils);
MT_Id THRcreate(void (*f)(void *), void *arg, enum MT_thr_detach d, const char
*name);
-void *THRdata[THREADDATA];
void THRdel(Thread t);
-void *THRgetdata(int);
int THRgettid(void);
bool THRhighwater(void);
-void THRsetdata(int, void *);
gdk_return TMsubcommit(BAT *bl) __attribute__((__warn_unused_result__));
gdk_return TMsubcommit_list(bat *restrict subcommit, BUN *restrict sizes, int
cnt, lng logno, lng transid) __attribute__((__warn_unused_result__));
void VALclear(ValPtr v);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1991,27 +1991,17 @@ typedef struct threadStruct {
ATOMIC_TYPE pid; /* thread id, 0 = unallocated */
bat freebats; /* linked list of free bats */
uint32_t nfreebats; /* number of free bats in .freebats */
- void *data[THREADDATA];
} *Thread;
gdk_export int THRgettid(void);
gdk_export MT_Id THRcreate(void (*f) (void *), void *arg, enum MT_thr_detach
d, const char *name);
gdk_export void THRdel(Thread t);
-gdk_export void THRsetdata(int, void *);
-gdk_export void *THRgetdata(int);
-gdk_export bool THRhighwater(void);
-
-gdk_export void *THRdata[THREADDATA];
-#define GDKstdout ((stream*)THRdata[0])
-#define GDKstdin ((stream*)THRdata[1])
+gdk_export stream *GDKstdout;
+gdk_export stream *GDKstdin;
-#define GDKerrbuf ((char*)THRgetdata(2))
-#define GDKsetbuf(x) THRsetdata(2,(void *)(x))
-
-#define THRget_errbuf(t) ((char*)t->data[2])
-#define THRset_errbuf(t,b) (t->data[2] = b)
+#define GDKerrbuf (GDKgetbuf())
static inline bat
BBPcheck(bat x)
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -206,6 +206,7 @@ static struct mtthread {
#endif
MT_Id tid;
uintptr_t sp;
+ char *errbuf;
} *mtthreads = NULL;
struct mtthread mainthread = {
.threadname = "main thread",
@@ -434,6 +435,29 @@ MT_thread_getname(void)
}
void
+GDKsetbuf(char *errbuf)
+{
+ struct mtthread *self;
+
+ self = thread_self();
+ if (self == NULL)
+ self = &mainthread;
+ assert(errbuf == NULL || self->errbuf == NULL);
+ self->errbuf = errbuf;
+}
+
+char *
+GDKgetbuf(void)
+{
+ struct mtthread *self;
+
+ self = thread_self();
+ if (self == NULL)
+ self = &mainthread;
+ return self->errbuf;
+}
+
+void
MT_thread_setdata(void *data)
{
if (!thread_initialized)
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -171,6 +171,7 @@ typedef struct QryCtx {
ATOMIC_BASE_TYPE maxmem;
} QryCtx;
+gdk_export bool THRhighwater(void);
gdk_export bool MT_thread_init(void);
gdk_export int MT_create_thread(MT_Id *t, void (*function) (void *),
void *arg, enum MT_thr_detach d,
@@ -185,6 +186,8 @@ gdk_export MT_Id MT_getpid(void);
gdk_export int MT_join_thread(MT_Id t);
gdk_export QryCtx *MT_thread_get_qry_ctx(void);
gdk_export void MT_thread_set_qry_ctx(QryCtx *ctx);
+gdk_export void GDKsetbuf(char *);
+gdk_export char *GDKgetbuf(void);
#if SIZEOF_VOID_P == 4
/* "limited" stack size on 32-bit systems */
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -1344,10 +1344,11 @@ GDKreset(int status)
GDKnr_threads = 0;
ATOMIC_SET(&GDKnrofthreads, 0);
- close_stream((stream *) THRdata[0]);
- close_stream((stream *) THRdata[1]);
+ close_stream(GDKstdout);
+ close_stream(GDKstdin);
+ GDKstdout = NULL;
+ GDKstdin = NULL;
- memset(THRdata, 0, sizeof(THRdata));
gdk_bbp_reset();
}
ATOMunknown_clean();
@@ -1601,7 +1602,8 @@ GDKms(void)
* descriptors are the same as for the server and should be
* subsequently reset.
*/
-void *THRdata[THREADDATA] = { 0 };
+stream *GDKstdout;
+stream *GDKstdin;
static inline Thread
GDK_find_self(void)
@@ -1616,8 +1618,6 @@ THRnew(MT_Id pid)
ATOMIC_BASE_TYPE npid = 0;
if (ATOMIC_CAS(&s->pid, &npid, pid)) {
/* successfully allocated, fill in rest */
- s->data[0] = THRdata[0];
- s->data[1] = THRdata[1];
s->freebats = 0;
s->nfreebats = 0;
TRC_DEBUG(PAR, "%d %zu\n",
@@ -1707,8 +1707,6 @@ THRdel(Thread t)
(size_t) ATOMIC_GET(&t->pid),
(int) ATOMIC_GET(&GDKnrofthreads));
- for (int i = 0; i < THREADDATA; i++)
- t->data[i] = NULL;
ATOMIC_SET(&t->pid, 0); /* deallocate */
ATOMIC_DEC(&GDKnrofthreads);
}
@@ -1724,14 +1722,14 @@ THRinit(void)
Thread s;
static bool first = true;
- if ((THRdata[0] = (void *) stdout_wastream()) == NULL) {
+ if ((GDKstdout = stdout_wastream()) == NULL) {
TRC_CRITICAL(GDK, "malloc for stdout failed\n");
return -1;
}
- if ((THRdata[1] = (void *) stdin_rastream()) == NULL) {
+ if ((GDKstdin = stdin_rastream()) == NULL) {
TRC_CRITICAL(GDK, "malloc for stdin failed\n");
- mnstr_destroy(THRdata[0]);
- THRdata[0] = NULL;
+ mnstr_destroy(GDKstdout);
+ GDKstdout = NULL;
return -1;
}
if (first) {
@@ -1743,39 +1741,16 @@ THRinit(void)
}
if ((s = THRnew(MT_getpid())) == NULL) {
TRC_CRITICAL(GDK, "THRnew failed\n");
- mnstr_destroy(THRdata[0]);
- THRdata[0] = NULL;
- mnstr_destroy(THRdata[1]);
- THRdata[1] = NULL;
+ mnstr_destroy(GDKstdout);
+ GDKstdout = NULL;
+ mnstr_destroy(GDKstdin);
+ GDKstdin = NULL;
return -1;
}
MT_thread_setdata(s);
return 0;
}
-void
-THRsetdata(int n, ptr val)
-{
- Thread s;
-
- s = GDK_find_self();
- if (s) {
- assert(val == NULL || s->data[n] == NULL);
- s->data[n] = val;
- }
-}
-
-void *
-THRgetdata(int n)
-{
- Thread s;
- void *d;
-
- s = GDK_find_self();
- d = s ? s->data[n] : THRdata[n];
- return d;
-}
-
int
THRgettid(void)
{
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -315,14 +315,10 @@ MCinitClient(oid user, bstream *fin, str
int
MCinitClientThread(Client c)
{
- Thread t = MT_thread_getdata();
-
/*
* The GDK thread administration should be set to reflect use of
* the proper IO descriptors.
*/
- t->data[1] = c->fdin;
- t->data[0] = c->fdout;
c->mythread = MT_thread_getname();
c->errbuf = GDKerrbuf;
if (c->errbuf == NULL) {
@@ -383,10 +379,10 @@ MCcloseClient(Client c)
if (c->errbuf) {
/* no client threads in embedded mode */
//if (!GDKembedded())
- GDKsetbuf(0);
+ GDKsetbuf(NULL);
if (c->father == NULL)
GDKfree(c->errbuf);
- c->errbuf = 0;
+ c->errbuf = NULL;
}
if (c->usermodule)
freeModule(c->usermodule);
diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c
--- a/monetdb5/mal/mal_dataflow.c
+++ b/monetdb5/mal/mal_dataflow.c
@@ -455,7 +455,7 @@ DFLOWworker(void *T)
assert(t->flag == WAITING);
}
GDKfree(GDKerrbuf);
- GDKsetbuf(0);
+ GDKsetbuf(NULL);
}
/*
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]