Adapt plugin system to use unified reference counting
[babeltrace.git] / plugins / component.c
index 6036fd501ec39020ff67d63d64b1f178dee5f6cb..c931ddf62053d42c400e5966d459aca109211795 100644 (file)
  * SOFTWARE.
  */
 
+#include <babeltrace/plugin/component.h>
 #include <babeltrace/plugin/component-internal.h>
 #include <babeltrace/babeltrace-internal.h>
 #include <babeltrace/compiler.h>
+#include <babeltrace/ref.h>
 
-static void bt_component_destroy(struct bt_ctf_ref *ref);
+static
+void bt_component_destroy(struct bt_object *obj)
+{
+       struct bt_component *component = NULL;
+       struct bt_component_class *component_class = NULL;
+
+       if (!obj) {
+               return;
+       }
+
+       component = container_of(obj, struct bt_component, base);
+
+       /**
+        * User data is destroyed first, followed by the concrete component
+        * instance.
+        */
+       assert(!component->user_data || component->user_destroy);
+       component->user_destroy(component->user_data);
+
+       g_string_free(component->name, TRUE);
+
+       assert(component->destroy);
+       component_class = component->class;
+
+       /* Frees the component, which becomes invalid */
+       component->destroy(component);
+       component = NULL;
+
+       bt_put(component_class);
+}
+
+BT_HIDDEN
+enum bt_component_status bt_component_init(struct bt_component *component,
+               struct bt_component_class *class, const char *name,
+               bt_component_destroy_cb destroy)
+{
+       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+
+       if (!component || !class || !name || name[0] == '\0' || !destroy) {
+               ret = BT_COMPONENT_STATUS_INVAL;
+               goto end;
+       }
+
+       bt_object_init(component, bt_component_destroy);
+       bt_get(class);
+       component->class = class;
+       component->name = g_string_new(name);
+       if (!component->name) {
+               ret = BT_COMPONENT_STATUS_NOMEM;
+               goto end;
+       }
+       component->destroy = destroy;
+end:
+       return ret;
+}
 
 const char *bt_component_get_name(struct bt_component *component)
 {
@@ -68,7 +124,7 @@ enum bt_component_type bt_component_get_type(struct bt_component *component)
                goto end;
        }
 
-       type = component->type;
+       type = component->class->type;
 end:
        return type;
 }
@@ -88,56 +144,9 @@ end:
        return ret;
 }
 
-void bt_component_get(struct bt_component *component)
-{
-       if (!component) {
-               return;
-       }
-
-       bt_ctf_ref_get(&component->ref_count);
-}
-
-void bt_component_put(struct bt_component *component)
-{
-       if (!component) {
-               return;
-       }
-
-       bt_ctf_ref_put(&component->ref_count, bt_component_destroy);
-}
-
-BT_HIDDEN
-enum bt_component_status bt_component_init(struct bt_component *component, const char *name,
-               void *user_data, bt_component_destroy_cb user_destroy_func,
-               enum bt_component_type component_type,
-               bt_component_destroy_cb component_destroy)
-{
-       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
-
-       if (!component || !name || name[0] == '\0' ||
-               !user_destroy_func || !user_data || !component_destroy) {
-               ret = BT_COMPONENT_STATUS_INVAL;
-               goto end;
-       }
-
-       bt_ctf_ref_init(&component->ref_count);
-       component->type = component_type;
-       component->user_data = user_data;
-       component->user_data_destroy = user_destroy_func;
-       component->destroy = component_destroy;
-
-       component->name = g_string_new(name);
-       if (!component->name) {
-               ret = BT_COMPONENT_STATUS_NOMEM;
-               goto end;
-       }
-end:
-       return ret;
-}
-
 void *bt_component_get_private_data(struct bt_component *component)
 {
-        void *ret = NULL;
+       void *ret = NULL;
 
        if (!component) {
                goto end;
@@ -163,27 +172,3 @@ bt_component_set_private_data(struct bt_component *component,
 end:
        return ret;
 }
-
-static
-void bt_component_destroy(struct bt_ctf_ref *ref)
-{
-       struct bt_component *component = NULL;
-
-       if (!ref) {
-               return;
-       }
-
-       component = container_of(ref, struct bt_component, ref_count);
-
-       /**
-        * User data is destroyed first, followed by the concrete component
-        * instance.
-        */
-       assert(!component->user_data || component->user_data_destroy);
-       component->user_data_destroy(component->user_data);
-
-       g_string_free(component->name, TRUE);
-
-       assert(component->destroy);
-       component->destroy(component);
-}
This page took 0.041399 seconds and 4 git commands to generate.