void chpl_task_addToTaskList(chpl_fn_int_t fid, chpl_task_bundle_t* arg, size_t arg_size, c_sublocid_t subloc, void** p_task_list_void, int32_t task_list_locale, chpl_bool is_begin_stmt, int lineno, int32_t filename) { assert(subloc == c_sublocid_any); // begin critical section chpl_thread_mutexLock(&threading_lock); if (task_list_locale == chpl_nodeID) { (void) add_to_task_pool(fid, chpl_ftable[fid], arg, arg_size, false, (task_pool_p*) p_task_list_void, is_begin_stmt, lineno, filename); } else { // // is_begin_stmt should be true here because if task_list_locale != // chpl_nodeID, then this function could not have been called from // the context of a cobegin or coforall statement. // assert(is_begin_stmt); (void) add_to_task_pool(fid, chpl_ftable[fid], arg, arg_size, false, NULL, true, 0, CHPL_FILE_IDX_UNKNOWN); } // end critical section chpl_thread_mutexUnlock(&threading_lock); }
void chpl_task_startMovedTask(chpl_fn_p fp, void* a, c_sublocid_t subloc, chpl_taskID_t id, chpl_bool serial_state) { movedTaskWrapperDesc_t* pmtwd; chpl_task_prvDataImpl_t private = { .prvdata = { .serial_state = serial_state } }; assert(subloc == 0 || subloc == c_sublocid_any); assert(id == chpl_nullTaskID); pmtwd = (movedTaskWrapperDesc_t*) chpl_mem_alloc(sizeof(*pmtwd), CHPL_RT_MD_THREAD_PRV_DATA, 0, 0); *pmtwd = (movedTaskWrapperDesc_t) { fp, a, canCountRunningTasks, private }; // begin critical section chpl_thread_mutexLock(&threading_lock); (void) add_to_task_pool(movedTaskWrapper, pmtwd, true, pmtwd->chpl_data, NULL, false, 0, CHPL_FILE_IDX_UNKNOWN); // end critical section chpl_thread_mutexUnlock(&threading_lock); }
void chpl_task_addToTaskList(chpl_fn_int_t fid, void* arg, c_sublocid_t subloc, void** p_task_list_void, int32_t task_list_locale, chpl_bool is_begin_stmt, int lineno, int32_t filename) { task_pool_p curr_ptask = get_current_ptask(); chpl_task_prvDataImpl_t chpl_data = { .prvdata = { .serial_state = curr_ptask->chpl_data.prvdata.serial_state } }; assert(subloc == 0 || subloc == c_sublocid_any); if (chpl_data.prvdata.serial_state) { (*chpl_ftable[fid])(arg); return; } // begin critical section chpl_thread_mutexLock(&threading_lock); if (task_list_locale == chpl_nodeID) { (void) add_to_task_pool(chpl_ftable[fid], arg, false, chpl_data, (task_pool_p*) p_task_list_void, is_begin_stmt, lineno, filename); } else { // // is_begin_stmt should be true here because if task_list_locale != // chpl_nodeID, then this function could not have been called from // the context of a cobegin or coforall statement. // assert(is_begin_stmt); (void) add_to_task_pool(chpl_ftable[fid], arg, false, chpl_data, NULL, true, 0, CHPL_FILE_IDX_UNKNOWN); } // end critical section chpl_thread_mutexUnlock(&threading_lock); }
static inline void taskCallBody(chpl_fn_int_t fid, chpl_fn_p fp, chpl_task_bundle_t* arg, size_t arg_size, c_sublocid_t subloc, int lineno, int32_t filename) { // begin critical section chpl_thread_mutexLock(&threading_lock); (void) add_to_task_pool(fid, fp, arg, arg_size, true, NULL, false, lineno, filename); // end critical section chpl_thread_mutexUnlock(&threading_lock); }
static inline void taskCallBody(chpl_fn_p fp, void* arg, void* arg_copy, c_sublocid_t subloc, chpl_bool serial_state, int lineno, int32_t filename) { taskCallWrapperDesc_t* ptcwd; chpl_task_prvDataImpl_t private = { .prvdata = { .serial_state = serial_state } }; ptcwd = (taskCallWrapperDesc_t*) chpl_mem_alloc(sizeof(*ptcwd), CHPL_RT_MD_THREAD_PRV_DATA, 0, 0); *ptcwd = (taskCallWrapperDesc_t) { fp, arg, arg_copy, canCountRunningTasks, private }; // begin critical section chpl_thread_mutexLock(&threading_lock); (void) add_to_task_pool(taskCallWrapper, ptcwd, true, ptcwd->chpl_data, NULL, false, lineno, filename); // end critical section chpl_thread_mutexUnlock(&threading_lock); }