mirror of
https://github.com/schoebel/mars
synced 2025-02-27 01:50:38 +00:00
infra: introduce aspect_context stage 2
This commit is contained in:
parent
6431cc9a7f
commit
87eb7d30bb
@ -578,23 +578,13 @@ done: ;
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(generic_free);
|
EXPORT_SYMBOL_GPL(generic_free);
|
||||||
|
|
||||||
static
|
static inline
|
||||||
struct generic_aspect *_new_aspect(struct generic_brick *brick, struct generic_object *obj)
|
struct generic_aspect *_new_aspect(const struct generic_aspect_type *aspect_type, struct generic_object *obj)
|
||||||
{
|
{
|
||||||
struct generic_aspect *res = NULL;
|
struct generic_aspect *res = NULL;
|
||||||
const struct generic_brick_type *brick_type = brick->type;
|
|
||||||
const struct generic_object_type *object_type;
|
|
||||||
const struct generic_aspect_type *aspect_type;
|
|
||||||
int object_type_nr;
|
|
||||||
int size;
|
int size;
|
||||||
int rest;
|
int rest;
|
||||||
|
|
||||||
object_type = obj->object_type;
|
|
||||||
CHECK_PTR_NULL(object_type, done);
|
|
||||||
object_type_nr = object_type->object_type_nr;
|
|
||||||
aspect_type = brick_type->aspect_types[object_type_nr];
|
|
||||||
CHECK_PTR_NULL(aspect_type, done);
|
|
||||||
|
|
||||||
size = aspect_type->aspect_size;
|
size = aspect_type->aspect_size;
|
||||||
rest = obj->max_offset - obj->free_offset;
|
rest = obj->max_offset - obj->free_offset;
|
||||||
if (likely(size <= rest)) {
|
if (likely(size <= rest)) {
|
||||||
@ -633,7 +623,7 @@ struct generic_aspect *_new_aspect(struct generic_brick *brick, struct generic_o
|
|||||||
if (aspect_type->init_fn) {
|
if (aspect_type->init_fn) {
|
||||||
int status = aspect_type->init_fn(res);
|
int status = aspect_type->init_fn(res);
|
||||||
if (unlikely(status < 0)) {
|
if (unlikely(status < 0)) {
|
||||||
BRICK_ERR("aspect init %p %p %p status = %d\n", brick, obj, res, status);
|
BRICK_ERR("aspect init %p %p %p status = %d\n", aspect_type, obj, res, status);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -658,7 +648,19 @@ struct generic_aspect *generic_get_aspect(struct generic_brick *brick, struct ge
|
|||||||
|
|
||||||
res = obj->aspects[nr];
|
res = obj->aspects[nr];
|
||||||
if (!res) {
|
if (!res) {
|
||||||
res = _new_aspect(brick, obj);
|
const struct generic_object_type *object_type = obj->object_type;
|
||||||
|
const struct generic_brick_type *brick_type = brick->type;
|
||||||
|
const struct generic_aspect_type *aspect_type;
|
||||||
|
int object_type_nr;
|
||||||
|
|
||||||
|
CHECK_PTR_NULL(object_type, done);
|
||||||
|
CHECK_PTR_NULL(brick_type, done);
|
||||||
|
object_type_nr = object_type->object_type_nr;
|
||||||
|
aspect_type = brick_type->aspect_types[object_type_nr];
|
||||||
|
CHECK_PTR_NULL(aspect_type, done);
|
||||||
|
|
||||||
|
res = _new_aspect(aspect_type, obj);
|
||||||
|
|
||||||
obj->aspects[nr] = res;
|
obj->aspects[nr] = res;
|
||||||
}
|
}
|
||||||
CHECK_PTR(res, done);
|
CHECK_PTR(res, done);
|
||||||
|
Loading…
Reference in New Issue
Block a user