Skip to content

Commit 8034400

Browse files
More properly use the condition variable for calls from external threads.
1 parent e401489 commit 8034400

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

src/feb.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ typedef enum bt {
6262
typedef struct {
6363
pthread_mutex_t lock;
6464
pthread_cond_t condition;
65+
uint32_t completed;
6566
void *a;
6667
void *b;
6768
blocker_type type;
@@ -232,6 +233,7 @@ static aligned_t qthread_feb_blocker_thread(void *arg)
232233
break;
233234
}
234235
pthread_mutex_lock(&a->lock);
236+
a->completed = 1;
235237
pthread_cond_signal(&a->condition);
236238
pthread_mutex_unlock(&a->lock);
237239
return 0;
@@ -241,11 +243,11 @@ static int qthread_feb_blocker_func(void *dest,
241243
void *src,
242244
blocker_type t)
243245
{ /*{{{*/
244-
qthread_feb_blocker_t args = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, dest, src, t, QTHREAD_SUCCESS };
246+
qthread_feb_blocker_t args = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0u, dest, src, t, QTHREAD_SUCCESS };
245247

246-
qthread_fork(qthread_feb_blocker_thread, &args, NULL);
247248
pthread_mutex_lock(&args.lock);
248-
pthread_cond_wait(&args.condition, &args.lock);
249+
qthread_fork(qthread_feb_blocker_thread, &args, NULL);
250+
while(!args.completed) pthread_cond_wait(&args.condition, &args.lock);
249251
pthread_mutex_unlock(&args.lock);
250252
pthread_cond_destroy(&args.condition);
251253
pthread_mutex_destroy(&args.lock);

src/syncvar.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ typedef enum bt {
6565
typedef struct {
6666
pthread_mutex_t lock;
6767
pthread_cond_t condition;
68+
uint32_t completed;
6869
void *a;
6970
void *b;
7071
blocker_type type;
@@ -311,6 +312,7 @@ static aligned_t qthread_syncvar_blocker_thread(void *arg)
311312
case INCR: a->retval = qthread_syncvar_incrF(a->a, *(int64_t *)a->b); break;
312313
}
313314
pthread_mutex_lock(&a->lock);
315+
a->completed = 1u;
314316
pthread_cond_signal(&a->condition);
315317
pthread_mutex_unlock(&a->lock);
316318
return 0;
@@ -320,7 +322,7 @@ static int qthread_syncvar_nonblocker_func(void *dest,
320322
void *src,
321323
blocker_type t)
322324
{ /*{{{*/
323-
qthread_syncvar_blocker_t args = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, dest, src, t, QTHREAD_SUCCESS };
325+
qthread_syncvar_blocker_t args = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0u, dest, src, t, QTHREAD_SUCCESS };
324326

325327
qthread_fork(qthread_syncvar_nonblocker_thread, &args, NULL);
326328
return args.retval;
@@ -330,11 +332,11 @@ static int qthread_syncvar_blocker_func(void *dest,
330332
void *src,
331333
blocker_type t)
332334
{ /*{{{*/
333-
qthread_syncvar_blocker_t args = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, dest, src, t, QTHREAD_SUCCESS };
335+
qthread_syncvar_blocker_t args = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0u, dest, src, t, QTHREAD_SUCCESS };
334336

335337
pthread_mutex_lock(&args.lock);
336338
qthread_fork(qthread_syncvar_blocker_thread, &args, NULL);
337-
pthread_cond_wait(&args.condition, &args.lock);
339+
while (!args.completed) pthread_cond_wait(&args.condition, &args.lock);
338340
pthread_mutex_unlock(&args.lock);
339341
pthread_cond_destroy(&args.condition);
340342
pthread_mutex_destroy(&args.lock);

0 commit comments

Comments
 (0)