Changeset: eec805a73f5b for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=eec805a73f5b Modified Files: monetdb5/mal/mal_client.h monetdb5/mal/mal_private.h monetdb5/mal/mal_profiler.c monetdb5/mal/mal_session.c monetdb5/modules/mal/mal_mapi.c sql/server/rel_optimizer.c Branch: sfcgal Log Message:
merged with default diffs (260 lines): diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h --- a/monetdb5/mal/mal_client.h +++ b/monetdb5/mal/mal_client.h @@ -18,10 +18,12 @@ #define CONSOLE 0 #define isAdministrator(X) (X==mal_clients) -#define FREECLIENT 0 -#define FINISHCLIENT 1 -#define RUNCLIENT 2 -#define BLOCKCLIENT 3 +enum clientmode { + FREECLIENT, + FINISHCLIENT, + RUNCLIENT, + BLOCKCLIENT +}; #define PROCESSTIMEOUT 2 /* seconds */ @@ -125,7 +127,7 @@ typedef struct CLIENT { int debug; void *mdb; /* context upon suspend */ str history; /* where to keep console history */ - short mode; /* FREECLIENT..BLOCKED */ + enum clientmode mode; /* FREECLIENT..BLOCKED */ /* * Client records are organized into a two-level dependency tree, * where children may be created to deal with parallel processing diff --git a/monetdb5/mal/mal_private.h b/monetdb5/mal/mal_private.h --- a/monetdb5/mal/mal_private.h +++ b/monetdb5/mal/mal_private.h @@ -12,8 +12,8 @@ #error this file should not be included outside its source directory #endif -#ifdef FREECLIENT -/* FREECLIENT is defined in the same file as Client */ +#ifdef _MAL_CLIENT_H_ +/* _MAL_CLIENT_H_ is defined in the same file as Client */ __hidden void MCexitClient(Client c) __attribute__((__visibility__("hidden"))); __hidden int MCreadClient(Client c) diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c --- a/monetdb5/mal/mal_profiler.c +++ b/monetdb5/mal/mal_profiler.c @@ -786,19 +786,19 @@ clearTrace(void) return; /* not initialized */ } /* drop all trace tables */ - BBPunfix(TRACE_id_event->batCacheid); - BBPunfix(TRACE_id_time->batCacheid); - BBPunfix(TRACE_id_pc->batCacheid); - BBPunfix(TRACE_id_thread->batCacheid); - BBPunfix(TRACE_id_ticks->batCacheid); - BBPunfix(TRACE_id_rssMB->batCacheid); - BBPunfix(TRACE_id_tmpspace->batCacheid); - BBPunfix(TRACE_id_inblock->batCacheid); - BBPunfix(TRACE_id_oublock->batCacheid); - BBPunfix(TRACE_id_minflt->batCacheid); - BBPunfix(TRACE_id_majflt->batCacheid); - BBPunfix(TRACE_id_nvcsw->batCacheid); - BBPunfix(TRACE_id_stmt->batCacheid); + BBPclear(TRACE_id_event->batCacheid); + BBPclear(TRACE_id_time->batCacheid); + BBPclear(TRACE_id_pc->batCacheid); + BBPclear(TRACE_id_thread->batCacheid); + BBPclear(TRACE_id_ticks->batCacheid); + BBPclear(TRACE_id_rssMB->batCacheid); + BBPclear(TRACE_id_tmpspace->batCacheid); + BBPclear(TRACE_id_inblock->batCacheid); + BBPclear(TRACE_id_oublock->batCacheid); + BBPclear(TRACE_id_minflt->batCacheid); + BBPclear(TRACE_id_majflt->batCacheid); + BBPclear(TRACE_id_nvcsw->batCacheid); + BBPclear(TRACE_id_stmt->batCacheid); TRACE_init = 0; MT_lock_unset(&mal_contextLock); initTrace(); diff --git a/monetdb5/mal/mal_session.c b/monetdb5/mal/mal_session.c --- a/monetdb5/mal/mal_session.c +++ b/monetdb5/mal/mal_session.c @@ -137,10 +137,9 @@ exit_streams( bstream *fin, stream *fout { if (fout && fout != GDKstdout) { mnstr_flush(fout); - mnstr_close(fout); - mnstr_destroy(fout); + close_stream(fout); } - if (fin) + if (fin) (void) bstream_destroy(fin); } @@ -422,7 +421,7 @@ MSserveClient(void *dummy) c->glb = newGlobalStack(MAXGLOBALS + mb->vsize); if (c->glb == NULL) { showException(c->fdout, MAL, "serveClient", MAL_MALLOC_FAIL); - c->mode = FINISHCLIENT + 1; /* == RUNCLIENT */ + c->mode = RUNCLIENT; } else { c->glb->stktop = mb->vtop; c->glb->blk = mb; @@ -432,7 +431,7 @@ MSserveClient(void *dummy) msg = defaultScenario(c); if (msg) { showException(c->fdout, MAL, "serveClient", "could not initialize default scenario"); - c->mode = FINISHCLIENT + 1; /* == RUNCLIENT */ + c->mode = RUNCLIENT; GDKfree(msg); } else { do { diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c --- a/monetdb5/modules/mal/mal_mapi.c +++ b/monetdb5/modules/mal/mal_mapi.c @@ -117,26 +117,27 @@ doChallenge(void *data) stream *fdin = block_stream(((struct challengedata *) data)->in); stream *fdout = block_stream(((struct challengedata *) data)->out); bstream *bs; - int len = 0; + ssize_t len = 0; #ifdef _MSC_VER srand((unsigned int) GDKusec()); #endif - GDKfree(data); if (buf == NULL || fdin == NULL || fdout == NULL){ - if (fdin) { - mnstr_close(fdin); - mnstr_destroy(fdin); - } - if (fdout) { - mnstr_close(fdout); - mnstr_destroy(fdout); - } + if (fdin) + close_stream(fdin); + else + close_stream(((struct challengedata *) data)->in); + if (fdout) + close_stream(fdout); + else + close_stream(((struct challengedata *) data)->out); + GDKfree(data); if (buf) GDKfree(buf); GDKsyserror("SERVERlisten:"MAL_MALLOC_FAIL); return; } + GDKfree(data); /* generate the challenge string */ generateChallenge(challenge, 8, 12); @@ -155,12 +156,10 @@ doChallenge(void *data) free(algos); mnstr_flush(fdout); /* get response */ - if ((len = (int) mnstr_read_block(fdin, buf, 1, BLOCK)) < 0) { - /* the client must have gone away, so no reason to write something */ - mnstr_close(fdin); - mnstr_destroy(fdin); - mnstr_close(fdout); - mnstr_destroy(fdout); + if ((len = mnstr_read_block(fdin, buf, 1, BLOCK)) < 0) { + /* the client must have gone away, so no reason to write anything */ + close_stream(fdin); + close_stream(fdout); GDKfree(buf); return; } @@ -175,16 +174,9 @@ doChallenge(void *data) bs = bstream_create(fdin, 128 * BLOCK); if (bs == NULL){ - if (fdin) { - mnstr_close(fdin); - mnstr_destroy(fdin); - } - if (fdout) { - mnstr_close(fdout); - mnstr_destroy(fdout); - } - if (buf) - GDKfree(buf); + close_stream(fdin); + close_stream(fdout); + GDKfree(buf); GDKsyserror("SERVERlisten:"MAL_MALLOC_FAIL); return; } @@ -365,7 +357,7 @@ SERVERlistenThread(SOCKET *Sock) fflush(stdout); #endif data = GDKmalloc(sizeof(*data)); - if (!data) { + if (data == NULL) { closesocket(msgsock); showException(GDKstdout, MAL, "initClient", "cannot allocate memory"); @@ -373,13 +365,35 @@ SERVERlistenThread(SOCKET *Sock) } data->in = socket_rastream(msgsock, "Server read"); data->out = socket_wastream(msgsock, "Server write"); - if (MT_create_thread(&tid, doChallenge, data, MT_THR_JOINABLE)) { + if (data->in == NULL || data->out == NULL) { + if (data->out) { + /* send message if we can */ + mnstr_printf(data->out, + "!internal server error (cannot allocate " + "enough memory), please try again later\n"); + mnstr_flush(data->out); + } + showException(GDKstdout, MAL, "initClient", + "cannot allocate memory"); + closesocket(msgsock); + if (data->in) + mnstr_destroy(data->in); + if (data->out) + mnstr_destroy(data->out); + GDKfree(data); + continue; + } + if (MT_create_thread(&tid, doChallenge, data, MT_THR_JOINABLE) < 0) { mnstr_printf(data->out, "!internal server error (cannot fork new " "client thread), please try again later\n"); mnstr_flush(data->out); showException(GDKstdout, MAL, "initClient", "cannot fork new client thread"); + closesocket(msgsock); + mnstr_destroy(data->in); + mnstr_destroy(data->out); GDKfree(data); + continue; } GDKregister(tid); } while (!ATOMIC_GET(serverexiting, atomicLock) && diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -223,6 +223,8 @@ rel_properties(mvc *sql, global_props *g switch (rel->op) { case op_basetable: case op_table: + if (rel->op == op_table && rel->l) + rel_properties(sql, gp, rel->l); break; case op_join: case op_left: @@ -7839,6 +7841,10 @@ rewrite_topdown(mvc *sql, sql_rel *rel, switch (rel->op) { case op_basetable: case op_table: + if (rel->op == op_table && rel->l) + rel->l = rewrite(sql, rel->l, rewriter, has_changes); + if (rel->op == op_table && rel->l) + rel->l = rewrite_topdown(sql, rel->l, rewriter, has_changes); break; case op_join: case op_left: _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list