void simple_condwait(void) { unsigned long long start; mutex_t mutex; cond_t cond; struct cond_mutex cm = { .mutex = &mutex, .cond = &cond, }; thread_t cond_signaler_tid; fprintf(stderr, "%s\n", __FUNCTION__); check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", thread_spawn(&cond_signaler_tid, 2, cond_signaler, &cm), 0); thread_msleep(11); start = rt_timer_tsc(); check("cond_wait", cond_wait(&cond, &mutex, XN_INFINITE), 0); check_sleep("cond_wait", start); thread_msleep(10); check("mutex_unlock", mutex_unlock(&mutex), 0); check("thread_join", thread_join(cond_signaler_tid), 0); check("mutex_destroy", mutex_destroy(&mutex), 0); check("cond_destroy", cond_destroy(&cond), 0); }
void cond_destroy_whilewait(void) { unsigned long long start; mutex_t mutex; cond_t cond; struct cond_mutex cm = { .mutex = &mutex, .cond = &cond, .tid = thread_self(), }; thread_t cond_destroyer_tid; struct sigaction sa = { .sa_handler = sighandler, .sa_flags = SA_RESTART, }; sigemptyset(&sa.sa_mask); fprintf(stderr, "%s\n", __FUNCTION__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", thread_spawn(&cond_destroyer_tid, 2, cond_destroyer, &cm), 0); thread_msleep(11); start = rt_timer_tsc(); #ifdef XENO_POSIX check("cond_wait", cond_wait(&cond, &mutex, 10 * NS_PER_MS), -ETIMEDOUT); check_sleep("cond_wait", start); thread_msleep(10); check("mutex_unlock", mutex_unlock(&mutex), 0); #else /* native */ check("cond_wait", cond_wait(&cond, &mutex, XN_INFINITE), -EIDRM); check_sleep("cond_wait", start); #endif /* native */ check("thread_join", thread_join(cond_destroyer_tid), 0); check("mutex_destroy", mutex_destroy(&mutex), 0); #ifdef XENO_POSIX check("cond_destroy", cond_destroy(&cond), 0); #else /* native */ check("cond_destroy", cond_destroy(&cond), -ESRCH); #endif /* native */ }
static thread_ret_t thread_test(void *arg) { uint32_t *pCounter = (uint32_t *)arg; do { // SOSAL_PRINT(SOSAL_ZONE_THREAD, "main:thread_test is running back %d pass!\n", *pCounter); thread_msleep(100); } while ((*pCounter)--); return TEST_RET_VALUE; }
void *cond_killer(void *cookie) { unsigned long long start; struct cond_mutex *cm = cookie; start = rt_timer_tsc(); check("mutex_lock", mutex_lock(cm->mutex), 0); check_sleep("mutex_lock", start); thread_msleep(10); check("thread_kill", thread_kill(cm->tid, SIGRTMIN), 0); check("mutex_unlock", mutex_unlock(cm->mutex), 0); return NULL; }
void *cond_signaler(void *cookie) { unsigned long long start; struct cond_mutex *cm = cookie; start = rt_timer_tsc(); check("mutex_lock", mutex_lock(cm->mutex), 0); check_sleep("mutex_lock", start); thread_msleep(10); check("cond_signal", cond_signal(cm->cond), 0); check("mutex_unlock", mutex_unlock(cm->mutex), 0); return NULL; }
void *cond_destroyer(void *cookie) { unsigned long long start; struct cond_mutex *cm = cookie; start = rt_timer_tsc(); check("mutex_lock", mutex_lock(cm->mutex), 0); check_sleep("mutex_lock", start); thread_msleep(10); #ifdef XENO_POSIX check("cond_destroy", cond_destroy(cm->cond), -EBUSY); #else /* native */ check("cond_destroy", cond_destroy(cm->cond), 0); #endif /* native */ check("mutex_unlock", mutex_unlock(cm->mutex), 0); return NULL; }
void relative_condwait(void) { unsigned long long start; mutex_t mutex; cond_t cond; fprintf(stderr, "%s\n", __FUNCTION__); check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); start = rt_timer_tsc(); check("cond_wait", cond_wait(&cond, &mutex, 10 * NS_PER_MS), -ETIMEDOUT); check_sleep("cond_wait", start); thread_msleep(10); check("mutex_unlock", mutex_unlock(&mutex), 0); check("mutex_destroy", mutex_destroy(&mutex), 0); check("cond_destroy", cond_destroy(&cond), 0); }
void sig_norestart_double(void) { unsigned long long start; mutex_t mutex; cond_t cond; struct cond_mutex cm = { .mutex = &mutex, .cond = &cond, .tid = thread_self(), }; thread_t double_killer_tid; struct sigaction sa = { .sa_handler = sighandler, .sa_flags = 0, }; sigemptyset(&sa.sa_mask); fprintf(stderr, "%s\n", __FUNCTION__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", thread_spawn(&double_killer_tid, 2, double_killer, &cm), 0); thread_msleep(11); sig_seen = 0; start = rt_timer_tsc(); check("cond_wait", cond_wait(&cond, &mutex, XN_INFINITE), 0); check_sleep("cond_wait", start); check("sig_seen", sig_seen, 2); thread_msleep(10); check("mutex_unlock", mutex_unlock(&mutex), 0); check("thread_join", thread_join(double_killer_tid), 0); check("mutex_destroy", mutex_destroy(&mutex), 0); check("cond_destroy", cond_destroy(&cond), 0); } void sig_restart_double(void) { unsigned long long start; mutex_t mutex; cond_t cond; struct cond_mutex cm = { .mutex = &mutex, .cond = &cond, .tid = thread_self(), }; thread_t double_killer_tid; struct sigaction sa = { .sa_handler = sighandler, .sa_flags = SA_RESTART, }; sigemptyset(&sa.sa_mask); fprintf(stderr, "%s\n", __FUNCTION__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", thread_spawn(&double_killer_tid, 2, double_killer, &cm), 0); thread_msleep(11); sig_seen = 0; start = rt_timer_tsc(); check("cond_wait", cond_wait(&cond, &mutex, XN_INFINITE), 0); check_sleep("cond_wait", start); check("sig_seen", sig_seen, 2); thread_msleep(10); check("mutex_unlock", mutex_unlock(&mutex), 0); check("thread_join", thread_join(double_killer_tid), 0); check("mutex_destroy", mutex_destroy(&mutex), 0); check("cond_destroy", cond_destroy(&cond), 0); }
void sig_norestart_condwait(void) { unsigned long long start; mutex_t mutex; cond_t cond; struct cond_mutex cm = { .mutex = &mutex, .cond = &cond, .tid = thread_self(), }; thread_t cond_killer_tid; struct sigaction sa = { .sa_handler = sighandler, .sa_flags = 0, }; sigemptyset(&sa.sa_mask); fprintf(stderr, "%s\n", __FUNCTION__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", thread_spawn(&cond_killer_tid, 2, cond_killer, &cm), 0); thread_msleep(11); start = rt_timer_tsc(); sig_seen = 0; #ifdef XENO_POSIX check("cond_wait", cond_wait(&cond, &mutex, XN_INFINITE), 0); #else /* native */ { int err = cond_wait(&cond, &mutex, XN_INFINITE); if (err == 0) err = -EINTR; check("cond_wait", err, -EINTR); } #endif /* native */ check_sleep("cond_wait", start); check("sig_seen", sig_seen, 1); check("mutex_unlock", mutex_unlock(&mutex), 0); check("thread_join", thread_join(cond_killer_tid), 0); check("mutex_destroy", mutex_destroy(&mutex), 0); check("cond_destroy", cond_destroy(&cond), 0); } void sig_restart_condwait(void) { unsigned long long start; mutex_t mutex; cond_t cond; struct cond_mutex cm = { .mutex = &mutex, .cond = &cond, .tid = thread_self(), }; thread_t cond_killer_tid; struct sigaction sa = { .sa_handler = sighandler, .sa_flags = 0, }; sigemptyset(&sa.sa_mask); fprintf(stderr, "%s\n", __FUNCTION__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", thread_spawn(&cond_killer_tid, 2, cond_killer, &cm), 0); thread_msleep(11); start = rt_timer_tsc(); sig_seen = 0; #ifdef XENO_POSIX check("cond_wait", cond_wait(&cond, &mutex, XN_INFINITE), 0); #else /* native */ { int err = cond_wait(&cond, &mutex, XN_INFINITE); if (err == 0) err = -EINTR; check("cond_wait", err, -EINTR); } #endif /* native */ check_sleep("cond_wait", start); check("sig_seen", sig_seen, 1); check("mutex_unlock", mutex_unlock(&mutex), 0); check("thread_join", thread_join(cond_killer_tid), 0); check("mutex_destroy", mutex_destroy(&mutex), 0); check("cond_destroy", cond_destroy(&cond), 0); } void *mutex_killer(void *cookie) { unsigned long long start; struct cond_mutex *cm = cookie; start = rt_timer_tsc(); check("mutex_lock", mutex_lock(cm->mutex), 0); check_sleep("mutex_lock", start); check("cond_signal", cond_signal(cm->cond), 0); thread_msleep(10); check("thread_kill", thread_kill(cm->tid, SIGRTMIN), 0); check("mutex_unlock", mutex_unlock(cm->mutex), 0); return NULL; }