X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fcomponent%2Fcomponent-class.c;h=22551f88c54c60d55a3da428adab72b71937e30b;hb=d3e4dcd8e7a601e0aa063455147f29fbe051582b;hp=1e1e8388c8ca7e8f5a5313ac20911ab949f89992;hpb=33b34c437c354e1c065e33151135bc2e57e2e29c;p=babeltrace.git diff --git a/lib/component/component-class.c b/lib/component/component-class.c index 1e1e8388..22551f88 100644 --- a/lib/component/component-class.c +++ b/lib/component/component-class.c @@ -42,9 +42,9 @@ void bt_component_class_destroy(struct bt_object *obj) /* Call destroy listeners in reverse registration order */ for (i = class->destroy_listeners->len - 1; i >= 0; i--) { - struct bt_component_class_destroyer_listener *listener = + struct bt_component_class_destroy_listener *listener = &g_array_index(class->destroy_listeners, - struct bt_component_class_destroyer_listener, + struct bt_component_class_destroy_listener, i); listener->func(class, listener->data); @@ -63,34 +63,188 @@ void bt_component_class_destroy(struct bt_object *obj) g_free(class); } -struct bt_component_class *bt_component_class_create( - enum bt_component_type type, const char *name, - const char *description, bt_component_init_cb init) +static +int bt_component_class_init(struct bt_component_class *class, + enum bt_component_class_type type, const char *name) { - struct bt_component_class *class; - - class = g_new0(struct bt_component_class, 1); - if (!class) { - goto end; - } + int ret = 0; bt_object_init(class, bt_component_class_destroy); class->type = type; - class->init = init; class->name = g_string_new(name); - class->description = g_string_new(description); - if (!class->name || !class->description) { - BT_PUT(class); - goto end; + if (!class->name) { + goto error; } + + class->description = g_string_new(NULL); + if (!class->description) { + goto error; + } + class->destroy_listeners = g_array_new(FALSE, TRUE, - sizeof(struct bt_component_class_destroyer_listener)); + sizeof(struct bt_component_class_destroy_listener)); if (!class->destroy_listeners) { - BT_PUT(class); + goto error; + } + + goto end; + +error: + BT_PUT(class); + ret = -1; + +end: + return ret; +} + +struct bt_component_class *bt_component_class_source_create(const char *name, + bt_component_class_source_init_iterator_method init_iterator_method) +{ + struct bt_component_class_source *source_class = NULL; + int ret; + + if (!name || !init_iterator_method) { + goto end; + } + + source_class = g_new0(struct bt_component_class_source, 1); + if (!source_class) { + goto end; + } + + ret = bt_component_class_init(&source_class->parent, + BT_COMPONENT_CLASS_TYPE_SOURCE, name); + if (ret) { + /* + * If bt_component_class_init() fails, the component + * class is put, therefore its memory is already + * freed. + */ + source_class = NULL; + goto end; + } + + source_class->methods.init_iterator = init_iterator_method; + +end: + return &source_class->parent; +} + +struct bt_component_class *bt_component_class_filter_create(const char *name, + bt_component_class_filter_init_iterator_method init_iterator_method) +{ + struct bt_component_class_filter *filter_class = NULL; + int ret; + + if (!name || !init_iterator_method) { + goto end; + } + + filter_class = g_new0(struct bt_component_class_filter, 1); + if (!filter_class) { + goto end; + } + + ret = bt_component_class_init(&filter_class->parent, + BT_COMPONENT_CLASS_TYPE_FILTER, name); + if (ret) { + /* + * If bt_component_class_init() fails, the component + * class is put, therefore its memory is already + * freed. + */ + filter_class = NULL; + goto end; + } + + filter_class->methods.init_iterator = init_iterator_method; + +end: + return &filter_class->parent; +} + +struct bt_component_class *bt_component_class_sink_create(const char *name, + bt_component_class_sink_consume_method consume_method) +{ + struct bt_component_class_sink *sink_class = NULL; + int ret; + + if (!name || !consume_method) { + goto end; + } + + sink_class = g_new0(struct bt_component_class_sink, 1); + if (!sink_class) { + goto end; + } + + ret = bt_component_class_init(&sink_class->parent, + BT_COMPONENT_CLASS_TYPE_SINK, name); + if (ret) { + /* + * If bt_component_class_init() fails, the component + * class is put, therefore its memory is already + * freed. + */ + sink_class = NULL; + goto end; + } + + sink_class->methods.consume = consume_method; + +end: + return &sink_class->parent; +} + +int bt_component_class_set_init_method( + struct bt_component_class *component_class, + bt_component_class_init_method init_method) +{ + int ret = 0; + + if (!component_class || !init_method) { + ret = -1; + goto end; + } + + component_class->methods.init = init_method; + +end: + return ret; +} + +int bt_component_class_set_destroy_method( + struct bt_component_class *component_class, + bt_component_class_destroy_method destroy_method) +{ + int ret = 0; + + if (!component_class || !destroy_method) { + ret = -1; goto end; } + + component_class->methods.destroy = destroy_method; + end: - return class; + return ret; +} + +extern int bt_component_class_set_description( + struct bt_component_class *component_class, + const char *description) +{ + int ret = 0; + + if (!component_class || !description) { + ret = -1; + goto end; + } + + g_string_assign(component_class->description, description); + +end: + return ret; } const char *bt_component_class_get_name( @@ -99,17 +253,18 @@ const char *bt_component_class_get_name( return component_class ? component_class->name->str : NULL; } -enum bt_component_type bt_component_class_get_type( +enum bt_component_class_type bt_component_class_get_type( struct bt_component_class *component_class) { return component_class ? component_class->type : - BT_COMPONENT_TYPE_UNKNOWN; + BT_COMPONENT_CLASS_TYPE_UNKNOWN; } const char *bt_component_class_get_description( struct bt_component_class *component_class) { - return component_class ? component_class->description->str : NULL; + return component_class && component_class->description ? + component_class->description->str : NULL; } BT_HIDDEN @@ -117,7 +272,7 @@ int bt_component_class_add_destroy_listener(struct bt_component_class *class, bt_component_class_destroy_listener_func func, void *data) { int ret = 0; - struct bt_component_class_destroyer_listener listener; + struct bt_component_class_destroy_listener listener; if (!class || !func) { ret = -1; @@ -131,3 +286,46 @@ int bt_component_class_add_destroy_listener(struct bt_component_class *class, end: return ret; } + +extern int bt_component_class_sink_set_add_iterator_method( + struct bt_component_class *component_class, + bt_component_class_sink_add_iterator_method add_iterator_method) +{ + struct bt_component_class_sink *sink_class; + int ret = 0; + + if (!component_class || !add_iterator_method || + component_class->type != BT_COMPONENT_CLASS_TYPE_SINK) { + ret = -1; + goto end; + } + + sink_class = container_of(component_class, + struct bt_component_class_sink, parent); + sink_class->methods.add_iterator = add_iterator_method; + +end: + return ret; +} + +extern int bt_component_class_filter_set_add_iterator_method( + struct bt_component_class *component_class, + bt_component_class_filter_add_iterator_method add_iterator_method) +{ + struct bt_component_class_filter *filter_class; + int ret = 0; + + if (!component_class || !add_iterator_method || + component_class->type != + BT_COMPONENT_CLASS_TYPE_FILTER) { + ret = -1; + goto end; + } + + filter_class = container_of(component_class, + struct bt_component_class_filter, parent); + filter_class->methods.add_iterator = add_iterator_method; + +end: + return ret; +}