obj: add more set and namespace functions

This commit is contained in:
2023-02-25 17:57:53 +00:00
parent ef10ed5cd2
commit 8c87e78797
7 changed files with 248 additions and 5 deletions

View File

@@ -7,8 +7,10 @@
#include <stddef.h>
#define OBJECT_MAGIC 0xBADDCAFE
#define OBJECT_NAME_MAX 64
struct object;
struct object_attrib;
typedef enum object_type_flags {
OBJTYPE_INIT = 0x01u,
@@ -18,27 +20,38 @@ typedef struct object_ops {
kern_status_t(*open)(struct object *obj);
kern_status_t(*close)(struct object *obj);
kern_status_t(*delete)(struct object *obj);
kern_status_t(*query_name)(struct object *obj, char *out, size_t max);
kern_status_t(*query_name)(struct object *obj, char out[OBJECT_NAME_MAX]);
kern_status_t(*parse)(struct object *obj, const char *path, struct object **out);
kern_status_t(*get_name)(struct object *obj, const char *name, struct object **out);
kern_status_t(*get_named)(struct object *obj, const char *name, struct object **out);
kern_status_t(*get_at)(struct object *obj, size_t at, struct object **out);
kern_status_t(*read_attrib)(struct object *obj, struct object_attrib *attrib, char *out, size_t max, size_t *r);
kern_status_t(*write_attrib)(struct object *obj, struct object_attrib *attrib, const char *s, size_t len, size_t *r);
} object_ops_t;
typedef struct object_attrib {
char *a_name;
queue_entry_t a_list;
} object_attrib_t;
typedef struct object_type {
object_type_flags_t ob_flags;
char ob_name[32];
unsigned int ob_size;
vm_cache_t ob_cache;
queue_entry_t ob_list;
queue_t ob_attrib;
const object_ops_t *ob_ops;
} object_type_t;
typedef struct object {
uint32_t ob_magic;
struct object *ob_parent;
object_type_t *ob_type;
spin_lock_t ob_lock;
unsigned int ob_refcount;
unsigned int ob_handles;
queue_t ob_attrib;
queue_entry_t ob_list;
} __aligned(sizeof(long)) object_t;
typedef struct object_namespace object_namespace_t;
@@ -56,12 +69,24 @@ extern kern_status_t object_unpublish(object_namespace_t *ns, object_t *obj);
extern object_t *object_create(object_type_t *type);
extern object_t *object_ref(object_t *obj);
extern void object_deref(object_t *obj);
extern void object_lock(object_t *obj, unsigned long *flags);
extern void object_unlock(object_t *obj, unsigned long flags);
extern void *object_data(object_t *obj);
extern object_t *object_header(void *p);
static inline kern_status_t object_get(const char *path, object_t **out)
{
return object_namespace_get_object(global_namespace(), path, out);
}
extern object_t *object_get_child_named(object_t *obj, const char *name);
extern object_t *object_get_child_at(object_t *obj, size_t at);
extern kern_status_t object_query_name(object_t *obj, char name[OBJECT_NAME_MAX]);
extern object_t *set_create(const char *name);
extern kern_status_t set_lock(object_t *obj, unsigned long *flags);
extern kern_status_t set_unlock(object_t *obj, unsigned long flags);
extern kern_status_t set_add_object(object_t *set, object_t *obj);
extern kern_status_t set_remove_object(object_t *set, object_t *obj);
extern bool object_is_set(object_t *obj);
extern void init_set_objects(void);
extern void init_global_namespace(void);