obj: object header is no longer allocated automatically

This commit is contained in:
2023-05-06 19:48:14 +01:00
parent 79c30e5393
commit f52ca2f1e2
13 changed files with 97 additions and 66 deletions

View File

@@ -1,9 +1,13 @@
#include <socks/object.h>
#define NAMESPACE_CAST(p) OBJECT_C_CAST(struct object_namespace, ns_base, &ns_type, p)
static struct object_type ns_type;
static struct object_namespace *global_ns;
struct object_namespace {
/* root directory set object */
struct object ns_base;
struct object *ns_root;
};
@@ -16,13 +20,13 @@ static kern_status_t ns_query_name(struct object *obj, char out[OBJECT_NAME_MAX]
static kern_status_t ns_get_child_at(struct object *obj, size_t at, struct object **out)
{
struct object_namespace *ns = object_data(obj);
struct object_namespace *ns = NAMESPACE_CAST(obj);
return object_get_child_at(ns->ns_root, at, out);
}
static kern_status_t ns_get_child_named(struct object *obj, const char *name, struct object **out)
{
struct object_namespace *ns = object_data(obj);
struct object_namespace *ns = NAMESPACE_CAST(obj);
return object_get_child_named(ns->ns_root, name, out);
}
@@ -36,7 +40,6 @@ static struct object_type ns_type = {
},
};
void init_global_namespace(void)
{
object_type_register(&ns_type);
@@ -51,7 +54,7 @@ struct object_namespace *global_namespace(void)
struct object_namespace *object_namespace_create(void)
{
struct object *ns_object = object_create(&ns_type);
struct object_namespace *ns = object_data(ns_object);
struct object_namespace *ns = NAMESPACE_CAST(ns_object);
ns->ns_root = set_create("/");
return ns;
}
@@ -93,6 +96,11 @@ static void cleanup_object_path(char *path, size_t len, size_t *parts)
path[final_len] = 0;
}
struct object *ns_header(struct object_namespace *ns)
{
return &ns->ns_base;
}
kern_status_t object_publish(struct object_namespace *ns, const char *path, struct object *obj)
{
if (*path != '/') {

View File

@@ -22,7 +22,7 @@ kern_status_t object_type_register(struct object_type *p)
spin_unlock_irqrestore(&object_types_lock, flags);
p->ob_cache.c_name = p->ob_name;
p->ob_cache.c_obj_size = sizeof(struct object) + p->ob_size;
p->ob_cache.c_obj_size = p->ob_size;
p->ob_cache.c_page_order = VM_PAGE_16K;
vm_cache_init(&p->ob_cache);

View File

@@ -1,22 +1,27 @@
#include <socks/object.h>
#define SET_CAST(p) OBJECT_C_CAST(struct set, s_base, &set_type, p)
struct set {
struct object s_base;
struct queue s_list;
char s_name[OBJECT_NAME_MAX];
};
static struct object_type set_type;
static kern_status_t set_query_name(struct object *obj, char out[OBJECT_NAME_MAX])
{
struct set *set = object_data(obj);
struct set *set = SET_CAST(obj);
strncpy(out, set->s_name, OBJECT_NAME_MAX - 1);
out[OBJECT_NAME_MAX - 1] = 0;
return KERN_OK;
}
static kern_status_t set_get_child_at(struct object *obj, size_t at, struct object **out)
{
struct set *set = object_data(obj);
struct set *set = SET_CAST(obj);
size_t i = 0;
queue_foreach(struct object, child, &set->s_list, ob_list) {
if (i == at) {
@@ -26,15 +31,15 @@ static kern_status_t set_get_child_at(struct object *obj, size_t at, struct obje
i++;
}
return KERN_NO_ENTRY;
}
static kern_status_t set_get_child_named(struct object *obj, const char *name, struct object **out)
{
struct set *set = object_data(obj);
struct set *set = SET_CAST(obj);
char child_name[OBJECT_NAME_MAX];
queue_foreach(struct object, child, &set->s_list, ob_list) {
kern_status_t status = object_query_name(child, child_name);
if (status != KERN_OK) {
@@ -46,7 +51,7 @@ static kern_status_t set_get_child_named(struct object *obj, const char *name, s
return KERN_OK;
}
}
return KERN_NO_ENTRY;
}
@@ -72,7 +77,7 @@ struct object *set_create(const char *name)
return NULL;
}
struct set *set = object_data(set_obj);
struct set *set = SET_CAST(set_obj);
set->s_list = QUEUE_INIT;
strncpy(set->s_name, name, sizeof set->s_name - 1);
set->s_name[sizeof set->s_name - 1] = 0;
@@ -85,12 +90,12 @@ kern_status_t set_add_object(struct object *set_obj, struct object *obj)
if (!object_is_set(set_obj)) {
return KERN_INVALID_ARGUMENT;
}
struct set *set = object_data(set_obj);
struct set *set = SET_CAST(set_obj);
char child_name[OBJECT_NAME_MAX];
char obj_name[OBJECT_NAME_MAX];
kern_status_t status = object_query_name(obj, obj_name);
if (status != KERN_OK) {
return status;
@@ -114,8 +119,8 @@ kern_status_t set_remove_object(struct object *set_obj, struct object *obj)
if (!object_is_set(set_obj)) {
return KERN_INVALID_ARGUMENT;
}
struct set *set = object_data(set_obj);
struct set *set = SET_CAST(set_obj);
queue_delete(&set->s_list, &obj->ob_list);
object_deref(obj);