Skip to content

Commit 4b54807

Browse files
Merge pull request #207 from insertinterestingnamehere/syncvar_lock
Fix Syncvar and FEB Lock/Unlock In Different Threads
2 parents a3e9c03 + 8034400 commit 4b54807

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

src/feb.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ typedef enum bt {
6161
} blocker_type;
6262
typedef struct {
6363
pthread_mutex_t lock;
64+
pthread_cond_t condition;
65+
uint32_t completed;
6466
void *a;
6567
void *b;
6668
blocker_type type;
@@ -230,20 +232,24 @@ static aligned_t qthread_feb_blocker_thread(void *arg)
230232
a->retval = qthread_empty(a->a);
231233
break;
232234
}
233-
pthread_mutex_unlock(&(a->lock));
235+
pthread_mutex_lock(&a->lock);
236+
a->completed = 1;
237+
pthread_cond_signal(&a->condition);
238+
pthread_mutex_unlock(&a->lock);
234239
return 0;
235240
} /*}}} */
236241

237242
static int qthread_feb_blocker_func(void *dest,
238243
void *src,
239244
blocker_type t)
240245
{ /*{{{*/
241-
qthread_feb_blocker_t args = { PTHREAD_MUTEX_INITIALIZER, dest, src, t, QTHREAD_SUCCESS };
246+
qthread_feb_blocker_t args = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, 0u, dest, src, t, QTHREAD_SUCCESS };
242247

243248
pthread_mutex_lock(&args.lock);
244249
qthread_fork(qthread_feb_blocker_thread, &args, NULL);
245-
pthread_mutex_lock(&args.lock);
250+
while(!args.completed) pthread_cond_wait(&args.condition, &args.lock);
246251
pthread_mutex_unlock(&args.lock);
252+
pthread_cond_destroy(&args.condition);
247253
pthread_mutex_destroy(&args.lock);
248254
return args.retval;
249255
} /*}}}*/

src/syncvar.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ typedef enum bt {
6464
} blocker_type;
6565
typedef struct {
6666
pthread_mutex_t lock;
67+
pthread_cond_t condition;
68+
uint32_t completed;
6769
void *a;
6870
void *b;
6971
blocker_type type;
@@ -293,15 +295,18 @@ static aligned_t qthread_syncvar_blocker_thread(void *arg)
293295
case EMPTY: a->retval = qthread_syncvar_empty(a->a); break;
294296
case INCR: a->retval = qthread_syncvar_incrF(a->a, *(int64_t *)a->b); break;
295297
}
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);
297302
return 0;
298303
} /*}}} */
299304

300305
static int qthread_syncvar_nonblocker_func(void *dest,
301306
void *src,
302307
blocker_type t)
303308
{ /*{{{*/
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 };
305310

306311
qthread_fork(qthread_syncvar_nonblocker_thread, &args, NULL);
307312
return args.retval;
@@ -311,12 +316,13 @@ static int qthread_syncvar_blocker_func(void *dest,
311316
void *src,
312317
blocker_type t)
313318
{ /*{{{*/
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 };
315320

316321
pthread_mutex_lock(&args.lock);
317322
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);
319324
pthread_mutex_unlock(&args.lock);
325+
pthread_cond_destroy(&args.condition);
320326
pthread_mutex_destroy(&args.lock);
321327
return args.retval;
322328
} /*}}}*/

0 commit comments

Comments
 (0)