chpl_taskID_t chpl_task_getId(void) { task_pool_p ptask = get_current_ptask(); if (ptask) return ptask->bundle.id; else return (chpl_taskID_t) -1; }
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) { task_pool_p curr_ptask = get_current_ptask(); bool serial_state = curr_ptask->bundle.serial_state; assert(subloc == 0 || subloc == c_sublocid_any); if (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(fid, chpl_ftable[fid], arg, arg_size, false, false, 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, false, false, NULL, true, 0, CHPL_FILE_IDX_UNKNOWN); } // end critical section chpl_thread_mutexUnlock(&threading_lock); }
chpl_task_prvData_t* chpl_task_getPrvData(void) { return & get_current_ptask()->chpl_data.prvdata; }
void chpl_task_setSerial(chpl_bool state) { get_current_ptask()->chpl_data.prvdata.serial_state = state; }
chpl_bool chpl_task_getSerial(void) { return get_current_ptask()->chpl_data.prvdata.serial_state; }
chpl_taskID_t chpl_task_getId(void) { return get_current_ptask()->id; }
void chpl_task_executeTasksInList(void** p_task_list_void) { task_pool_p* p_task_list_head = (task_pool_p*) p_task_list_void; task_pool_p curr_ptask; task_pool_p child_ptask; // // If we're serial, all the tasks have already been executed. // if (chpl_task_getSerial()) return; curr_ptask = get_current_ptask(); while (*p_task_list_head != NULL) { chpl_fn_p task_to_run_fun = NULL; // begin critical section chpl_thread_mutexLock(&threading_lock); if ((child_ptask = *p_task_list_head) != NULL) { task_to_run_fun = child_ptask->fun; dequeue_task(child_ptask); } // end critical section chpl_thread_mutexUnlock(&threading_lock); if (task_to_run_fun == NULL) continue; set_current_ptask(child_ptask); // begin critical section chpl_thread_mutexLock(&extra_task_lock); extra_task_cnt++; // end critical section chpl_thread_mutexUnlock(&extra_task_lock); if (do_taskReport) { chpl_thread_mutexLock(&taskTable_lock); chpldev_taskTable_set_suspended(curr_ptask->id); chpldev_taskTable_set_active(child_ptask->id); chpl_thread_mutexUnlock(&taskTable_lock); } if (blockreport) initializeLockReportForThread(); chpl_task_do_callbacks(chpl_task_cb_event_kind_begin, child_ptask->filename, child_ptask->lineno, child_ptask->id, child_ptask->is_executeOn); (*task_to_run_fun)(child_ptask->arg); chpl_task_do_callbacks(chpl_task_cb_event_kind_end, child_ptask->filename, child_ptask->lineno, child_ptask->id, child_ptask->is_executeOn); if (do_taskReport) { chpl_thread_mutexLock(&taskTable_lock); chpldev_taskTable_set_active(curr_ptask->id); chpldev_taskTable_remove(child_ptask->id); chpl_thread_mutexUnlock(&taskTable_lock); } // begin critical section chpl_thread_mutexLock(&extra_task_lock); extra_task_cnt--; // end critical section chpl_thread_mutexUnlock(&extra_task_lock); set_current_ptask(curr_ptask); chpl_mem_free(child_ptask, 0, 0); } }
void chpl_task_setSerial(chpl_bool state) { get_current_ptask()->bundle.serial_state = state; }
chpl_bool chpl_task_getSerial(void) { return get_current_ptask()->bundle.serial_state; }
chpl_task_bundle_t* chpl_task_getPrvBundle(void) { return & get_current_ptask()->bundle; }
void chpl_task_executeTasksInList(void** p_task_list_void) { task_pool_p* p_task_list_head = (task_pool_p*) p_task_list_void; task_pool_p curr_ptask; task_pool_p child_ptask; // Note: this function needs to tolerate an empty task // list. That will happen for coforalls inside a serial block, say. curr_ptask = get_current_ptask(); while (*p_task_list_head != NULL) { chpl_fn_p task_to_run_fun = NULL; // begin critical section chpl_thread_mutexLock(&threading_lock); if ((child_ptask = *p_task_list_head) != NULL) { task_to_run_fun = child_ptask->bundle.requested_fn; dequeue_task(child_ptask); } // end critical section chpl_thread_mutexUnlock(&threading_lock); if (task_to_run_fun == NULL) continue; set_current_ptask(child_ptask); // begin critical section chpl_thread_mutexLock(&extra_task_lock); extra_task_cnt++; // end critical section chpl_thread_mutexUnlock(&extra_task_lock); if (do_taskReport) { chpl_thread_mutexLock(&taskTable_lock); chpldev_taskTable_set_suspended(curr_ptask->bundle.id); chpldev_taskTable_set_active(child_ptask->bundle.id); chpl_thread_mutexUnlock(&taskTable_lock); } if (blockreport) initializeLockReportForThread(); chpl_task_do_callbacks(chpl_task_cb_event_kind_begin, child_ptask->bundle.requested_fid, child_ptask->bundle.filename, child_ptask->bundle.lineno, child_ptask->bundle.id, child_ptask->bundle.is_executeOn); (*task_to_run_fun)(&child_ptask->bundle); chpl_task_do_callbacks(chpl_task_cb_event_kind_end, child_ptask->bundle.requested_fid, child_ptask->bundle.filename, child_ptask->bundle.lineno, child_ptask->bundle.id, child_ptask->bundle.is_executeOn); if (do_taskReport) { chpl_thread_mutexLock(&taskTable_lock); chpldev_taskTable_set_active(curr_ptask->bundle.id); chpldev_taskTable_remove(child_ptask->bundle.id); chpl_thread_mutexUnlock(&taskTable_lock); } // begin critical section chpl_thread_mutexLock(&extra_task_lock); extra_task_cnt--; // end critical section chpl_thread_mutexUnlock(&extra_task_lock); set_current_ptask(curr_ptask); chpl_mem_free(child_ptask, 0, 0); } }