root/opal/mca/pmix/pmix4x/pmix/src/mca/bfrops/bfrops_types.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* -*- C -*-
   2  *
   3  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   4  *                         University Research and Technology
   5  *                         Corporation.  All rights reserved.
   6  * Copyright (c) 2004-2006 The University of Tennessee and The University
   7  *                         of Tennessee Research Foundation.  All rights
   8  *                         reserved.
   9  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
  10  *                         University of Stuttgart.  All rights reserved.
  11  * Copyright (c) 2004-2005 The Regents of the University of California.
  12  *                         All rights reserved.
  13  * Copyright (c) 2007-2011 Cisco Systems, Inc.  All rights reserved.
  14  * Copyright (c) 2012-2013 Los Alamos National Security, Inc. All rights reserved.
  15  * Copyright (c) 2014-2017 Intel, Inc. All rights reserved.
  16  * $COPYRIGHT$
  17  *
  18  * Additional copyrights may follow
  19  *
  20  * $HEADER$
  21  */
  22 /**
  23  * @file
  24  *
  25  * Buffer management types.
  26  */
  27 
  28 #ifndef PMIX_MCA_BFROP_TYPES_H_
  29 #define PMIX_MCA_BFROP_TYPES_H_
  30 
  31 #include <src/include/pmix_config.h>
  32 
  33 
  34 #include "src/class/pmix_object.h"
  35 #include "src/class/pmix_pointer_array.h"
  36 #include "src/class/pmix_list.h"
  37 #include <pmix_common.h>
  38 
  39 BEGIN_C_DECLS
  40 
  41 /* define the results values for comparisons so we can change them in only one place */
  42 typedef enum {
  43     PMIX_EQUAL = 0,
  44     PMIX_VALUE1_GREATER,
  45     PMIX_VALUE2_GREATER
  46 } pmix_value_cmp_t;
  47 
  48 /**
  49  * buffer type
  50  */
  51 typedef uint8_t pmix_bfrop_buffer_type_t;
  52 #define PMIX_BFROP_BUFFER_UNDEF         0x00
  53 #define PMIX_BFROP_BUFFER_NON_DESC      0x01
  54 #define PMIX_BFROP_BUFFER_FULLY_DESC    0x02
  55 
  56 #define PMIX_BFROP_BUFFER_TYPE_HTON(h)
  57 #define PMIX_BFROP_BUFFER_TYPE_NTOH(h)
  58 
  59 /* internally used object for transferring data
  60  * to/from the server and for storing in the
  61  * hash tables */
  62 typedef struct {
  63     pmix_list_item_t super;
  64     char *key;
  65     pmix_value_t *value;
  66 } pmix_kval_t;
  67 PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_kval_t);
  68 
  69 
  70 /**
  71  * Structure for holding a buffer */
  72 typedef struct {
  73     /** First member must be the object's parent */
  74     pmix_object_t parent;
  75     /** type of buffer */
  76     pmix_bfrop_buffer_type_t type;
  77     /** Start of my memory */
  78     char *base_ptr;
  79     /** Where the next data will be packed to (within the allocated
  80         memory starting at base_ptr) */
  81     char *pack_ptr;
  82     /** Where the next data will be unpacked from (within the
  83         allocated memory starting as base_ptr) */
  84     char *unpack_ptr;
  85 
  86     /** Number of bytes allocated (starting at base_ptr) */
  87     size_t bytes_allocated;
  88     /** Number of bytes used by the buffer (i.e., amount of data --
  89         including overhead -- packed in the buffer) */
  90     size_t bytes_used;
  91 } pmix_buffer_t;
  92 PMIX_EXPORT PMIX_CLASS_DECLARATION(pmix_buffer_t);
  93 
  94 /* Convenience macro for loading a data blob into a pmix_buffer_t
  95  *
  96  * p - the pmix_peer_t of the process that provided the blob. This
  97  *     is needed so we can set the buffer type for later unpacking
  98  *
  99  * b - pointer to pmix_buffer_t
 100  *
 101  * d - pointer to the data blob
 102  *
 103  * s - number of bytes in the blob
 104  *
 105  * NOTE: the macro does NOT copy the data, but simply assigns
 106  * its address to the buffer. Accordingly, the macro will
 107  * set the provided data blob pointer to NULL and the size
 108  * to zero.
 109  */
 110 #define PMIX_LOAD_BUFFER(p, b, d, s)                    \
 111     do {                                                \
 112         (b)->type = (p)->nptr->compat.type;             \
 113         (b)->base_ptr = (char*)(d);                     \
 114         (b)->bytes_used = (s);                          \
 115         (b)->bytes_allocated = (s);                     \
 116         (b)->pack_ptr = ((char*)(b)->base_ptr) + (s);   \
 117         (b)->unpack_ptr = (b)->base_ptr;                \
 118         (d) = NULL;                                     \
 119         (s) = 0;                                        \
 120     } while (0)
 121 
 122 /* Convenience macro for extracting a pmix_buffer_t's payload
 123  * as a data blob
 124  *
 125  * b - pointer to the pmix_buffer_t
 126  *
 127  * d - char* pointer to the data blob
 128  *
 129  * s - number of bytes in the blob
 130  *
 131  * NOTE: the macro does NOT copy the data, but simply assigns
 132  * the address of the buffer's payload to the provided pointer.
 133  * Accordingly, the macro will set all pmix_buffer_t internal
 134  * tracking pointers to NULL and all counters to zero */
 135 #define PMIX_UNLOAD_BUFFER(b, d, s)             \
 136     do {                                        \
 137         (d) = (char*)(b)->unpack_ptr;           \
 138         (s) = (b)->bytes_used;                  \
 139         (b)->base_ptr = NULL;                   \
 140         (b)->bytes_used = 0;                    \
 141         (b)->bytes_allocated = 0;               \
 142         (b)->pack_ptr = NULL;                   \
 143         (b)->unpack_ptr = NULL;                 \
 144     } while (0)
 145 
 146 /* Convenience macro to check for empty buffer without
 147  * exposing the internals */
 148 #define PMIX_BUFFER_IS_EMPTY(b)     \
 149     (0 == (b)->bytes_used)
 150 
 151 END_C_DECLS
 152 
 153 #endif /* PMIX_BFROP_TYPES_H */

/* [<][>][^][v][top][bottom][index][help] */