Skip to content

Per-Domain dynamic objects

include/smp/perdomain.h View source View on GitHub
struct perdomain_descriptor {
    const char                        *name;
    size_t                            size;
    size_t                            align;
    void                              **perdomain_ptrs;
    perdomain_descriptor_constructor  constructor;
};
typedef void (*perdomain_descriptor_constructor)(void * *, size_t);
void perdomain_obj_init(void);
#define PERDOMAIN_DECLARE(__n, __type, __ctor) \
    extern __type __perdomain_##__n; \
    static void __perdomain_ctor_##__n(void *inst, size_t cpu) { \
        if ((__ctor) != NULL) \
            __ctor((__type *) inst, cpu); \
    } \
    LINKER_SECTION_OBJECT(struct perdomain_descriptor, perdomain_desc) \
    __perdomain_desc_##__n = { \
        .name = #__n, \
        .size = sizeof(__type), \
        .align = _Alignof(__type), \
        .perdomain_ptrs = NULL, \
        .constructor = __perdomain_ctor_##__n, \
    }; \
    __type __perdomain_##__n
#define PERDOMAIN_PTR_FOR_DOMAIN(name, d) \
    ((typeof(__perdomain_##name) *) __perdomain_desc_##name.perdomain_ptrs[d])
#define PERDOMAIN_READ_FOR_DOMAIN(name, d) \
    (*((typeof(__perdomain_##name) *) PERDOMAIN_PTR_FOR_DOMAIN(name, d)))
#define PERDOMAIN_PTR(name) PERDOMAIN_PTR_FOR_DOMAIN(name, domain_local_id())
#define PERDOMAIN_READ(name) \
    (*((typeof(__perdomain_##name) *) PERDOMAIN_PTR(name)))
#define PERDOMAIN_WRITE(name, val) (PERDOMAIN_READ(name) = (val))