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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org