1
1
openmpi/opal/dss/dss_peek.c
Ralph Castain d70e2e8c2b Merge the ORTE devel branch into the main trunk. Details of what this means will be circulated separately.
Remains to be tested to ensure everything came over cleanly, so please continue to withhold commits a little longer

This commit was SVN r17632.
2008-02-28 01:57:57 +00:00

117 строки
3.4 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include "opal/dss/dss_internal.h"
int opal_dss_peek(opal_buffer_t *buffer, opal_data_type_t *type,
int32_t *num_vals)
{
int ret;
opal_buffer_t tmp;
int32_t n=1;
opal_data_type_t local_type;
/* check for errors */
if (buffer == NULL) {
return OPAL_ERR_BAD_PARAM;
}
/* Double check and ensure that there is data left in the buffer. */
if (buffer->unpack_ptr >= buffer->base_ptr + buffer->bytes_used) {
*type = OPAL_NULL;
*num_vals = 0;
return OPAL_ERR_UNPACK_READ_PAST_END_OF_BUFFER;
}
/* if this is NOT a fully described buffer, then that is as much as
* we can do - there is no way we can tell the caller what type is
* in the buffer since that info wasn't stored.
*/
if (OPAL_DSS_BUFFER_FULLY_DESC != buffer->type) {
*type = OPAL_UNDEF;
*num_vals = 0;
return OPAL_ERR_UNKNOWN_DATA_TYPE;
}
/* cheat: unpack from a copy of the buffer -- leaving all the
original pointers intact */
tmp = *buffer;
if (OPAL_SUCCESS != (ret = opal_dss_get_data_type(&tmp, &local_type))) {
*type = OPAL_NULL;
*num_vals = 0;
return ret;
}
if (OPAL_INT32 != local_type) { /* if the length wasn't first, then error */
*type = OPAL_NULL;
*num_vals = 0;
return OPAL_ERR_UNPACK_FAILURE;
}
if (OPAL_SUCCESS != (ret = opal_dss_unpack_int32(&tmp, num_vals, &n, OPAL_INT32))) {
*type = OPAL_NULL;
*num_vals = 0;
return ret;
}
if (OPAL_SUCCESS != (ret = opal_dss_get_data_type(&tmp, type))) {
*type = OPAL_NULL;
*num_vals = 0;
}
return ret;
}
int opal_dss_peek_type(opal_buffer_t *buffer, opal_data_type_t *type)
{
int ret;
opal_buffer_t tmp;
/* check for errors */
if (buffer == NULL) {
return OPAL_ERR_BAD_PARAM;
}
/* if this is NOT a fully described buffer, then there isn't anything
* we can do - there is no way we can tell the caller what type is
* in the buffer since that info wasn't stored.
*/
if (OPAL_DSS_BUFFER_FULLY_DESC != buffer->type) {
*type = OPAL_UNDEF;
return OPAL_ERR_UNKNOWN_DATA_TYPE;
}
/* Double check and ensure that there is data left in the buffer. */
if (buffer->unpack_ptr >= buffer->base_ptr + buffer->bytes_used) {
*type = OPAL_UNDEF;
return OPAL_ERR_UNPACK_READ_PAST_END_OF_BUFFER;
}
/* cheat: unpack from a copy of the buffer -- leaving all the
original pointers intact */
tmp = *buffer;
if (OPAL_SUCCESS != (ret = opal_dss_get_data_type(&tmp, type))) {
*type = OPAL_UNDEF;
return ret;
}
return OPAL_SUCCESS;
}