📄 dss_unpack.c
字号:
}/* 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 + -