root/opal/mca/pmix/pmix4x/pmix/src/mca/gds/ds21/gds_ds21_file.c

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

DEFINITIONS

This source file includes following definitions.
  1. pmix_ds21_is_invalid
  2. pmix_ds21_set_invalid
  3. pmix_ds21_is_ext_slot
  4. pmix_ds21_key_hash
  5. pmix_ds21_kname_match
  6. pmix_ds21_kval_size
  7. pmix_ds21_key_name_ptr
  8. pmix_ds21_key_name_len
  9. pmix_ds21_data_ptr
  10. pmix_ds21_data_size
  11. pmix_ds21_key_size
  12. pmix_ds21_ext_slot_size
  13. pmix_ds21_put_key

   1 /*
   2  * Copyright (c) 2018      Mellanox Technologies, Inc.
   3  *                         All rights reserved.
   4  * Copyright (c) 2019      Research Organization for Information Science
   5  *                         and Technology (RIST).  All rights reserved.
   6  * $COPYRIGHT$
   7  *
   8  * Additional copyrights may follow
   9  *
  10  * $HEADER$
  11  */
  12 
  13 #include <pmix_common.h>
  14 
  15 #include "src/include/pmix_globals.h"
  16 #include "src/mca/gds/base/base.h"
  17 
  18 #include "src/mca/common/dstore/dstore_file.h"
  19 #include "gds_ds21_file.h"
  20 
  21 #if 8 > SIZEOF_SIZE_T
  22 #define ESH_REGION_EXTENSION_FLG    0x80000000
  23 #define ESH_REGION_INVALIDATED_FLG  0x40000000
  24 #define ESH_REGION_SIZE_MASK        0x3FFFFFFF
  25 #else
  26 #define ESH_REGION_EXTENSION_FLG    0x8000000000000000
  27 #define ESH_REGION_INVALIDATED_FLG  0x4000000000000000
  28 #define ESH_REGION_SIZE_MASK        0x3FFFFFFFFFFFFFFF
  29 #endif
  30 
  31 #define ESH_KV_SIZE_V21(addr)                               \
  32 __pmix_attribute_extension__ ({                             \
  33     size_t sz;                                              \
  34     memcpy(&sz, addr, sizeof(size_t));                      \
  35     /* drop flags in lsb's */                               \
  36     (sz & ESH_REGION_SIZE_MASK);                            \
  37 })
  38 
  39 #define ESH_KNAME_PTR_V21(addr)                             \
  40     ((char *)addr + 2 * sizeof(size_t))
  41 
  42 #define ESH_KNAME_LEN_V21(key)                              \
  43     (strlen(key) + 1)
  44 
  45 #define ESH_DATA_PTR_V21(addr)                              \
  46 __pmix_attribute_extension__ ({                             \
  47     char *key_ptr = ESH_KNAME_PTR_V21(addr);                \
  48     size_t kname_len = ESH_KNAME_LEN_V21(key_ptr);          \
  49     uint8_t *data_ptr =                                     \
  50         addr + (key_ptr - (char*)addr) + kname_len;         \
  51     data_ptr;                                               \
  52 })
  53 
  54 #define ESH_DATA_SIZE_V21(addr, data_ptr)                   \
  55 __pmix_attribute_extension__ ({                             \
  56     size_t sz = ESH_KV_SIZE_V21(addr);                      \
  57     size_t data_size = sz - (data_ptr - addr);              \
  58     data_size;                                              \
  59 })
  60 
  61 #define ESH_KEY_SIZE_V21(key, size)                         \
  62     (2 * sizeof(size_t) + ESH_KNAME_LEN_V21((char*)key) + size)
  63 
  64 /* in ext slot new offset will be stored in case if
  65  * new data were added for the same process during
  66  * next commit
  67  */
  68 #define EXT_SLOT_SIZE_V21()                                 \
  69     (ESH_KEY_SIZE_V21("", sizeof(size_t)))
  70 
  71 static bool pmix_ds21_is_invalid(uint8_t *addr)
  72 {
  73     size_t sz;
  74     memcpy(&sz, addr, sizeof(size_t));
  75     return !!(sz & ESH_REGION_INVALIDATED_FLG);
  76 }
  77 
  78 static void pmix_ds21_set_invalid(uint8_t *addr)
  79 {
  80     size_t sz;
  81     memcpy(&sz, addr, sizeof(size_t));
  82     sz |= ESH_REGION_INVALIDATED_FLG;
  83     memcpy(addr, &sz, sizeof(size_t));
  84 }
  85 
  86 static bool pmix_ds21_is_ext_slot(uint8_t *addr)
  87 {
  88     size_t sz;
  89     memcpy(&sz, addr, sizeof(size_t));
  90     return !!(sz & ESH_REGION_EXTENSION_FLG);
  91 }
  92 
  93 static size_t pmix_ds21_key_hash(const char *key)
  94 {
  95     size_t hash = 0;
  96     int i;
  97     for(i=0; key[i]; i++) {
  98         hash += key[i];
  99     }
 100     return hash;
 101 }
 102 
 103 static bool pmix_ds21_kname_match(uint8_t *addr, const char *key, size_t key_hash)
 104 {
 105     bool ret = 0;
 106     size_t hash;
 107     memcpy(&hash, (char*)addr + sizeof(size_t), sizeof(size_t));
 108     if( key_hash != hash ) {
 109         return ret;
 110     }
 111     return (0 == strncmp(ESH_KNAME_PTR_V21(addr), key, ESH_KNAME_LEN_V21(key)));
 112 }
 113 
 114 static size_t pmix_ds21_kval_size(uint8_t *key)
 115 {
 116     return ESH_KV_SIZE_V21(key); ;
 117 }
 118 
 119 static char* pmix_ds21_key_name_ptr(uint8_t *addr)
 120 {
 121     return ESH_KNAME_PTR_V21(addr);
 122 }
 123 
 124 static size_t pmix_ds21_key_name_len(char *key)
 125 {
 126     return ESH_KNAME_LEN_V21(key);
 127 }
 128 
 129 static uint8_t* pmix_ds21_data_ptr(uint8_t *addr)
 130 {
 131     return ESH_DATA_PTR_V21(addr);
 132 }
 133 
 134 static size_t pmix_ds21_data_size(uint8_t *addr, uint8_t* data_ptr)
 135 {
 136     return ESH_DATA_SIZE_V21(addr, data_ptr);
 137 }
 138 
 139 static size_t pmix_ds21_key_size(char *addr, size_t data_size)
 140 {
 141     return ESH_KEY_SIZE_V21(addr, data_size);
 142 }
 143 
 144 static size_t pmix_ds21_ext_slot_size(void)
 145 {
 146     return EXT_SLOT_SIZE_V21();
 147 }
 148 
 149 static int pmix_ds21_put_key(uint8_t *addr, char *key,
 150                               void* buffer, size_t size)
 151 {
 152     size_t flag = 0;
 153     size_t hash = 0;
 154     char *addr_ch = (char*)addr;
 155     if( !strcmp(key, ESH_REGION_EXTENSION) ) {
 156         /* we have a flag for this special key */
 157         key = "";
 158         flag |= ESH_REGION_EXTENSION_FLG;
 159     }
 160     size_t sz = ESH_KEY_SIZE_V21(key, size);
 161     if( ESH_REGION_SIZE_MASK < sz ) {
 162         return PMIX_ERROR;
 163     }
 164     sz |= flag;
 165     memcpy(addr_ch, &sz, sizeof(size_t));
 166     hash = pmix_ds21_key_hash(key);
 167     memcpy(addr_ch + sizeof(size_t), &hash, sizeof(size_t));
 168     strncpy(addr_ch + 2 * sizeof(size_t), key, ESH_KNAME_LEN_V21(key));
 169     memcpy(ESH_DATA_PTR_V21(addr), buffer, size);
 170     return PMIX_SUCCESS;
 171 }
 172 
 173 pmix_common_dstore_file_cbs_t pmix_ds21_file_module = {
 174     .name = "ds21",
 175     .kval_size = pmix_ds21_kval_size,
 176     .kname_ptr = pmix_ds21_key_name_ptr,
 177     .kname_len = pmix_ds21_key_name_len,
 178     .data_ptr = pmix_ds21_data_ptr,
 179     .data_size = pmix_ds21_data_size,
 180     .key_size = pmix_ds21_key_size,
 181     .ext_slot_size = pmix_ds21_ext_slot_size,
 182     .put_key = pmix_ds21_put_key,
 183     .is_invalid = pmix_ds21_is_invalid,
 184     .is_extslot = pmix_ds21_is_ext_slot,
 185     .set_invalid = pmix_ds21_set_invalid,
 186     .key_hash = pmix_ds21_key_hash,
 187     .key_match = pmix_ds21_kname_match
 188 };

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