示例#1
0
static hg_return_t
hg_test_rpc_forward_cb(const struct hg_cb_info *callback_info)
{
    hg_handle_t handle = callback_info->info.forward.handle;
    hg_request_t *request = (hg_request_t *) callback_info->arg;
    overflow_out_t out_struct;
    hg_return_t ret = HG_SUCCESS;

    hg_string_t string;
    size_t string_len;

    if (callback_info->ret != HG_SUCCESS) {
        HG_LOG_WARNING("Return from callback info is not HG_SUCCESS");
        goto done;
    }

    /* Get output */
    ret = HG_Get_output(handle, &out_struct);
    if (ret != HG_SUCCESS) {
        fprintf(stderr, "Could not get output\n");
        goto done;
    }

    /* Get output parameters */
    string = out_struct.string;
    string_len = out_struct.string_len;
    printf("Returned string (length %zu): %s\n", string_len, string);

    /* Free request */
    ret = HG_Free_output(handle, &out_struct);
    if (ret != HG_SUCCESS) {
        fprintf(stderr, "Could not free output\n");
        goto done;
    }

done:
    hg_request_complete(request);
    return ret;
}
示例#2
0
/*---------------------------------------------------------------------------*/
hg_return_t
HG_Bulk_deserialize(hg_class_t *hg_class, hg_bulk_t *handle, const void *buf,
    hg_size_t buf_size)
{
    struct hg_bulk *hg_bulk = NULL;
    const char *buf_ptr = (const char *) buf;
    ssize_t buf_size_left = (ssize_t) buf_size;
    hg_return_t ret = HG_SUCCESS;
    hg_uint32_t i;

    if (!handle) {
        HG_LOG_ERROR("NULL pointer to memory handle passed");
        ret = HG_INVALID_PARAM;
        goto done;
    }

    hg_bulk = (struct hg_bulk *) malloc(sizeof(struct hg_bulk));
    if (!hg_bulk) {
        HG_LOG_ERROR("Could not allocate handle");
        ret = HG_NOMEM_ERROR;
        goto done;
    }
    memset(hg_bulk, 0, sizeof(struct hg_bulk));
    hg_bulk->hg_class = hg_class;
    hg_atomic_set32(&hg_bulk->ref_count, 1);

    /* Get the permission flags */
    ret = hg_bulk_deserialize_memcpy(&buf_ptr, &buf_size_left,
        &hg_bulk->flags, sizeof(hg_bulk->flags));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not decode permission flags");
        goto done;
    }

    /* Get the total size of the segments */
    ret = hg_bulk_deserialize_memcpy(&buf_ptr, &buf_size_left,
        &hg_bulk->total_size, sizeof(hg_bulk->total_size));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not decode total size");
        goto done;
    }

    /* Get the number of segments */
    ret = hg_bulk_deserialize_memcpy(&buf_ptr, &buf_size_left,
        &hg_bulk->segment_count, sizeof(hg_bulk->segment_count));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not decode segment count");
        goto done;
    }

    /* Get the array of segments */
    hg_bulk->segments = (struct hg_bulk_segment *) malloc(
            hg_bulk->segment_count * sizeof(struct hg_bulk_segment));
    if (!hg_bulk->segments) {
        HG_LOG_ERROR("Could not allocate segment array");
        ret = HG_NOMEM_ERROR;
        goto done;
    }
    for (i = 0; i < hg_bulk->segment_count; i++) {
        ret = hg_bulk_deserialize_memcpy(&buf_ptr, &buf_size_left,
            &hg_bulk->segments[i], sizeof(hg_bulk->segments[i]));
        if (ret != HG_SUCCESS) {
            HG_LOG_ERROR("Could not decode segment");
            goto done;
        }
    }

    /* Get the number of NA memory handles */
    ret = hg_bulk_deserialize_memcpy(&buf_ptr, &buf_size_left,
        &hg_bulk->na_mem_handle_count, sizeof(hg_bulk->na_mem_handle_count));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not decode NA memory handle count");
        goto done;
    }

    /* Get the NA memory handles */
    hg_bulk->na_mem_handles = (na_mem_handle_t *) malloc(
            hg_bulk->na_mem_handle_count * sizeof(na_mem_handle_t));
    if (!hg_bulk->na_mem_handles) {
        HG_LOG_ERROR("Could not allocate NA memory handle array");
        ret = HG_NOMEM_ERROR;
        goto done;
    }

    for (i = 0; i < hg_bulk->na_mem_handle_count; i++) {
        na_size_t serialize_size;
        na_return_t na_ret;

        ret = hg_bulk_deserialize_memcpy(&buf_ptr, &buf_size_left,
            &serialize_size, sizeof(serialize_size));
        if (ret != HG_SUCCESS) {
            HG_LOG_ERROR("Could not decode serialize size");
            goto done;
        }
        if (serialize_size) {
            na_ret = NA_Mem_handle_deserialize(
                HG_Core_class_get_na(hg_bulk->hg_class),
                &hg_bulk->na_mem_handles[i], buf_ptr,
                (na_size_t) buf_size_left);
            if (na_ret != NA_SUCCESS) {
                HG_LOG_ERROR("Could not deserialize memory handle");
                ret = HG_NA_ERROR;
                goto done;
            }
            buf_ptr += serialize_size;
            buf_size_left -= (ssize_t) serialize_size;
        } else {
            hg_bulk->na_mem_handles[i] = NA_MEM_HANDLE_NULL;
        }
    }

    /* Get whether data is serialized or not */
    ret = hg_bulk_deserialize_memcpy(&buf_ptr, &buf_size_left,
        &hg_bulk->eager_mode, sizeof(hg_bulk->eager_mode));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not decode eager_mode bool");
        goto done;
    }

    /* Get the serialized data */
    if (hg_bulk->eager_mode) {
        hg_bulk->segment_alloc = HG_TRUE;
        for (i = 0; i < hg_bulk->segment_count; i++) {
            if (!hg_bulk->segments[i].size)
                continue;

            /* Use calloc to avoid uninitialized memory used for transfer */
            hg_bulk->segments[i].address = (hg_ptr_t) calloc(
                hg_bulk->segments[i].size, sizeof(char));
            if (!hg_bulk->segments[i].address) {
                HG_LOG_ERROR("Could not allocate segment");
                ret = HG_NOMEM_ERROR;
                goto done;
            }
            ret = hg_bulk_deserialize_memcpy(&buf_ptr, &buf_size_left,
                (void *) hg_bulk->segments[i].address,
                hg_bulk->segments[i].size);
            if (ret != HG_SUCCESS) {
                HG_LOG_ERROR("Could not decode segment data");
                goto done;
            }
        }
    }

    if (buf_size_left)
        HG_LOG_WARNING("Buf size left greater than 0, %zd", buf_size_left);

    *handle = (hg_bulk_t) hg_bulk;

