// wait void myth_sleep_2(int num) { int s; int *my_sem = &(g_envs[g_worker_rank].my_sem); s = *my_sem = 2; if(myth_sleeper_push(my_sem,g_worker_rank,num) == 0) { #if defined(MYTH_ECO_CIRCLE_STEAL) || defined(MYTH_ECO_TEIAN_STEAL) g_envs[g_worker_rank].c = SLEEPING; #endif while( s != 0 ) { futex_wait( my_sem, 2 ); s = fetch_and_store((void *) my_sem, 2); } #ifdef MYTH_ECO_DEBUG printf("wake up!\n"); #endif g_envs[g_worker_rank].c = STEALING; } }
void myth_go_asleep(void) { int s; int *my_sem = &(g_envs[g_worker_rank].my_sem); s = *my_sem = 2; #if defined(MYTH_ECO_CIRCLE_STEAL) || defined(MYTH_ECO_TEIAN_STEAL) g_envs[g_worker_rank].c = SLEEPING; #endif while(myth_sleeper_push(my_sem,g_worker_rank,-1) != 0) {;} // __sync_fetch_and_add(&sleeper,1); //atomic(sleeper++;) while( s != 0 ) { futex_wait( my_sem, 2 ); s = fetch_and_store((void *) my_sem, 2); } #ifdef MYTH_ECO_DEBUG printf("wake up!\n"); #endif #if defined(MYTH_ECO_CIRCLE_STEAL) || defined(MYTH_ECO_TEIAN_STEAL) g_envs[g_worker_rank].c = STEALING; #endif }
//! Returns the value of the word containing the bit b inline size_t get_containing_word_and_zero(size_t b) { size_t arrpos, bitpos; bit_to_pos(b, arrpos, bitpos); return fetch_and_store(array[arrpos], size_t(0)); }
static inline mcs_node_t * fas(volatile mcs_node_t **p, mcs_node_t *n) { return (mcs_node_t *) fetch_and_store((volatile void **) p, n); }