int main(int argc, char **argv) { pthread_t *thids; int i; if (co_thread_init() < 0) { perror("co_thread_init failed in main\n"); exit(-1); } task = co_create(count_inc, NULL, NULL, 4096); // launch worker threads thids = (pthread_t *) malloc(NUM_WORKERS * sizeof(pthread_t)); for (i = 0; i < NUM_WORKERS; i++) { int *arg = (int *) malloc( sizeof(int) ); *arg = i; if (pthread_create(&thids[i], NULL, worker, arg)) { perror("creating worker threads"); exit(-1); } } // join on finish for (i = 0; i < NUM_WORKERS; i++) pthread_join(thids[i], NULL); co_delete(task); co_thread_cleanup(); return 0; }
void *WorkerThread(void *arg) { workerctx_t *wc = (workerctx_t *)arg; #ifdef HAVE___THREAD workerctx_cur = wc; #else /* HAVE___THREAD */ /* set pointer to worker context as TSD */ pthread_setspecific(workerctx_key, wc); #endif /* HAVE___THREAD */ //FIXME #ifdef USE_MCTX_PCL assert(0 == co_thread_init()); wc->mctx = co_current(); #endif wc->terminate = 0; wc->current_task = NULL; LpelThreadAssign(wc->wid + 1); // 0 is for the master WorkerLoop(wc); #ifdef USE_LOGGING /* cleanup monitoring */ if (wc->mon && MON_CB(worker_destroy)) { MON_CB(worker_destroy)(wc->mon); } #endif #ifdef USE_MCTX_PCL co_thread_cleanup(); #endif return NULL; }
void *WrapperThread(void *arg) { workerctx_t *wp = (workerctx_t *)arg; #ifdef HAVE___THREAD workerctx_cur = wp; #else /* HAVE___THREAD */ /* set pointer to worker context as TSD */ pthread_setspecific(workerctx_key, wp); #endif /* HAVE___THREAD */ #ifdef USE_MCTX_PCL assert(0 == co_thread_init()); wp->mctx = co_current(); #endif LpelThreadAssign(wp->wid); WrapperLoop(wp); addFreeWrapper(wp); #ifdef USE_MCTX_PCL co_thread_cleanup(); #endif return NULL; }
/** * Initialise the LPEL * * num_workers, proc_workers > 0 * proc_others >= 0 * * * EXCLUSIVE: only valid, if * #proc_avail >= proc_workers + proc_others && * proc_others != 0 && * num_workers == proc_workers * */ void LpelInit(lpel_config_t *cfg) { /* Initialise hardware information for thread pinning */ LpelHwLocInit(cfg); #ifdef USE_MCTX_PCL int res = co_thread_init(); /* initialize machine context for main thread */ assert( 0 == res); #endif }
/** * Initialise the LPEL * * num_workers, proc_workers > 0 * proc_others >= 0 * * * EXCLUSIVE: only valid, if * #proc_avail >= proc_workers + proc_others && * proc_others != 0 && * num_workers == proc_workers * */ void LpelInit(lpel_config_t *cfg) { /* store a local copy of cfg */ _lpel_global_config = *cfg; #ifdef USE_SCC //SCCInit(0,_lpel_global_config.num_workers); #else /* Initialise hardware information for thread pinning */ LpelHwLocInit(cfg); #endif /*USE_SCC*/ #ifdef USE_MCTX_PCL int res = co_thread_init(); /* initialize machine context for main thread */ assert( 0 == res); #endif }
void *MasterThread(void *arg) { masterctx_t *master = (masterctx_t *)arg; num_workers = master->num_workers; //#ifdef HAVE___THREAD // workerctx_cur = ms; //#else /* HAVE___THREAD */ // /* set pointer to worker context as TSD */ // pthread_setspecific(workerctx_key, ms); //#endif /* HAVE___THREAD */ //FIXME #ifdef USE_MCTX_PCL assert(0 == co_thread_init()); master->mctx = co_current(); #endif /* assign to cores */ master->terminate = 0; LpelThreadAssign(LPEL_MAP_MASTER); // master loop, no monitor for master MasterLoop(master); // master terminated, now terminate worker workermsg_t msg; msg.type = WORKER_MSG_TERMINATE; LpelWorkerBroadcast(&msg); #ifdef USE_MCTX_PCL co_thread_cleanup(); #endif return NULL; }
void coopth_init(void) { co_thread_init(); }
/** * Thread function for workers (and wrappers) */ static void *WorkerThread( void *arg) { workerctx_t *wc = (workerctx_t *)arg; lpel_task_t *t; #ifdef HAVE___THREAD workerctx_cur = wc; #else /* HAVE___THREAD */ /* set pointer to worker context as TSD */ pthread_setspecific(workerctx_key, wc); #endif /* HAVE___THREAD */ #ifdef USE_MCTX_PCL int res = co_thread_init(); assert( 0 == res); wc->mctx = co_current(); #endif wc->current_task = NULL; /* no task marked for deletion */ wc->marked_del = NULL; /* assign to cores */ LpelThreadAssign( wc->wid); /*******************************************************/ if ( wc->wid >= 0) { WorkerLoop( wc); } else { WrapperLoop( wc); } /*******************************************************/ #ifdef USE_LOGGING /* cleanup monitoring */ if (wc->mon && MON_CB(worker_destroy)) { MON_CB(worker_destroy)(wc->mon); } #endif /* destroy all the free tasks */ while ((t = LpelPopTask(free, &wc->free_tasks))) { LpelTaskDestroy(t); } /* on a wrapper, we also can cleanup more*/ if (wc->wid < 0) { /* clean up the mailbox for the worker */ LpelMailboxDestroy(wc->mailbox); /* free the worker context */ free( wc); } #ifdef USE_MCTX_PCL co_thread_cleanup(); #endif return NULL; }
void coopth_init(void) { co_handle = co_thread_init(PCL_C_MC); }