+long bt_object_get_ref_count(const void *);
+static inline
+void bt_object_set_parent(void *, void *);
+
+static
+void bt_object_release(void *ptr)
+{
+ struct bt_object *obj = ptr;
+
+ if (obj && obj->release && !bt_object_get_ref_count(obj)) {
+ obj->release(obj);
+ }
+}
+
+static
+void generic_release(struct bt_object *obj)
+{
+ if (obj->parent) {
+ /* The release function will be invoked by the parent. */
+ bt_put(obj->parent);
+ } else {
+ bt_object_release(obj);
+ }
+}
+
+static inline
+struct bt_object *bt_object_get_parent(void *ptr)
+{
+ struct bt_object *obj = ptr;
+
+ return ptr ? bt_get(obj->parent) : NULL;
+}
+
+static inline
+void bt_object_set_parent(void *child_ptr, void *parent)