done:
    if (ret != HG_SUCCESS) {
        hg_bulk_free(hg_bulk);
    }
    return ret;
}
示例#3
0
/*---------------------------------------------------------------------------*/
hg_return_t
HG_Bulk_serialize(void *buf, hg_size_t buf_size, hg_bool_t request_eager,
    hg_bulk_t handle)
{
    struct hg_bulk *hg_bulk = (struct hg_bulk *) handle;
    char *buf_ptr = (char *) buf;
    ssize_t buf_size_left = (ssize_t) buf_size;
    hg_return_t ret = HG_SUCCESS;
    hg_bool_t eager_mode;
    na_class_t *na_class;
    hg_uint32_t i;

    if (!hg_bulk) {
        HG_LOG_ERROR("NULL memory handle passed");
        ret = HG_INVALID_PARAM;
        goto done;
    }

    /* Get NA class */
    na_class = HG_Core_class_get_na(hg_bulk->hg_class);

    /* Publish handle at this point if not published yet */
    if (!hg_bulk->segment_published) {
        for (i = 0; i < hg_bulk->na_mem_handle_count; i++) {
            na_return_t na_ret;

            if (!hg_bulk->na_mem_handles[i])
                continue;

            na_ret = NA_Mem_publish(na_class, hg_bulk->na_mem_handles[i]);
            if (na_ret != NA_SUCCESS) {
                HG_LOG_ERROR("NA_Mem_publish failed");
                ret = HG_NA_ERROR;
                goto done;
            }
        }
        hg_bulk->segment_published = HG_TRUE;
    }

    /* Add the permission flags */
    ret = hg_bulk_serialize_memcpy(&buf_ptr, &buf_size_left,
        &hg_bulk->flags, sizeof(hg_bulk->flags));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not encode permission flags");
        goto done;
    }

    /* Add the total size of the segments */
    ret = hg_bulk_serialize_memcpy(&buf_ptr, &buf_size_left,
        &hg_bulk->total_size, sizeof(hg_bulk->total_size));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not encode total size");
        goto done;
    }

    /* Add the number of segments */
    ret = hg_bulk_serialize_memcpy(&buf_ptr, &buf_size_left,
        &hg_bulk->segment_count, sizeof(hg_bulk->segment_count));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not encode segment count");
        goto done;
    }

    /* Add the array of segments */
    for (i = 0; i < hg_bulk->segment_count; i++) {
        ret = hg_bulk_serialize_memcpy(&buf_ptr, &buf_size_left,
            &hg_bulk->segments[i], sizeof(hg_bulk->segments[i]));
        if (ret != HG_SUCCESS) {
            HG_LOG_ERROR("Could not encode segment");
            goto done;
        }
    }

    /* Add the number of NA memory handles */
    ret = hg_bulk_serialize_memcpy(&buf_ptr, &buf_size_left,
        &hg_bulk->na_mem_handle_count, sizeof(hg_bulk->na_mem_handle_count));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not encode NA memory handle count");
        goto done;
    }

    /* Add the NA memory handles */
    for (i = 0; i < hg_bulk->na_mem_handle_count; i++) {
        na_size_t serialize_size = 0;
        na_return_t na_ret;

        if (hg_bulk->na_mem_handles[i]) {
            serialize_size = NA_Mem_handle_get_serialize_size(
                na_class, hg_bulk->na_mem_handles[i]);
        }
        ret = hg_bulk_serialize_memcpy(&buf_ptr, &buf_size_left, &serialize_size,
            sizeof(serialize_size));
        if (ret != HG_SUCCESS) {
            HG_LOG_ERROR("Could not encode serialize size");
            goto done;
        }
        if (hg_bulk->na_mem_handles[i]) {
            na_ret = NA_Mem_handle_serialize(na_class, buf_ptr,
                (na_size_t) buf_size_left, hg_bulk->na_mem_handles[i]);
            if (na_ret != NA_SUCCESS) {
                HG_LOG_ERROR("Could not serialize memory handle");
                ret = HG_NA_ERROR;
                goto done;
            }
            buf_ptr += serialize_size;
            buf_size_left -= (ssize_t) serialize_size;
        }
    }

    /* Eager mode is used only when data is set to HG_BULK_READ_ONLY */
    eager_mode = (request_eager && (hg_bulk->flags == HG_BULK_READ_ONLY));
    ret = hg_bulk_serialize_memcpy(&buf_ptr, &buf_size_left, &eager_mode,
        sizeof(eager_mode));
    if (ret != HG_SUCCESS) {
        HG_LOG_ERROR("Could not encode eager_mode bool");
        goto done;
    }

    /* Add the serialized data */
    if (eager_mode) {
        for (i = 0; i < hg_bulk->segment_count; i++) {
            if (!hg_bulk->segments[i].size)
                continue;

            ret = hg_bulk_serialize_memcpy(&buf_ptr, &buf_size_left,
                (const void *) hg_bulk->segments[i].address,
                hg_bulk->segments[i].size);
            if (ret != HG_SUCCESS) {
                HG_LOG_ERROR("Could not encode segment data");
                goto done;
            }
        }
    }

    if (buf_size_left)
        HG_LOG_WARNING("Buf size left greater than 0, %zd", buf_size_left);

done:
    return ret;
}