⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dss_unpack.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
📖 第 1 页 / 共 2 页
字号:
}/* UNPACK FUNCTIONS FOR NON-GENERIC SYSTEM TYPES *//* * NULL */int orte_dss_unpack_null(orte_buffer_t *buffer, void *dest,                         orte_std_cntr_t *num_vals, orte_data_type_t type){    OPAL_OUTPUT( ( orte_dss_verbose, "orte_dss_unpack_null * %d\n", (int)*num_vals ) );    /* check to see if there's enough data in buffer */    if (orte_dss_too_small(buffer, *num_vals)) {        return ORTE_ERR_UNPACK_READ_PAST_END_OF_BUFFER;    }    /* unpack the data */    memcpy(dest, buffer->unpack_ptr, *num_vals);    /* update buffer pointer */    buffer->unpack_ptr += *num_vals;    return ORTE_SUCCESS;}/* * BYTE, CHAR, INT8 */int orte_dss_unpack_byte(orte_buffer_t *buffer, void *dest,                         orte_std_cntr_t *num_vals, orte_data_type_t type){    OPAL_OUTPUT( ( orte_dss_verbose, "orte_dss_unpack_byte * %d\n", (int)*num_vals ) );    /* check to see if there's enough data in buffer */    if (orte_dss_too_small(buffer, *num_vals)) {        return ORTE_ERR_UNPACK_READ_PAST_END_OF_BUFFER;    }    /* unpack the data */    memcpy(dest, buffer->unpack_ptr, *num_vals);    /* update buffer pointer */    buffer->unpack_ptr += *num_vals;    return ORTE_SUCCESS;}int orte_dss_unpack_int16(orte_buffer_t *buffer, void *dest,                          orte_std_cntr_t *num_vals, orte_data_type_t type){    orte_std_cntr_t i;    uint16_t tmp, *desttmp = (uint16_t*) dest;   OPAL_OUTPUT( ( orte_dss_verbose, "orte_dss_unpack_int16 * %d\n", (int)*num_vals ) );    /* check to see if there's enough data in buffer */    if (orte_dss_too_small(buffer, (*num_vals)*sizeof(tmp))) {        return ORTE_ERR_UNPACK_READ_PAST_END_OF_BUFFER;    }    /* unpack the data */    for (i = 0; i < (*num_vals); ++i) {        memcpy( &(tmp), buffer->unpack_ptr, sizeof(tmp) );        desttmp[i] = ntohs(tmp);        buffer->unpack_ptr += sizeof(tmp);    }    return ORTE_SUCCESS;}int orte_dss_unpack_int32(orte_buffer_t *buffer, void *dest,                          orte_std_cntr_t *num_vals, orte_data_type_t type){    orte_std_cntr_t i;    uint32_t tmp, *desttmp = (uint32_t*) dest;   OPAL_OUTPUT( ( orte_dss_verbose, "orte_dss_unpack_int32 * %d\n", (int)*num_vals ) );    /* check to see if there's enough data in buffer */    if (orte_dss_too_small(buffer, (*num_vals)*sizeof(tmp))) {        return ORTE_ERR_UNPACK_READ_PAST_END_OF_BUFFER;    }    /* unpack the data */    for (i = 0; i < (*num_vals); ++i) {        memcpy( &(tmp), buffer->unpack_ptr, sizeof(tmp) );        desttmp[i] = ntohl(tmp);        buffer->unpack_ptr += sizeof(tmp);    }    return ORTE_SUCCESS;}int orte_dss_unpack_int64(orte_buffer_t *buffer, void *dest,                          orte_std_cntr_t *num_vals, orte_data_type_t type){    orte_std_cntr_t i;    uint64_t tmp, *desttmp = (uint64_t*) dest;   OPAL_OUTPUT( ( orte_dss_verbose, "orte_dss_unpack_int64 * %d\n", (int)*num_vals ) );    /* check to see if there's enough data in buffer */    if (orte_dss_too_small(buffer, (*num_vals)*sizeof(tmp))) {        return ORTE_ERR_UNPACK_READ_PAST_END_OF_BUFFER;    }    /* unpack the data */    for (i = 0; i < (*num_vals); ++i) {        memcpy( &(tmp), buffer->unpack_ptr, sizeof(tmp) );        desttmp[i] = ntoh64(tmp);        buffer->unpack_ptr += sizeof(tmp);    }    return ORTE_SUCCESS;}int orte_dss_unpack_string(orte_buffer_t *buffer, void *dest,                           orte_std_cntr_t *num_vals, orte_data_type_t type){    int ret;    orte_std_cntr_t i, len, n=1;    char **sdest = (char**) dest;    for (i = 0; i < (*num_vals); ++i) {        if (ORTE_SUCCESS != (ret = orte_dss_unpack_std_cntr(buffer, &len, &n, ORTE_STD_CNTR))) {            return ret;        }        if (0 ==  len) {   /* zero-length string - unpack the NULL */            sdest[i] = NULL;        } else {        sdest[i] = (char*)malloc(len);            if (NULL == sdest[i]) {                ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);                return ORTE_ERR_OUT_OF_RESOURCE;            }            if (ORTE_SUCCESS != (ret = orte_dss_unpack_byte(buffer, sdest[i], &len, ORTE_BYTE))) {                return ret;            }        }    }    return ORTE_SUCCESS;}/* UNPACK FUNCTIONS FOR GENERIC ORTE TYPES *//* * ORTE_STD_CNTR */int orte_dss_unpack_std_cntr(orte_buffer_t *buffer, void *dest, orte_std_cntr_t *num_vals,                              orte_data_type_t type){    int ret;        /* turn around and unpack the real type */    ret = orte_dss_unpack_buffer(buffer, dest, num_vals, ORTE_STD_CNTR_T);        return ret;}/* * ORTE_DATA_TYPE */int orte_dss_unpack_data_type(orte_buffer_t *buffer, void *dest, orte_std_cntr_t *num_vals,                             orte_data_type_t type){    int ret;         /* turn around and unpack the real type */     ret = orte_dss_unpack_buffer(buffer, dest, num_vals, ORTE_DATA_TYPE_T);        return ret;}/* * ORTE_DATA_VALUE */int orte_dss_unpack_data_value(orte_buffer_t *buffer, void *dest, orte_std_cntr_t *num,                             orte_data_type_t type){    orte_dss_type_info_t *info;    orte_data_value_t **ddv;    orte_std_cntr_t i, n;    orte_data_type_t dt;    size_t nsize;    int ret;    ddv = (orte_data_value_t **) dest;    for (i = 0; i < *num; ++i) {        /* see what the data type is */        n = 1;        if (ORTE_SUCCESS != (ret = orte_dss_get_data_type(buffer, &dt))) {            return ret;        }                /* if it is ORTE_NULL, then do nothing */        if (ORTE_NULL == dt) continue;                /* otherwise, allocate the new object and set the type */                ddv[i] = OBJ_NEW(orte_data_value_t);        if (NULL == ddv[i]) {            ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);            return ORTE_ERR_OUT_OF_RESOURCE;        }        ddv[i]->type = dt;        /* if it is UNDEF, then nothing more to do */        if (ORTE_UNDEF == ddv[i]->type) continue;        /* get enough memory to hold it */        if (ORTE_SUCCESS != (ret = orte_dss.size(&nsize, NULL, ddv[i]->type))) {            ORTE_ERROR_LOG(ret);            return ret;        }        ddv[i]->data = (void*)malloc(nsize);        if (NULL == ddv[i]->data) {            ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);            return ORTE_ERR_OUT_OF_RESOURCE;        }        /* Lookup the unpack function for this type and call it */        if (NULL == (info = (orte_dss_type_info_t*)orte_pointer_array_get_item(orte_dss_types, ddv[i]->type))) {            ORTE_ERROR_LOG(ORTE_ERR_PACK_FAILURE);            return ORTE_ERR_PACK_FAILURE;        }        if (info->odti_structured) {            n=1;            if (ORTE_SUCCESS != (ret = orte_dss_unpack_buffer(buffer, &(ddv[i]->data), &n, ddv[i]->type))) {                return ret;            }        } else {            n=1;            if (ORTE_SUCCESS != (ret = orte_dss_unpack_buffer(buffer, ddv[i]->data, &n, ddv[i]->type))) {                return ret;            }        }    }    return ORTE_SUCCESS;}/* * ORTE_BYTE_OBJECT */int orte_dss_unpack_byte_object(orte_buffer_t *buffer, void *dest, orte_std_cntr_t *num,                             orte_data_type_t type){    int ret;    orte_std_cntr_t i, n, m=1;    orte_byte_object_t **dbyteptr;    dbyteptr = (orte_byte_object_t**)dest;    n = *num;    for(i=0; i<n; i++) {        /* allocate memory for the byte object itself */        dbyteptr[i] = (orte_byte_object_t*)malloc(sizeof(orte_byte_object_t));        if (NULL == dbyteptr[i]) {            ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);            return ORTE_ERR_OUT_OF_RESOURCE;        }        /* unpack object size in bytes */        if (ORTE_SUCCESS != (ret = orte_dss_unpack_std_cntr(buffer, &(dbyteptr[i]->size), &m, ORTE_STD_CNTR))) {            return ret;        }        if (0 < dbyteptr[i]->size) {            dbyteptr[i]->bytes = (uint8_t*)malloc(dbyteptr[i]->size);            if (NULL == dbyteptr[i]->bytes) {                ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE);                return ORTE_ERR_OUT_OF_RESOURCE;            }            if (ORTE_SUCCESS != (ret = orte_dss_unpack_byte(buffer, (dbyteptr[i]->bytes),                                            &(dbyteptr[i]->size), ORTE_BYTE))) {                return ret;            }        }    }    return ORTE_SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -