divert(-1) define(NEWPROC,) dnl define(BARRIER, `{ pthread_barrier_wait(&($1)); }') define(BARDEC, ` pthread_barrier_t ($1); ') define(BARINIT, `{ pthread_barrier_init(&($1), NULL, $2); }') define(BAREXCLUDE, `{;}') define(BARINCLUDE, `{;}') define(GSDEC, `long ($1);') define(GSINIT, `{ ($1) = 0; }') define(GETSUB, `{ if (($1)<=($3)) ($2) = ($1)++; else { ($2) = -1; ($1) = 0; } }') define(NU_GSDEC, `long ($1);') define(NU_GSINIT, `{ ($1) = 0; }') define(NU_GETSUB, `GETSUB($1,$2,$3,$4)') define(ADEC, `long ($1);') define(AINIT, `{;}') define(PROBEND, `{;}') define(LOCKDEC, `pthread_mutex_t ($1);') define(LOCKINIT, `{pthread_mutex_init(&($1), NULL);}') define(LOCK, `{pthread_mutex_lock(&($1));}') define(UNLOCK, `{pthread_mutex_unlock(&($1));}') define(NLOCKDEC, `long ($1);') define(NLOCKINIT, `{;}') define(NLOCK, `{;}') define(NUNLOCK, `{;}') define(ALOCKDEC, `pthread_mutex_t $1[$2];') define(ALOCKINIT, `{ unsigned long i, Error; for (i = 0; i < $2; i++) { Error = pthread_mutex_init(&$1[i], NULL); if (Error != 0) { printf("Error while initializing array of locks.\n"); exit(-1); } } }') define(ALOCK, `{pthread_mutex_lock(&$1[$2]);}') define(AULOCK, `{pthread_mutex_unlock(&$1[$2]);}') define(PAUSEDEC, ` struct { pthread_mutex_t Mutex; pthread_cond_t CondVar; unsigned long Flag; } $1; ') define(PAUSEINIT, `{ pthread_mutex_init(&$1.Mutex, NULL); pthread_cond_init(&$1.CondVar, NULL); $1.Flag = 0; } ') define(CLEARPAUSE, `{ $1.Flag = 0; pthread_mutex_unlock(&$1.Mutex);} ') define(SETPAUSE, `{ pthread_mutex_lock(&$1.Mutex); $1.Flag = 1; pthread_cond_broadcast(&$1.CondVar); pthread_mutex_unlock(&$1.Mutex);} ') define(EVENT, `{;}') define(WAITPAUSE, `{ pthread_mutex_lock(&$1.Mutex); if ($1.Flag == 0) { pthread_cond_wait(&$1.CondVar, &$1.Mutex); } }') define(PAUSE, `{;}') define(AUG_ON, ` ') define(AUG_OFF, ` ') define(TRACE_ON, ` ') define(TRACE_OFF, ` ') define(REF_TRACE_ON, ` ') define(REF_TRACE_OFF, ` ') define(DYN_TRACE_ON, `;') define(DYN_TRACE_OFF, `;') define(DYN_REF_TRACE_ON, `;') define(DYN_REF_TRACE_OFF, `;') define(DYN_SIM_ON, `;') define(DYN_SIM_OFF, `;') define(DYN_SCHED_ON, `;') define(DYN_SCHED_OFF, `;') define(AUG_SET_LOLIMIT, `;') define(AUG_SET_HILIMIT, `;') define(MENTER, `{;}') define(DELAY, `{;}') define(CONTINUE, `{;}') define(MEXIT, `{;}') define(MONINIT, `{;}') define(WAIT_FOR_END, `{ long i, Error; for (i = 0; i < ($1) - 1; i++) { Error = pthread_join(PThreadTable[i], NULL); if (Error != 0) { printf("Error in pthread_join().\n"); exit(-1); } } }') define(CREATE, `{ long i, Error; for (i = 0; i < ($2) - 1; i++) { Error = pthread_create(&PThreadTable[i], NULL, (void * (*)(void *))($1), NULL); if (Error != 0) { printf("Error in pthread_create().\n"); exit(-1); } } $1(); }') define(MAIN_INITENV, `{;}') define(MAIN_END, `{exit(0);}') define(MAIN_ENV,` #include #include #include #include #include #define MAX_THREADS 32 pthread_t PThreadTable[MAX_THREADS]; ') define(ENV, ` ') define(EXTERN_ENV, ` #include #include #include #include #include extern pthread_t PThreadTable[]; ') define(G_MALLOC, `valloc($1);') define(G_FREE, `;') define(G_MALLOC_F, `valloc($1)') define(NU_MALLOC, `valloc($1);') define(NU_FREE, `;') define(NU_MALLOC_F, `valloc($1)') define(GET_HOME, `{($1) = 0;}') define(GET_PID, `{($1) = 0;}') define(AUG_DELAY, `{sleep ($1);}') define(ST_LOG, `{;}') define(SET_HOME, `{;}') define(CLOCK, `{ struct timeval FullTime; gettimeofday(&FullTime, NULL); ($1) = (unsigned long)(FullTime.tv_usec + FullTime.tv_sec * 1000000); }') divert(0)