@@ -65,6 +65,7 @@ typedef enum bt {
65
65
typedef struct {
66
66
pthread_mutex_t lock ;
67
67
pthread_cond_t condition ;
68
+ uint32_t completed ;
68
69
void * a ;
69
70
void * b ;
70
71
blocker_type type ;
@@ -311,6 +312,7 @@ static aligned_t qthread_syncvar_blocker_thread(void *arg)
311
312
case INCR : a -> retval = qthread_syncvar_incrF (a -> a , * (int64_t * )a -> b ); break ;
312
313
}
313
314
pthread_mutex_lock (& a -> lock );
315
+ a -> completed = 1u ;
314
316
pthread_cond_signal (& a -> condition );
315
317
pthread_mutex_unlock (& a -> lock );
316
318
return 0 ;
@@ -320,7 +322,7 @@ static int qthread_syncvar_nonblocker_func(void *dest,
320
322
void * src ,
321
323
blocker_type t )
322
324
{ /*{{{*/
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 };
324
326
325
327
qthread_fork (qthread_syncvar_nonblocker_thread , & args , NULL );
326
328
return args .retval ;
@@ -330,11 +332,11 @@ static int qthread_syncvar_blocker_func(void *dest,
330
332
void * src ,
331
333
blocker_type t )
332
334
{ /*{{{*/
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 };
334
336
335
337
pthread_mutex_lock (& args .lock );
336
338
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 );
338
340
pthread_mutex_unlock (& args .lock );
339
341
pthread_cond_destroy (& args .condition );
340
342
pthread_mutex_destroy (& args .lock );
0 commit comments