forked from lei.chen/myxce
feat: implement kvmgr_capture_keys for lock-free checkpoint serialization (P0-14a)
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
This commit is contained in:
parent
4903c83f28
commit
eaf1801d6d
7 changed files with 361 additions and 0 deletions
|
|
@ -30,4 +30,22 @@ extern kv_key_ops_t int_key_ops;
|
|||
extern kv_key_ops_t string_key_ops;
|
||||
|
||||
extern int key_cmp_default(void*, void*, size_t);
|
||||
|
||||
/*
|
||||
* kvtab_foreach — iterate every live entry in the kvtab (P0-14).
|
||||
*
|
||||
* For each entry, cb(key, index, arg) is called.
|
||||
* - key : the raw key pointer stored in the entry (char* for
|
||||
* string-keyed tables, (void*)(long)intval for int-keyed).
|
||||
* - index : the slot index stored as the entry value.
|
||||
* - arg : caller-supplied context.
|
||||
*
|
||||
* Iteration order is unspecified.
|
||||
* Returns the number of entries visited, or -EINVAL if kvtab is NULL.
|
||||
*/
|
||||
typedef void (*kvtab_foreach_fn_t)(void* key, int index, void* arg);
|
||||
extern int kvtab_foreach(var kvtab,
|
||||
kvtab_foreach_fn_t cb,
|
||||
void* arg);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include "xce/types.h"
|
||||
#include "xlist.h"
|
||||
#include "zarray.h"
|
||||
#include "persist.h"
|
||||
|
||||
typedef enum {
|
||||
KVMGR_KEY_INT = 0,
|
||||
|
|
@ -22,4 +23,22 @@ typedef struct {
|
|||
|
||||
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue