Changeset: afb3087ca20b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=afb3087ca20b
Modified Files:
        monetdb5/mal/mal_dataflow.c
Branch: default
Log Message:

DFLOWworker(), showFlowEvent(): protect all access to queue->last with lock


diffs (52 lines):

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
@@ -284,9 +284,13 @@ DFLOWworker(void *t)
                if (flow->error == 0) {
 #ifdef USE_MAL_ADMISSION
                        if (MALadmission(fe->argclaim, fe->hotclaim)) {
+                               int todo_last = 0;
                                fe->hotclaim = 0;   /* don't assume priority 
anymore */
                                assert(todo);
-                               if (todo->last == 0)
+                               MT_lock_set(&todo->l, "DFLOWworker-1");
+                               todo_last = todo->last;
+                               MT_lock_unset(&todo->l, "DFLOWworker-1");
+                               if (todo_last == 0)
                                        MT_sleep_ms(DELAYUNIT);
                                q_requeue(todo, fe);
                                continue;
@@ -345,8 +349,12 @@ DFLOWworker(void *t)
 
                q_enqueue(flow->done, fe);
                if ( fnxt == 0) {
+                       int todo_last = 0;
                        assert(todo);
-                       if (todo->last == 0)
+                       MT_lock_set(&todo->l, "DFLOWworker-2");
+                       todo_last = todo->last;
+                       MT_lock_unset(&todo->l, "DFLOWworker-2");
+                       if (todo_last == 0)
                                profilerHeartbeatEvent("wait");
                        else
                                MALresourceFairness(usec);
@@ -530,6 +538,7 @@ static void showFlowEvent(DataFlow flow,
 static str
 DFLOWscheduler(DataFlow flow)
 {
+       int flow_done_last = 0;
        int last;
        int i;
 #ifdef USE_MAL_ADMISSION
@@ -599,7 +608,10 @@ DFLOWscheduler(DataFlow flow)
                MT_lock_unset(&flow->flowlock, "MALworker");
        }
        /* wrap up errors */
-       assert(flow->done->last == 0);
+       MT_lock_set(&flow->done->l, "DFLOWscheduler");
+       flow_done_last = flow->done->last;
+       MT_lock_unset(&flow->done->l, "DFLOWscheduler");
+       assert(flow_done_last == 0);
        if (flow->error ) {
                PARDEBUG mnstr_printf(GDKstdout, "#errors encountered %s ", 
flow->error ? flow->error : "unknown");
                ret = flow->error;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to