Use a separate variable for the exit condition
This commit is contained in:
+13
-1
@@ -8,21 +8,24 @@
|
|||||||
|
|
||||||
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
static int counter = 0;
|
static int counter = 0;
|
||||||
|
static int please_exit = 0;
|
||||||
|
|
||||||
void wake_cb(struct IOMuxWaker *wk)
|
void wake_cb(struct IOMuxWaker *wk)
|
||||||
{
|
{
|
||||||
int local_counter;
|
int local_counter;
|
||||||
|
int exit_now;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = pthread_mutex_lock(&lock);
|
rc = pthread_mutex_lock(&lock);
|
||||||
assert(rc == 0);
|
assert(rc == 0);
|
||||||
local_counter = counter;
|
local_counter = counter;
|
||||||
|
exit_now = please_exit;
|
||||||
printf("counter is %d\n", local_counter);
|
printf("counter is %d\n", local_counter);
|
||||||
|
|
||||||
rc = pthread_mutex_unlock(&lock);
|
rc = pthread_mutex_unlock(&lock);
|
||||||
assert(rc == 0);
|
assert(rc == 0);
|
||||||
|
|
||||||
if (local_counter == 13) {
|
if (exit_now) {
|
||||||
rc = uc_iomux_waker_destroy(wk);
|
rc = uc_iomux_waker_destroy(wk);
|
||||||
assert(rc == 0);
|
assert(rc == 0);
|
||||||
}
|
}
|
||||||
@@ -59,6 +62,15 @@ void *waker(void *arg)
|
|||||||
rc = uc_iomux_waker_signal(s);
|
rc = uc_iomux_waker_signal(s);
|
||||||
assert(rc == 0);
|
assert(rc == 0);
|
||||||
}
|
}
|
||||||
|
rc = pthread_mutex_lock(&lock);
|
||||||
|
assert(rc == 0);
|
||||||
|
please_exit = 1;
|
||||||
|
//must wake it inside the mutex, else we risk a race
|
||||||
|
//when the waker is destroyed
|
||||||
|
rc = uc_iomux_waker_signal(s);
|
||||||
|
assert(rc == 0);
|
||||||
|
|
||||||
|
rc = pthread_mutex_unlock(&lock);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user