Changeset: ac2d5733bb10 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ac2d5733bb10 Modified Files: sql/backends/monet5/sql_cquery.c sql/storage/store.c Branch: trails Log Message:
Compilation fixes and defensive lines. diffs (151 lines): diff --git a/sql/backends/monet5/sql_cquery.c b/sql/backends/monet5/sql_cquery.c --- a/sql/backends/monet5/sql_cquery.c +++ b/sql/backends/monet5/sql_cquery.c @@ -444,7 +444,8 @@ CQregister(Client cntxt, MalBlkPtr mb, M backend *be = (backend *) cntxt->sqlcontext; mvc* sqlcontext; const char* err_message = "procedure"; - int i, j, is_function = 0, cycles = DEFAULT_CP_CYCLES, idx, ttlen; + int i, j, is_function = 0, cycles = DEFAULT_CP_CYCLES, idx; + size_t ttlen = 0; lng heartbeats = DEFAULT_CP_HEARTBEAT, startat = 0; (void) stk; @@ -739,7 +740,7 @@ str CQpause(str alias, int which) { int idx = 0; - str msg = MAL_SUCCEED; + str msg = MAL_SUCCEED, this_alias = NULL; const char* err_message = (which & mod_continuous_function) ? "function" : "procedure"; MT_Id myID = MT_getpid(); @@ -757,15 +758,18 @@ CQpause(str alias, int which) } // actually wait if the query was running if(myID != cq_pid) { - while( pnet[idx].status == CQRUNNING ){ + this_alias = pnet[idx].alias; //the CQ might get removed during the sleep calls, so we have to make this check + while( idx < pnettop && this_alias == pnet[idx].alias && pnet[idx].status == CQRUNNING ){ MT_lock_unset(&ttrLock); MT_sleep_ms(5); MT_lock_set(&ttrLock); - if( pnet[idx].status == CQWAIT) + if( idx >= pnettop || pnet[idx].status == CQWAIT) break; } } - pnet[idx].status = CQPAUSE; + if(idx < pnettop && this_alias == pnet[idx].alias) { + pnet[idx].status = CQPAUSE; + } finish: MT_lock_unset(&ttrLock); @@ -775,7 +779,7 @@ finish: str CQpauseAll(void) { - str msg = MAL_SUCCEED; + str msg = MAL_SUCCEED, this_alias = NULL; int i; MT_Id myID = MT_getpid(); //mvc* smvc; @@ -788,15 +792,18 @@ CQpauseAll(void) MT_lock_set(&ttrLock); for(i = 0 ; i < pnettop; i++) { if(myID != cq_pid) { - while (pnet[i].status == CQRUNNING) { + this_alias = pnet[i].alias; + while (i < pnettop && this_alias == pnet[i].alias && pnet[i].status == CQRUNNING) { MT_lock_unset(&ttrLock); MT_sleep_ms(5); MT_lock_set(&ttrLock); - if (pnet[i].status == CQWAIT) + if (i >= pnettop && pnet[i].status == CQWAIT) break; } } - pnet[i].status = CQPAUSE; + if(i < pnettop && this_alias == pnet[i].alias) { + pnet[i].status = CQPAUSE; + } } MT_lock_unset(&ttrLock); return msg; @@ -962,7 +969,7 @@ str CQderegister(str alias, int which) { int idx = 0; - str msg = MAL_SUCCEED; + str msg = MAL_SUCCEED, this_alias = NULL; const char* err_message = (which & mod_continuous_function) ? "function" : "procedure"; MT_Id myID = MT_getpid(); @@ -975,13 +982,17 @@ CQderegister(str alias, int which) } if(myID != cq_pid) { pnet[idx].status = CQSTOP; + this_alias = pnet[idx].alias; MT_lock_unset(&ttrLock); // actually wait if the query was running - while (pnet[idx].status != CQDEREGISTER) { + // the CQ might get removed during the sleep calls, so we have to make this check + while (idx < pnettop && this_alias == pnet[idx].alias && pnet[idx].status != CQDEREGISTER) { MT_sleep_ms(5); } MT_lock_set(&ttrLock); - CQfree(idx); + if(idx < pnettop && this_alias == pnet[idx].alias) { + CQfree(idx); + } if( pnettop == 0) { pnstatus = CQSTOP; MT_lock_unset(&ttrLock); @@ -1003,7 +1014,7 @@ finish: str CQderegisterAll(void) { - str msg = MAL_SUCCEED; + str msg = MAL_SUCCEED, this_alias = NULL; int i; MT_Id myID = MT_getpid(); //mvc* smvc; @@ -1014,13 +1025,16 @@ CQderegisterAll(void) for(i = 0 ; i < pnettop; i++) { if(myID != cq_pid) { pnet[i].status = CQSTOP; + this_alias = pnet[i].alias; MT_lock_unset(&ttrLock); // actually wait if the query was running - while( pnet[i].status != CQDEREGISTER ){ + while(i < pnettop && this_alias == pnet[i].alias && pnet[i].status != CQDEREGISTER ){ MT_sleep_ms(5); } MT_lock_set(&ttrLock); - CQfree(i); + if(i < pnettop && this_alias == pnet[i].alias) { + CQfree(i); + } } else { pnet[i].status = CQDELETE; } diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -697,13 +697,11 @@ load_table(sql_trans *tr, sql_schema *s, if (isStream(t)) { streams_table_id = find_sql_column(streams, "table_id"); rs = table_funcs.rids_select(tr, streams_table_id, &t->base.id, &t->base.id, NULL); - for (rid = table_funcs.rids_next(rs); rid != oid_nil; rid = table_funcs.rids_next(rs)) { - sql_stream *st = load_sql_stream(tr, t, rid); - + if((rid = table_funcs.rids_next(rs)) != oid_nil) { + sql_stream *st = load_sql_stream(tr, t, rid); //there will be always only one stream entry per table t->stream = st; st->t = t; list_append(s->streams, st); - break; //there will be always only one stream per table } table_funcs.rids_destroy(rs); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list