void chpl_task_startMovedTask(chpl_fn_p fp, void *arg, c_sublocid_t subloc, chpl_taskID_t id, chpl_bool serial_state) { assert(subloc != c_sublocid_none); assert(id == chpl_nullTaskID); chpl_qthread_wrapper_args_t wrapper_args = {fp, arg, NULL, 0, canCountRunningTasks, PRV_DATA_IMPL_VAL(subloc, serial_state) }; PROFILE_INCR(profile_task_startMovedTask,1); if (subloc == c_sublocid_any) { qthread_fork_copyargs(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), NULL); } else { qthread_fork_copyargs_to(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), NULL, (qthread_shepherd_id_t) subloc); } }
void chpl_task_addToTaskList(chpl_fn_int_t fid, void *arg, c_sublocid_t subloc, chpl_task_list_p *task_list, int32_t task_list_locale, chpl_bool is_begin_stmt, int lineno, c_string filename) { qthread_shepherd_id_t const here_shep_id = qthread_shep(); chpl_bool serial_state = chpl_task_getSerial(); chpl_qthread_wrapper_args_t wrapper_args = {chpl_ftable[fid], arg, filename, lineno, false, PRV_DATA_IMPL_VAL(subloc, serial_state) }; assert(subloc != c_sublocid_none); PROFILE_INCR(profile_task_addToTaskList,1); if (serial_state) { syncvar_t ret = SYNCVAR_STATIC_EMPTY_INITIALIZER; qthread_fork_syncvar_copyargs_to(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), &ret, here_shep_id); qthread_syncvar_readFF(NULL, &ret); } else if (subloc == c_sublocid_any) { qthread_fork_copyargs(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), NULL); } else { qthread_fork_copyargs_to(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), NULL, (qthread_shepherd_id_t) subloc); } }
// Start the main task. // // Warning: this method is not called within a Qthread task context. Do // not use methods that require task context (e.g., task-local storage). void chpl_task_callMain(void (*chpl_main)(void)) { const chpl_qthread_wrapper_args_t wrapper_args = {chpl_main, NULL, NULL, 0, false, PRV_DATA_IMPL_VAL(c_sublocid_any_val, false) }; qthread_debug(CHAPEL_CALLS, "[%d] begin chpl_task_callMain()\n", chpl_nodeID); #ifdef QTHREAD_MULTINODE qthread_debug(CHAPEL_BEHAVIOR, "[%d] calling spr_unify\n", chpl_nodeID); int const rc = spr_unify(); assert(SPR_OK == rc); #endif /* QTHREAD_MULTINODE */ qthread_fork_syncvar(chapel_wrapper, &wrapper_args, &exit_ret); qthread_syncvar_readFF(NULL, &exit_ret); qthread_debug(CHAPEL_BEHAVIOR, "[%d] main task finished\n", chpl_nodeID); qthread_debug(CHAPEL_CALLS, "[%d] end chpl_task_callMain()\n", chpl_nodeID); }
# define PROFILE_INCR(counter,count) #endif /* CHAPEL_PROFILE */ // aka chpl_task_list_p struct chpl_task_list { chpl_fn_p fun; void *arg; c_string filename; int lineno; chpl_task_list_p next; }; pthread_t chpl_qthread_comm_pthread; chpl_qthread_tls_t chpl_qthread_comm_task_tls = { PRV_DATA_IMPL_VAL(c_sublocid_any_val, false), NULL, 0, NULL, 0 }; // // // structs chpl_task_prvDataImpl_t, chpl_qthread_wrapper_args_t and // chpl_qthread_tls_t have been moved to tasks-qthreads.h // // // chpl_qthread_get_tasklocal() is in tasks-qthreads.h // static syncvar_t exit_ret = SYNCVAR_STATIC_EMPTY_INITIALIZER;
// aka chpl_task_list_p struct chpl_task_list { chpl_fn_p fun; void *arg; int32_t filename; int lineno; chpl_task_list_p next; }; static aligned_t next_task_id = 1; pthread_t chpl_qthread_process_pthread; pthread_t chpl_qthread_comm_pthread; chpl_qthread_tls_t chpl_qthread_process_tls = { PRV_DATA_IMPL_VAL(CHPL_FILE_IDX_MAIN_TASK, 0, chpl_nullTaskID, FID_NONE, false, c_sublocid_any_val, false), 0, 0}; chpl_qthread_tls_t chpl_qthread_comm_task_tls = { PRV_DATA_IMPL_VAL(CHPL_FILE_IDX_COMM_TASK, 0, chpl_nullTaskID, FID_NONE, false, c_sublocid_any_val, false), 0, 0 }; typedef struct { void *fn; void *arg; void *arg_copy; chpl_bool countRunning; chpl_task_prvDataImpl_t chpl_data; } chpl_qthread_wrapper_args_t;
// aka chpl_task_list_p struct chpl_task_list { chpl_fn_p fun; void *arg; c_string filename; int lineno; chpl_task_list_p next; }; static aligned_t next_task_id = 1; pthread_t chpl_qthread_process_pthread; pthread_t chpl_qthread_comm_pthread; chpl_qthread_tls_t chpl_qthread_process_tls = { PRV_DATA_IMPL_VAL("<main task>", 0, chpl_nullTaskID, false, c_sublocid_any_val, false), NULL, 0 }; chpl_qthread_tls_t chpl_qthread_comm_task_tls = { PRV_DATA_IMPL_VAL("<comm thread>", 0, chpl_nullTaskID, false, c_sublocid_any_val, false), NULL, 0 }; // // structs chpl_task_prvDataImpl_t, chpl_qthread_wrapper_args_t and // chpl_qthread_tls_t have been moved to tasks-qthreads.h // // // chpl_qthread_get_tasklocal() is in tasks-qthreads.h //