obj: implement link objects

This commit is contained in:
2023-06-02 19:34:33 +01:00
parent 648c370679
commit 577abf3bba
4 changed files with 210 additions and 12 deletions

View File

@@ -13,6 +13,7 @@ extern "C" {
#define OBJECT_MAGIC 0xBADDCAFE
#define OBJECT_NAME_MAX 64
#define OBJECT_PATH_MAX 256
#define OBJECT_CAST(to_type, to_type_member, p) \
((to_type *)((uintptr_t)p) - offsetof(to_type, to_type_member))
@@ -76,14 +77,17 @@ extern struct object_namespace *global_namespace(void);
extern struct object_namespace *object_namespace_create(void);
extern struct object *ns_header(struct object_namespace *ns);
extern kern_status_t object_namespace_get_object(struct object_namespace *ns, const char *path, struct object **out);
extern kern_status_t object_namespace_create_link(struct object_namespace *ns, const char *linkpath, struct object *dest);
extern kern_status_t object_publish(struct object_namespace *ns, const char *path, struct object *obj);
extern kern_status_t object_unpublish(struct object_namespace *ns, struct object *obj);
extern struct object *object_create(struct object_type *type);
extern struct object *object_ref(struct object *obj);
extern void object_deref(struct object *obj);
extern void object_lock(struct object *obj, unsigned long *flags);
extern void object_unlock(struct object *obj, unsigned long flags);
extern void object_lock(struct object *obj);
extern void object_unlock(struct object *obj);
extern void object_lock_irqsave(struct object *obj, unsigned long *flags);
extern void object_unlock_irqrestore(struct object *obj, unsigned long flags);
static inline kern_status_t object_get(const char *path, struct object **out)
{
return object_namespace_get_object(global_namespace(), path, out);
@@ -99,7 +103,12 @@ extern kern_status_t set_add_object(struct object *set, struct object *obj);
extern kern_status_t set_remove_object(struct object *set, struct object *obj);
extern bool object_is_set(struct object *obj);
extern struct object *link_create(const char *name, struct object *dest);
extern struct object *link_read_ptr(struct object *link);
extern bool object_is_link(struct object *obj);
extern void init_set_objects(void);
extern void init_link_objects(void);
extern void init_global_namespace(void);
#ifdef __cplusplus