forked from lei.chen/myxce
Add kvtab_foreach walk primitive (P0-14) to kv.c/kv.h, then implement kvmgr_capture_keys in kvmgr.c that deep-copies all key→index mappings into a malloc'd slot_key_t[] array safe to read after the write lock is released during checkpoint serialization (Part 3.8). Key design points: - Both kvtab_foreach and kvmgr_capture_keys take var (RTTI data pointer) and use RTTI_DATA_TO_OBJ internally — the RTTI framework's makeInstance returns the data region pointer, not the meta_obj_t header pointer - String keys are copied via strncpy into slot_key_t.key[XCE_MAXNAME_LEN] - Integer keys are formatted as decimal strings via snprintf - Two-pass approach: count live entries first, allocate, then fill - Tests cover string kvmgr (3 entries), empty kvmgr, and deep-copy safety
44 lines
1 KiB
C
44 lines
1 KiB
C
#if !defined(__KVMGR_H__)
|
|
|
|
#define __KVMGR_H__ 1
|
|
|
|
#include "htab.h"
|
|
#include "mylock.h"
|
|
#include "xce/types.h"
|
|
#include "xlist.h"
|
|
#include "zarray.h"
|
|
#include "persist.h"
|
|
|
|
typedef enum {
|
|
KVMGR_KEY_INT = 0,
|
|
KVMGR_KEY_STRING
|
|
} kvmgr_key_type_t;
|
|
|
|
typedef struct {
|
|
kvmgr_key_type_t key_type;
|
|
uint32_t nslots;
|
|
uint32_t delta;
|
|
destroy_fn_t datakiller;
|
|
} kvmgr_params_t;
|
|
|
|
extern typeinfo_t xkvmgr_type;
|
|
|
|
/*
|
|
* kvmgr_capture_keys — capture key→index mappings for checkpoint
|
|
* serialization (Part 3.8).
|
|
*
|
|
* Caller MUST hold the kvmgr write lock for the full duration of
|
|
* this call. The function allocates *keys_out and populates it with
|
|
* *n_keys_out entries. Each entry's key[] field is an owned deep
|
|
* copy that remains valid after the write lock is released.
|
|
*
|
|
* Caller must free(*keys_out) when done.
|
|
*
|
|
* Returns 0 on success.
|
|
* Returns -ENOMEM if allocation fails.
|
|
*/
|
|
int kvmgr_capture_keys(var kvmgr,
|
|
slot_key_t** keys_out,
|
|
size_t* n_keys_out);
|
|
|
|
#endif
|