Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
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);
}