Skip to content

Commit a2bb829

Browse files
committed
shm 实现 ByRef 与 wire-len Get
1 parent f227ca4 commit a2bb829

2 files changed

Lines changed: 42 additions & 1 deletion

File tree

‎src/kvspace.c‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2378,7 +2378,7 @@ int kvspaceShmList(kvspace_t *kv, const char *prefix, bool ex, int resolve,
23782378
}
23792379
/* memindex(p·):读 index body 成员名(唯一权威);stringkeymap 按坐标
23802380
* row-major 升序。 */
2381-
if (read_index_names(kv, pfx, on, oc))
2381+
if (read_index_names(kv, pfx, on, oc) && *oc > 0)
23822382
return 0;
23832383
int plen = (int)strlen(pfx);
23842384
char **out = malloc(sizeof(char *) * 4096);

‎src/xvalue.c‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,51 @@ static int32_t encode_al(const char *kind, const uint8_t *raw, int32_t raw_len,
237237
return kvspaceXvalueEncode(kind, raw, raw_len, dims, nd, out);
238238
}
239239

240+
#define KVSPACE_HEAD64 64
241+
static int looks_head64(const uint8_t *d, int32_t n) {
242+
if (!d || n < KVSPACE_HEAD64)
243+
return 0;
244+
if (d[1] > KVSPACE_STORETYPE_EXTINDEX || d[3] > X_MAX_NDIM)
245+
return 0;
246+
uint64_t bl = 0, cap = 0;
247+
for (int i = 0; i < 8; i++) {
248+
bl |= (uint64_t)d[8 + i] << (i * 8);
249+
cap |= (uint64_t)d[16 + i] << (i * 8);
250+
}
251+
if (bl > cap || (int32_t)KVSPACE_HEAD64 + (int32_t)bl > n)
252+
return 0;
253+
return 1;
254+
}
255+
240256
xvalue_head_t kvspaceXvalueDecodeHead(const uint8_t *data, int32_t data_len) {
241257
xvalue_head_t h = {0};
242258
if (!data || data_len < X_HEAD_PREFIX)
243259
return h;
260+
if (looks_head64(data, data_len) && rd_u16(data) != X_HEAD_PREFIX) {
261+
uint8_t st = data[1];
262+
uint8_t ndim = data[3];
263+
uint64_t bl = 0;
264+
for (int i = 0; i < 8; i++)
265+
bl |= (uint64_t)data[8 + i] << (i * 8);
266+
h.headlen = KVSPACE_HEAD64;
267+
h.ref = (int32_t)(int8_t)data[0];
268+
if (h.ref < 0)
269+
h.ref = KVSPACE_REF_EXT;
270+
h.storetype = st;
271+
h.ro = data[2] & 1;
272+
h.vid = rd_u32(data + 4);
273+
h.raw_len = (int32_t)bl;
274+
h.ndim = ndim;
275+
for (int i = 0; i < ndim && i < X_MAX_NDIM; i++)
276+
h.dims[i] = (int32_t)rd_u32(data + 28 + i * 4);
277+
h.langtype = "";
278+
h.langtype_len = 0;
279+
h.kind = "";
280+
h.kind_len = 0;
281+
h.raw = data + KVSPACE_HEAD64;
282+
h.array_len = store_has_dims(st) ? header_array_len(h.ndim, h.dims) : 1;
283+
return h;
284+
}
244285
h.headlen = rd_u16(data);
245286
h.ref = data[2];
246287
h.storetype = data[3];

0 commit comments

Comments
 (0)