diff --git a/brick.c b/brick.c index 705ebc89..26d9c195 100644 --- a/brick.c +++ b/brick.c @@ -405,6 +405,10 @@ int generic_brick_exit_recursively(struct generic_brick *brick, bool destroy_inp } EXPORT_SYMBOL_GPL(generic_brick_exit_recursively); +//////////////////////////////////////////////////////////////////////// + +// to disappear! + int generic_add_aspect(struct generic_output *output, struct generic_object_layout *object_layout, const struct generic_aspect_type *aspect_type) { struct generic_aspect_layout *aspect_layout; @@ -470,8 +474,75 @@ err: return status; } +/* Callback, usually called for each brick instance. + * Initialize the information for single aspect associated to a single brick. + */ +int default_make_object_layout(struct generic_output *output, struct generic_object_layout *object_layout) +{ + struct generic_brick *brick; + const struct generic_output_type *output_type; + const struct generic_object_type *object_type; + const struct generic_aspect_type *aspect_type; + int i; + int nr; + int aspect_size = 0; + int status = -EINVAL; -EXPORT_SYMBOL_GPL(generic_add_aspect); + if (unlikely(!output)) { + BRICK_ERR("output is missing\n"); + goto done; + } + if (unlikely(!object_layout || !object_layout->object_type)) { + BRICK_ERR("object_layout not inizialized\n"); + goto done; + } + brick = output->brick; + if (unlikely(!brick)) { + BRICK_ERR("brick is missing\n"); + goto done; + } + output_type = output->type; + if (unlikely(!output_type)) { + BRICK_ERR("output_type is missing\n"); + goto done; + } + object_type = object_layout->object_type; + if (unlikely(!object_type)) { + BRICK_ERR("object_type is missing\n"); + goto done; + } + nr = object_type->brick_obj_nr; + if (unlikely(nr < 0 || nr >= brick_obj_max)) { + BRICK_ERR("bad brick_obj_nr = %d\n", nr); + goto done; + } + aspect_type = output_type->aspect_types[nr]; + status = -ENOENT; + if (unlikely(!aspect_type)) { + BRICK_ERR("aspect type on %s does not exist\n", output_type->type_name); + goto done; + } + + aspect_size = aspect_type->aspect_size; + + for (i = 0; i < brick->type->max_inputs; i++) { + struct generic_input *input = brick->inputs[i]; + if (input && input->connect) { + int substatus = default_make_object_layout(input->connect, object_layout); + if (substatus < 0) + return substatus; + aspect_size += substatus; + } + } + + status = generic_add_aspect(output, object_layout, aspect_type); + +done: + if (status < 0) + return status; + + return aspect_size; +} //////////////////////////////////////////////////////////////////////// @@ -569,7 +640,7 @@ int default_init_object_layout(struct generic_output *output, struct generic_obj object_layout->free_list = NULL; object_layout->module_name = module_name; - status = output->ops->make_object_layout(output, object_layout); + status = default_make_object_layout(output, object_layout); if (unlikely(status < 0)) { object_layout->object_type = NULL; @@ -591,99 +662,6 @@ done: } EXPORT_SYMBOL_GPL(default_init_object_layout); -/* Callback, usually called for each brick instance. - * Initialize the information for single aspect associated to a single brick. - */ -int default_make_object_layout(struct generic_output *output, struct generic_object_layout *object_layout) -{ - struct generic_brick *brick; - const struct generic_output_type *output_type; - const struct generic_object_type *object_type; - const struct generic_aspect_type *aspect_type; - int nr; - int layout_code; - int aspect_size = 0; - int status = -EINVAL; - - if (unlikely(!output)) { - BRICK_ERR("output is missing\n"); - goto done; - } - if (unlikely(!object_layout || !object_layout->object_type)) { - BRICK_ERR("object_layout not inizialized\n"); - goto done; - } - brick = output->brick; - if (unlikely(!brick)) { - BRICK_ERR("brick is missing\n"); - goto done; - } - output_type = output->type; - if (unlikely(!output_type)) { - BRICK_ERR("output_type is missing\n"); - goto done; - } - object_type = object_layout->object_type; - if (unlikely(!object_type)) { - BRICK_ERR("object_type is missing\n"); - goto done; - } - nr = object_type->brick_obj_nr; - if (unlikely(nr < 0 || nr >= brick_obj_max)) { - BRICK_ERR("bad brick_obj_nr = %d\n", nr); - goto done; - } - layout_code = output_type->layout_code[nr]; - aspect_type = output_type->aspect_types[nr]; - status = -ENOENT; - if (unlikely(!aspect_type)) { - BRICK_ERR("aspect type on %s does not exist\n", output_type->type_name); - goto done; - } - - aspect_size = aspect_type->aspect_size; - - if (layout_code == LAYOUT_ALL) { - int i; - for (i = 0; i < brick->type->max_inputs; i++) { - struct generic_input *input = brick->inputs[i]; - if (input && input->connect) { - int substatus = input->connect->ops->make_object_layout(input->connect, object_layout); - if (substatus < 0) - return substatus; - aspect_size += substatus; - } - } - } else { - for (; layout_code != 0; layout_code >>= 8) { - unsigned int my_code = layout_code & 255; - struct generic_input *input; - int substatus; - if (my_code == 255) - break; - if (my_code >= brick->type->max_inputs) - continue; - input = brick->inputs[my_code]; - if (!input || !input->connect) - continue; - substatus = input->connect->ops->make_object_layout(input->connect, object_layout); - if (substatus < 0) - return substatus; - aspect_size += substatus; - } - } - - - status = generic_add_aspect(output, object_layout, aspect_type); - -done: - if (status < 0) - return status; - - return aspect_size; -} -EXPORT_SYMBOL_GPL(default_make_object_layout); - struct generic_object *alloc_generic(struct generic_object_layout *object_layout) { diff --git a/brick.h b/brick.h index ba9e6d71..902d59f6 100644 --- a/brick.h +++ b/brick.h @@ -258,7 +258,6 @@ struct generic_brick_ops { #define GENERIC_OUTPUT_OPS(BRICK) \ /*int (*output_start)(struct BRICK##_output *output);*/ \ /*int (*output_stop)(struct BRICK##_output *output);*/ \ - int (*make_object_layout)(struct BRICK##_output *output, struct generic_object_layout *object_layout); \ struct generic_output_ops { GENERIC_OUTPUT_OPS(generic) @@ -300,18 +299,11 @@ struct generic_input_type { int (*output_construct)(struct BRICK##_output *output); \ int (*output_destruct)(struct BRICK##_output *output); \ const struct generic_aspect_type **aspect_types; \ - const int layout_code[BRICK_OBJ_MAX]; \ struct generic_output_type { GENERIC_OUTPUT_TYPE(generic); }; -#define LAYOUT_NONE 0 -#define LAYOUT_ALL -1 -#define LAYOUT_1(X1) ((X1) | 255 << 8) -#define LAYOUT_2(X1,X2) ((X1) | (X2) << 8 | 255 << 16) -#define LAYOUT_3(X1,X2,X3) ((X1) | (X2) << 8 | (X3) << 16 | 255 << 24) - int generic_register_brick_type(const struct generic_brick_type *new_type); int generic_unregister_brick_type(const struct generic_brick_type *old_type); @@ -498,11 +490,6 @@ static inline int BRICK##_unregister_brick_type(void) \ return generic_unregister_brick_type((const struct generic_brick_type*)&BRICK##_brick_type); \ } \ \ -static inline int BRICK##_make_object_layout(struct BRICK##_output *output, struct generic_object_layout *object_layout) \ -{ \ - return default_make_object_layout((struct generic_output*)output, object_layout); \ -} \ - \ extern const struct BRICK##_brick_type BRICK##_brick_type; \ extern const struct BRICK##_input_type BRICK##_input_type; \ extern const struct BRICK##_output_type BRICK##_output_type; \ @@ -547,7 +534,7 @@ INLINE int BRICK##_output_init(struct BRICK##_brick *brick, int index, struct BR /* Define a pair of connectable subtypes. * For type safety, use this for all possible combinations. * Yes, this may become quadratic in large type systems, but - * (a) thou shalt not define many types, + * (a) thou shalt not define much types, * (b) these macros generate only definitions, but no additional * code at runtime. */ @@ -573,10 +560,6 @@ INLINE int INPUT_BRICK##_##OUTPUT_BRICK####_disconnect( \ // default operations on objects / aspects -extern int default_make_object_layout(struct generic_output *output, struct generic_object_layout *object_layout); - -extern int generic_add_aspect(struct generic_output *output, struct generic_object_layout *object_layout, const struct generic_aspect_type *aspect_type); - extern int default_init_object_layout(struct generic_output *output, struct generic_object_layout *object_layout, int aspect_max, const struct generic_object_type *object_type, char *module_name); extern void default_exit_object_layout(struct generic_object_layout *object_layout); @@ -584,24 +567,6 @@ extern struct generic_object *alloc_generic(struct generic_object_layout *object extern void free_generic(struct generic_object *object); -#define GENERIC_OBJECT_LAYOUT_FUNCTIONS(BRICK) \ - \ -INLINE int BRICK##_init_object_layout(struct BRICK##_output *output, struct generic_object_layout *object_layout, int aspect_max, const struct generic_object_type *object_type) \ -{ \ - if (likely(object_layout->aspect_layouts_table && object_layout->aspect_layouts && object_layout->object_layout_generation == brick_layout_generation)) \ - return 0; \ - return default_init_object_layout((struct generic_output*)output, object_layout, aspect_max, object_type, #BRICK); \ -} \ - -#define GENERIC_ASPECT_LAYOUT_FUNCTIONS(BRICK,TYPE) \ - \ -INLINE int BRICK##_##TYPE##_add_aspect(struct BRICK##_output *output, struct TYPE##_object_layout *object_layout, const struct generic_aspect_type *aspect_type) \ -{ \ - int res = generic_add_aspect((struct generic_output*)output, (struct generic_object_layout *)object_layout, aspect_type); \ - BRICK_DBG(#BRICK " " #TYPE "added aspect_type %p (%s) to object_layout %p (type %s) on output %p (type %s), status=%d\n", aspect_type, aspect_type->aspect_type_name, object_layout, object_layout->object_type->object_type_name, output, output->type->type_name, res); \ - return res; \ -} \ - #define GENERIC_OBJECT_FUNCTIONS(TYPE) \ \ INLINE struct TYPE##_object *TYPE##_construct(void *data, struct TYPE##_object_layout *object_layout) \ @@ -704,7 +669,6 @@ INLINE void BRICK##_free_##TYPE(struct TYPE##_object *object) \ } \ -GENERIC_OBJECT_LAYOUT_FUNCTIONS(generic); GENERIC_OBJECT_FUNCTIONS(generic); /////////////////////////////////////////////////////////////////////// diff --git a/mars.h b/mars.h index ff60983d..ff6667e5 100644 --- a/mars.h +++ b/mars.h @@ -237,8 +237,6 @@ _MARS_TYPES(BRICK) \ struct BRICK##_object_layout; \ \ GENERIC_MAKE_CONNECT(generic,BRICK); \ -GENERIC_OBJECT_LAYOUT_FUNCTIONS(BRICK); \ -GENERIC_ASPECT_LAYOUT_FUNCTIONS(BRICK,mref); \ GENERIC_ASPECT_FUNCTIONS(BRICK,mref); \ extern int init_mars_##BRICK(void); \ extern void exit_mars_##BRICK(void); @@ -251,7 +249,6 @@ GENERIC_OBJECT_FUNCTIONS(mref); // instantiate a pseudo base-class "mars" _MARS_TYPES(mars); -GENERIC_OBJECT_LAYOUT_FUNCTIONS(mars); GENERIC_ASPECT_FUNCTIONS(mars,mref); ///////////////////////////////////////////////////////////////////////// diff --git a/mars_aio.c b/mars_aio.c index 1ea1904a..071a3c5f 100644 --- a/mars_aio.c +++ b/mars_aio.c @@ -977,7 +977,6 @@ static struct aio_brick_ops aio_brick_ops = { }; static struct aio_output_ops aio_output_ops = { - .make_object_layout = aio_make_object_layout, .mref_get = aio_ref_get, .mref_put = aio_ref_put, .mref_io = aio_ref_io, @@ -1000,9 +999,6 @@ const struct aio_output_type aio_output_type = { .output_construct = &aio_output_construct, .output_destruct = &aio_output_destruct, .aspect_types = aio_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_NONE, - } }; static const struct aio_output_type *aio_output_types[] = { diff --git a/mars_bio.c b/mars_bio.c index d30f4e19..46ae3d91 100644 --- a/mars_bio.c +++ b/mars_bio.c @@ -616,7 +616,6 @@ static struct bio_brick_ops bio_brick_ops = { }; static struct bio_output_ops bio_output_ops = { - .make_object_layout = bio_make_object_layout, .mars_get_info = bio_get_info, .mref_get = bio_ref_get, .mref_put = bio_ref_put, @@ -639,9 +638,6 @@ const struct bio_output_type bio_output_type = { .output_construct = &bio_output_construct, .output_destruct = &bio_output_destruct, .aspect_types = bio_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static const struct bio_output_type *bio_output_types[] = { diff --git a/mars_buf.c b/mars_buf.c index 2a32cc6c..286caee6 100644 --- a/mars_buf.c +++ b/mars_buf.c @@ -1098,7 +1098,6 @@ static struct buf_brick_ops buf_brick_ops = { }; static struct buf_output_ops buf_output_ops = { - .make_object_layout = buf_make_object_layout, .mars_get_info = buf_get_info, .mref_get = buf_ref_get, .mref_put = buf_ref_put, @@ -1120,9 +1119,6 @@ const struct buf_output_type buf_output_type = { .master_ops = &buf_output_ops, .output_construct = &buf_output_construct, .aspect_types = buf_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static const struct buf_output_type *buf_output_types[] = { diff --git a/mars_check.c b/mars_check.c index 7124bfaf..35c48575 100644 --- a/mars_check.c +++ b/mars_check.c @@ -306,7 +306,6 @@ static struct check_brick_ops check_brick_ops = { }; static struct check_output_ops check_output_ops = { - .make_object_layout = check_make_object_layout, .mars_get_info = check_get_info, .mref_get = check_ref_get, .mref_put = check_ref_put, @@ -328,9 +327,6 @@ const struct check_output_type check_output_type = { .master_ops = &check_output_ops, .output_construct = &check_output_construct, .aspect_types = check_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static const struct check_output_type *check_output_types[] = { diff --git a/mars_client.c b/mars_client.c index 215950e6..57fa71f5 100644 --- a/mars_client.c +++ b/mars_client.c @@ -554,7 +554,6 @@ static struct client_brick_ops client_brick_ops = { }; static struct client_output_ops client_output_ops = { - .make_object_layout = client_make_object_layout, .mars_get_info = client_get_info, .mref_get = client_ref_get, .mref_put = client_ref_put, @@ -577,9 +576,6 @@ const struct client_output_type client_output_type = { .output_construct = &client_output_construct, .output_destruct = &client_output_destruct, .aspect_types = client_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static const struct client_output_type *client_output_types[] = { diff --git a/mars_copy.c b/mars_copy.c index 46c419c0..94da9e35 100644 --- a/mars_copy.c +++ b/mars_copy.c @@ -628,7 +628,6 @@ static struct copy_brick_ops copy_brick_ops = { }; static struct copy_output_ops copy_output_ops = { - .make_object_layout = copy_make_object_layout, .mars_get_info = copy_get_info, .mref_get = copy_ref_get, .mref_put = copy_ref_put, @@ -654,9 +653,6 @@ const struct copy_output_type copy_output_type = { .output_construct = ©_output_construct, .output_destruct = ©_output_destruct, .aspect_types = copy_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static const struct copy_output_type *copy_output_types[] = { diff --git a/mars_dummy.c b/mars_dummy.c index 8458efd8..40949b5d 100644 --- a/mars_dummy.c +++ b/mars_dummy.c @@ -135,7 +135,6 @@ struct dummy_brick_ops dummy_brick_ops = { static struct dummy_output_ops dummy_output_ops = { - .make_object_layout = dummy_make_object_layout, .mars_get_info = dummy_get_info, .mref_get = dummy_ref_get, .mref_put = dummy_ref_put, @@ -159,9 +158,6 @@ const struct dummy_output_type dummy_output_type = { .output_construct = &dummy_output_construct, .output_destruct = &dummy_output_destruct, .aspect_types = dummy_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static diff --git a/mars_if.c b/mars_if.c index b93f190a..77b88abe 100644 --- a/mars_if.c +++ b/mars_if.c @@ -792,7 +792,6 @@ static struct if_brick_ops if_brick_ops = { }; static struct if_output_ops if_output_ops = { - .make_object_layout = if_make_object_layout, }; const struct if_input_type if_input_type = { @@ -812,9 +811,6 @@ const struct if_output_type if_output_type = { .master_ops = &if_output_ops, .output_construct = &if_output_construct, .aspect_types = if_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static const struct if_output_type *if_output_types[] = { diff --git a/mars_server.c b/mars_server.c index 0ef409a5..b81813c0 100644 --- a/mars_server.c +++ b/mars_server.c @@ -519,7 +519,6 @@ static struct server_brick_ops server_brick_ops = { }; static struct server_output_ops server_output_ops = { - .make_object_layout = server_make_object_layout, .mars_get_info = server_get_info, .mref_get = server_ref_get, .mref_put = server_ref_put, @@ -541,9 +540,6 @@ const struct server_output_type server_output_type = { .master_ops = &server_output_ops, .output_construct = &server_output_construct, .aspect_types = server_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static const struct server_output_type *server_output_types[] = { diff --git a/mars_sio.c b/mars_sio.c index 264bed2e..e19a3b25 100644 --- a/mars_sio.c +++ b/mars_sio.c @@ -504,7 +504,6 @@ static struct sio_brick_ops sio_brick_ops = { }; static struct sio_output_ops sio_output_ops = { - .make_object_layout = sio_make_object_layout, .mref_get = sio_ref_get, .mref_put = sio_ref_put, .mref_io = sio_mars_queue, @@ -527,9 +526,6 @@ const struct sio_output_type sio_output_type = { .output_construct = &sio_output_construct, .output_destruct = &sio_output_destruct, .aspect_types = sio_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_NONE, - } }; static const struct sio_output_type *sio_output_types[] = { diff --git a/mars_trans_logger.c b/mars_trans_logger.c index 0a12a1d9..ba1f55b0 100644 --- a/mars_trans_logger.c +++ b/mars_trans_logger.c @@ -2639,7 +2639,6 @@ static struct trans_logger_brick_ops trans_logger_brick_ops = { }; static struct trans_logger_output_ops trans_logger_output_ops = { - .make_object_layout = trans_logger_make_object_layout, .mars_get_info = trans_logger_get_info, .mref_get = trans_logger_ref_get, .mref_put = trans_logger_ref_put, @@ -2667,9 +2666,6 @@ const struct trans_logger_output_type trans_logger_output_type = { .master_ops = &trans_logger_output_ops, .output_construct = &trans_logger_output_construct, .aspect_types = trans_logger_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static const struct trans_logger_output_type *trans_logger_output_types[] = { diff --git a/mars_usebuf.c b/mars_usebuf.c index c2fe67cf..32c2c031 100644 --- a/mars_usebuf.c +++ b/mars_usebuf.c @@ -330,7 +330,6 @@ static struct usebuf_brick_ops usebuf_brick_ops = { }; static struct usebuf_output_ops usebuf_output_ops = { - .make_object_layout = usebuf_make_object_layout, .mars_get_info = usebuf_get_info, .mref_get = usebuf_ref_get, .mref_put = usebuf_ref_put, @@ -352,9 +351,6 @@ const struct usebuf_output_type usebuf_output_type = { .master_ops = &usebuf_output_ops, .output_construct = &usebuf_output_construct, .aspect_types = usebuf_aspect_types, - .layout_code = { - [BRICK_OBJ_MREF] = LAYOUT_ALL, - } }; static const struct usebuf_output_type *usebuf_output_types[] = {