@@ -64,6 +64,8 @@ typedef enum bt {
64
64
} blocker_type ;
65
65
typedef struct {
66
66
pthread_mutex_t lock ;
67
+ pthread_cond_t condition ;
68
+ uint32_t completed ;
67
69
void * a ;
68
70
void * b ;
69
71
blocker_type type ;
@@ -293,15 +295,18 @@ static aligned_t qthread_syncvar_blocker_thread(void *arg)
293
295
case EMPTY : a -> retval = qthread_syncvar_empty (a -> a ); break ;
294
296
case INCR : a -> retval = qthread_syncvar_incrF (a -> a , * (int64_t * )a -> b ); break ;
295
297
}
296
- pthread_mutex_unlock (& (a -> lock ));
298
+ pthread_mutex_lock (& a -> lock );
299
+ a -> completed = 1u ;
300
+ pthread_cond_signal (& a -> condition );
301
+ pthread_mutex_unlock (& a -> lock );
297
302
return 0 ;
298
303
} /*}}} */
299
304
300
305
static int qthread_syncvar_nonblocker_func (void * dest ,
301
306
void * src ,
302
307
blocker_type t )
303
308
{ /*{{{*/
304
- qthread_syncvar_blocker_t args = { PTHREAD_MUTEX_INITIALIZER , dest , src , t , QTHREAD_SUCCESS };
309
+ qthread_syncvar_blocker_t args = { PTHREAD_MUTEX_INITIALIZER , PTHREAD_COND_INITIALIZER , 0u , dest , src , t , QTHREAD_SUCCESS };
305
310
306
311
qthread_fork (qthread_syncvar_nonblocker_thread , & args , NULL );
307
312
return args .retval ;
@@ -311,12 +316,13 @@ static int qthread_syncvar_blocker_func(void *dest,
311
316
void * src ,
312
317
blocker_type t )
313
318
{ /*{{{*/
314
- qthread_syncvar_blocker_t args = { PTHREAD_MUTEX_INITIALIZER , dest , src , t , QTHREAD_SUCCESS };
319
+ qthread_syncvar_blocker_t args = { PTHREAD_MUTEX_INITIALIZER , PTHREAD_COND_INITIALIZER , 0u , dest , src , t , QTHREAD_SUCCESS };
315
320
316
321
pthread_mutex_lock (& args .lock );
317
322
qthread_fork (qthread_syncvar_blocker_thread , & args , NULL );
318
- pthread_mutex_lock ( & args .lock );
323
+ while (! args . completed ) pthread_cond_wait ( & args . condition , & args .lock );
319
324
pthread_mutex_unlock (& args .lock );
325
+ pthread_cond_destroy (& args .condition );
320
326
pthread_mutex_destroy (& args .lock );
321
327
return args .retval ;
322
328
} /*}}}*/
0 commit comments