示例#1
0
static int builtin_posix_module_process_reqs (hio_dataset_t dataset, hio_internal_request_t **reqs, int req_count) {
  builtin_posix_module_t *posix_module = (builtin_posix_module_t *) dataset->ds_module;

  hioi_object_lock (&dataset->ds_object);
  for (int i = 0 ; i < req_count ; ++i) {
    hio_internal_request_t *req = reqs[i];

    if (HIO_REQUEST_TYPE_READ == req->ir_type) {
      req->ir_status =  builtin_posix_module_element_read_strided_internal (posix_module, req->ir_element, req->ir_offset,
                                                                            req->ir_data.r, req->ir_count, req->ir_size,
                                                                            req->ir_stride);
    } else {
      req->ir_status =  builtin_posix_module_element_write_strided_internal (posix_module, req->ir_element, req->ir_offset,
                                                                             req->ir_data.w, req->ir_count, req->ir_size,
                                                                             req->ir_stride);
    }

    if (req->ir_status < 0) {
      hioi_object_unlock (&dataset->ds_object);
      return (int) req->ir_status;
    }
  }

  hioi_object_unlock (&dataset->ds_object);

  return HIO_SUCCESS;
}
static int builtin_posix_module_process_reqs (hio_dataset_t dataset, hio_internal_request_t **reqs, int req_count) {
  builtin_posix_module_dataset_t *posix_dataset = (builtin_posix_module_dataset_t *) dataset;
  builtin_posix_module_t *posix_module = (builtin_posix_module_t *) dataset->ds_module;
  hio_context_t context = hioi_object_context (&dataset->ds_object);
  uint64_t start, stop;
  int rc = HIO_SUCCESS;

  start = hioi_gettime ();

  hioi_object_lock (&dataset->ds_object);
  for (int i = 0 ; i < req_count ; ++i) {
    hio_internal_request_t *req = reqs[i];

    if (HIO_REQUEST_TYPE_READ == req->ir_type) {
      POSIX_TRACE_CALL(posix_dataset,
                       req->ir_status = builtin_posix_module_element_read_strided_internal (posix_module, req->ir_element, req->ir_offset,
                                                                                            req->ir_data.r, req->ir_count, req->ir_size,
                                                                                            req->ir_stride),
                       "element_read", req->ir_offset, req->ir_count * req->ir_size);

    } else {
      POSIX_TRACE_CALL(posix_dataset,
                       req->ir_status = builtin_posix_module_element_write_strided_internal (posix_module, req->ir_element, req->ir_offset,
                                                                                             req->ir_data.w, req->ir_count, req->ir_size,
                                                                                             req->ir_stride),
                       "element_write", req->ir_offset, req->ir_count * req->ir_size);
    }

    if (req->ir_urequest && req->ir_status > 0) {
      hio_request_t new_request = hioi_request_alloc (context);
      if (NULL == new_request) {
        rc = HIO_ERR_OUT_OF_RESOURCE;
        break;
      }

      req->ir_urequest[0] = new_request;
      new_request->req_transferred = req->ir_status;
      new_request->req_complete = true;
      new_request->req_status = HIO_SUCCESS;
    }

    if (req->ir_status < 0) {
      rc = (int) req->ir_status;
      break;
    }
  }

  hioi_object_unlock (&dataset->ds_object);

  stop = hioi_gettime ();

  builtin_posix_trace (posix_dataset, "process_requests", req_count, 0, start, stop);

  return rc;
}
示例#3
0
static int builtin_posix_module_element_read_strided_nb (hio_element_t element, hio_request_t *request, off_t offset,
                                                         void *ptr, size_t count, size_t size, size_t stride) {
  builtin_posix_module_dataset_t *posix_dataset = (builtin_posix_module_dataset_t *) hioi_element_dataset (element);
  builtin_posix_module_t *posix_module = (builtin_posix_module_t *) posix_dataset->base.ds_module;
  hio_context_t context = hioi_object_context (&element->e_object);
  ssize_t bytes_read;
  hio_request_t new_request;
  int rc = HIO_SUCCESS;

  if (!(posix_dataset->base.ds_flags & HIO_FLAG_READ)) {
    return HIO_ERR_PERM;
  }

  if (stride == 0) {
    size *= count;
    count = 1;
  }

  hioi_object_lock (&posix_dataset->base.ds_object);
  bytes_read = builtin_posix_module_element_read_strided_internal (posix_module, element, offset, ptr, count, size, stride);
  hioi_object_unlock (&posix_dataset->base.ds_object);

  if (0 > bytes_read) {
    rc = (int) bytes_read;
  }

  /* see if a request was requested */
  if (request) {
    new_request = hioi_request_alloc (context);
    if (NULL == new_request) {
      return HIO_ERR_OUT_OF_RESOURCE;
    }

    *request = new_request;
    new_request->req_transferred = bytes_read;
    new_request->req_complete = true;
  }

  return rc;
}