Esempio n. 1
0
// 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;
  }
}
Esempio n. 2
0
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
}
Esempio n. 3
0
 //! 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));
 }
Esempio n. 4
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);
}