void * rwmt_thread(void *unused) { int data; print_line("Aux thread tries to read lock rwmutex"); ethr_rwmutex_rlock(&rwmt_rwmutex); print_line("Aux thread read locked rwmutex"); ASSERT(rwmt_data == 4711); print_line("Aux thread tries to read unlock rwmutex"); ethr_rwmutex_runlock(&rwmt_rwmutex); print_line("Aux thread read unlocked rwmutex"); print_line("Aux thread tries to write lock rwmutex"); ethr_rwmutex_rwlock(&rwmt_rwmutex); print_line("Aux thread write locked rwmutex"); data = ++rwmt_data; print_line("Aux thread wrote"); print_line("Aux thread goes to sleep for 1 second"); do_sleep(1); print_line("Aux thread woke up"); ASSERT(rwmt_data == data); ++rwmt_data; print_line("Aux thread tries to write unlock rwmutex"); ethr_rwmutex_rwunlock(&rwmt_rwmutex); print_line("Aux thread write unlocked rwmutex"); return NULL; }
void erl_drv_rwlock_rlock(ErlDrvRWLock *drwlck) { #ifdef USE_THREADS if (!drwlck) fatal_error(EINVAL, "erl_drv_rwlock_rlock()"); ethr_rwmutex_rlock(&drwlck->rwmtx); #endif }
void erl_drv_rwlock_rlock(ErlDrvRWLock *drwlck) { #ifdef USE_THREADS int res = drwlck ? ethr_rwmutex_rlock(&drwlck->rwmtx) : EINVAL; if (res != 0) fatal_error(res, "erl_drv_rwlock_rlock()"); #endif }
void ethr_run_exit_handlers__(void) { ethr_xhndl_list *xhp; ethr_rwmutex_rlock(&xhndl_rwmtx); xhp = xhndl_list; ethr_rwmutex_runlock(&xhndl_rwmtx); for (; xhp; xhp = xhp->next) (*xhp->funcp)(); }
static void rwmutex_test(void) { int data; int res; ethr_tid tid; print_line("Trying to initialize rwmutex"); res = ethr_rwmutex_init(&rwmt_rwmutex); ASSERT(res == 0); print_line("Initialized rwmutex"); rwmt_data = 4711; print_line("Main thread tries to read lock rwmutex"); ethr_rwmutex_rlock(&rwmt_rwmutex); print_line("Main thread read locked rwmutex"); ASSERT(rwmt_data == 4711); print_line("Main thread about to create aux thread"); res = ethr_thr_create(&tid, rwmt_thread, NULL, NULL); ASSERT(res == 0); print_line("Main thread created aux thread"); print_line("Main thread goes to sleep for 1 second"); do_sleep(1); print_line("Main thread woke up"); ASSERT(rwmt_data == 4711); print_line("Main thread tries to read unlock rwmutex"); ethr_rwmutex_runlock(&rwmt_rwmutex); print_line("Main thread read unlocked rwmutex"); print_line("Main thread tries to write lock rwmutex"); ethr_rwmutex_rwlock(&rwmt_rwmutex); print_line("Main thread write locked rwmutex"); data = ++rwmt_data; print_line("Main thread goes to sleep for 1 second"); do_sleep(1); print_line("Main thread woke up"); ASSERT(rwmt_data == data); ++rwmt_data; print_line("Main thread tries to write unlock rwmutex"); ethr_rwmutex_rwunlock(&rwmt_rwmutex); print_line("Main thread write unlocked rwmutex"); res = ethr_thr_join(tid, NULL); ASSERT(res == 0); print_line("Main thread joined aux thread"); res = ethr_rwmutex_destroy(&rwmt_rwmutex); ASSERT(res == 0); print_line("Main thread destroyed rwmutex"); }