This source file includes following definitions.
- pmix_ds21_is_invalid
- pmix_ds21_set_invalid
- pmix_ds21_is_ext_slot
- pmix_ds21_key_hash
- pmix_ds21_kname_match
- pmix_ds21_kval_size
- pmix_ds21_key_name_ptr
- pmix_ds21_key_name_len
- pmix_ds21_data_ptr
- pmix_ds21_data_size
- pmix_ds21_key_size
- pmix_ds21_ext_slot_size
- pmix_ds21_put_key
1
2
3
4
5
6
7
8
9
10
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 \
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
65
66
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
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 };