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

Before searching for an exited thread, wait until one exited.


diffs (35 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
@@ -63,6 +63,7 @@ typedef struct queue {
        FlowEvent *data;
        MT_Lock l;      /* it's a shared resource, ie we need locks */
        MT_Sema s;      /* threads wait on empty queues */
+       MT_Sema e;      /* synchronize exiting of thread */
 } Queue;
 
 /*
@@ -128,6 +129,7 @@ q_create(int sz, const char *name)
        (void) name; /* in case MT_LOCK_TRACE is not enabled in gdk_system.h */
        MT_lock_init(&q->l, name);
        MT_sema_init(&q->s, 0, name);
+       MT_sema_init(&q->e, 0, name);
        return q;
 }
 
@@ -214,6 +216,7 @@ q_dequeue(Queue *q)
        if (q->exitcount > 0) {
                q->exitcount--;
                MT_lock_unset(&q->l, "q_dequeue");
+               MT_sema_up(&q->e, "q_dequeue");
                return NULL;
        }
        assert(q->last > 0);
@@ -736,6 +739,7 @@ runMALdataflow(Client cntxt, MalBlkPtr m
                todo->exitcount++;
                MT_lock_unset(&todo->l, "runMALdataflow");
                MT_sema_up(&todo->s, "runMALdataflow");
+               MT_sema_down(&todo->e, "runMALdataflow");
                MT_lock_set(&mal_contextLock, "runMALdataflow");
                for (i = 0; i < THREADS; i++) {
                        if (workers[i].flag == EXITED) {
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to