pmix_status_t pmix_bfrop_get_data_type(pmix_buffer_t *buffer, pmix_data_type_t *type) { int32_t n=1; return pmix_bfrop_unpack_datatype(buffer, type, &n, PMIX_DATA_TYPE); }
pmix_status_t pmix_bfrop_unpack_darray(pmix_buffer_t *buffer, void *dest, int32_t *num_vals, pmix_data_type_t type) { pmix_data_array_t *ptr; int32_t i, n, m; pmix_status_t ret; size_t nbytes; pmix_output_verbose(20, pmix_globals.debug_output, "pmix_bfrop_unpack: %d data arrays", *num_vals); ptr = (pmix_data_array_t *) dest; n = *num_vals; for (i = 0; i < n; ++i) { memset(&ptr[i], 0, sizeof(pmix_data_array_t)); /* unpack the type */ m=1; if (PMIX_SUCCESS != (ret = pmix_bfrop_unpack_datatype(buffer, &ptr[i].type, &m, PMIX_DATA_TYPE))) { return ret; } /* unpack the number of array elements */ m=1; if (PMIX_SUCCESS != (ret = pmix_bfrop_unpack_sizet(buffer, &ptr[i].size, &m, PMIX_SIZE))) { return ret; } if (0 == ptr[i].size || PMIX_UNDEF == ptr[i].type) { /* nothing else to do */ continue; } /* allocate storage for the array and unpack the array elements */ m = ptr[i].size; switch(ptr[i].type) { case PMIX_BOOL: nbytes = sizeof(bool); break; case PMIX_BYTE: case PMIX_INT8: case PMIX_UINT8: nbytes = sizeof(int8_t); break; case PMIX_INT16: case PMIX_UINT16: nbytes = sizeof(int16_t); break; case PMIX_INT32: case PMIX_UINT32: nbytes = sizeof(int32_t); break; case PMIX_INT64: case PMIX_UINT64: nbytes = sizeof(int64_t); break; case PMIX_STRING: nbytes = sizeof(char*); break; case PMIX_SIZE: nbytes = sizeof(size_t); break; case PMIX_PID: nbytes = sizeof(pid_t); break; case PMIX_INT: case PMIX_UINT: nbytes = sizeof(int); break; case PMIX_FLOAT: nbytes = sizeof(float); break; case PMIX_DOUBLE: nbytes = sizeof(double); break; case PMIX_TIMEVAL: nbytes = sizeof(struct timeval); break; case PMIX_TIME: nbytes = sizeof(time_t); break; case PMIX_STATUS: nbytes = sizeof(pmix_status_t); break; case PMIX_INFO: nbytes = sizeof(pmix_info_t); break; case PMIX_PROC: nbytes = sizeof(pmix_proc_t); break; case PMIX_BYTE_OBJECT: case PMIX_COMPRESSED_STRING: nbytes = sizeof(pmix_byte_object_t); break; case PMIX_PERSIST: nbytes = sizeof(pmix_persistence_t); break; case PMIX_SCOPE: nbytes = sizeof(pmix_scope_t); break; case PMIX_DATA_RANGE: nbytes = sizeof(pmix_data_range_t); break; case PMIX_PROC_STATE: nbytes = sizeof(pmix_proc_state_t); break; case PMIX_PROC_INFO: nbytes = sizeof(pmix_proc_info_t); break; case PMIX_QUERY: nbytes = sizeof(pmix_query_t); default: return PMIX_ERR_NOT_SUPPORTED; } if (NULL == (ptr[i].array = malloc(m * nbytes))) { return PMIX_ERR_NOMEM; } if (PMIX_SUCCESS != (ret = pmix_bfrop_unpack_buffer(buffer, ptr[i].array, &m, ptr[i].type))) { return ret; } } return PMIX_SUCCESS; }