pepper: Unique 32bit ID for pepper_object_t 13/56913/1
authorTaekyun Kim <tkq.kim@samsung.com>
Wed, 13 Jan 2016 12:18:22 +0000 (21:18 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Wed, 13 Jan 2016 12:21:10 +0000 (21:21 +0900)
Added following two APIs
    - pepper_object_get_id()
    - pepper_object_from_id()

Change-Id: I39504a35a0fc356333a0e947bcd269be943b90e1

src/lib/pepper/object.c
src/lib/pepper/pepper-internal.h
src/lib/pepper/pepper.h

index cbe64592478d01ebad86fb1a6b4fe3e733303ae1..d7efafb9d8a3f3249b7ca6b62a402f650fcf84b0 100644 (file)
 
 #include "pepper-internal.h"
 
+#define PEPPER_OBJECT_MAP_BUCKET_BITS   8
+
+static pepper_id_allocator_t    id_allocator;
+static pepper_map_t            *object_map = NULL;
+
 pepper_object_t *
 pepper_object_alloc(pepper_object_type_t type, size_t size)
 {
@@ -50,6 +55,16 @@ pepper_object_init(pepper_object_t *object, pepper_object_type_t type)
 #else
     #error "Not 32 or 64bit system"
 #endif
+
+    if (!object_map)
+    {
+        pepper_id_allocator_init(&id_allocator);
+
+        object_map = pepper_map_int32_create(PEPPER_OBJECT_MAP_BUCKET_BITS);
+        PEPPER_CHECK(object_map, return, "pepper_map_int32_create() failed.\n");
+    }
+
+    object->id = pepper_id_allocator_alloc(&id_allocator);
 }
 
 void
@@ -62,6 +77,9 @@ pepper_object_fini(pepper_object_t *object)
 
     pepper_list_for_each_safe(listener, tmp, &object->event_listener_list, link)
         pepper_event_listener_remove(listener);
+
+    pepper_map_set(object_map, &object->id, NULL, NULL);
+    pepper_id_allocator_free(&id_allocator, object->id);
 }
 
 /**
@@ -226,3 +244,33 @@ pepper_object_emit_event(pepper_object_t *object, uint32_t id, void *info)
             listener->callback(listener, object, id, info, listener->data);
     }
 }
+
+/**
+ * Get an unique 32bit integer ID of the given object
+ *
+ * @param object    (none)
+ *
+ * @return unique 32bit integer ID
+ *
+ * @see pepper_object_from_id()
+ */
+PEPPER_API uint32_t
+pepper_object_get_id(pepper_object_t *object)
+{
+    return object->id;
+}
+
+/**
+ * Get an object from the given ID
+ *
+ * @param id    (none)
+ *
+ * @return pointer to the #pepper_object_t if exist, NULL otherwise
+ *
+ * @see pepper_object_get_id()
+ */
+PEPPER_API pepper_object_t *
+pepper_object_from_id(uint32_t id)
+{
+    return (pepper_object_t *)pepper_map_get(object_map, &id);
+}
index 361aefb4de0c16ad5043e2eaca4573998233fae7..6e4e0af480a35100cb3e4bb57f0bd96cd1ba41bb 100644 (file)
@@ -50,6 +50,7 @@ typedef struct pepper_touch_point   pepper_touch_point_t;
 struct pepper_object
 {
     pepper_object_type_t    type;
+    uint32_t                id;
     pepper_map_t            user_data_map;
     pepper_map_entry_t     *buckets[1 << PEPPER_OBJECT_BUCKET_BITS];
     pepper_list_t           event_listener_list;
index bcaaf43083a42aa1a650862e875706b0c830cc7f..85f6b7d9779654242618d4355e7e251994fd3130 100644 (file)
@@ -826,6 +826,12 @@ pepper_event_listener_set_priority(pepper_event_listener_t *listener, int priori
 PEPPER_API void
 pepper_object_emit_event(pepper_object_t *object, uint32_t id, void *info);
 
+PEPPER_API uint32_t
+pepper_object_get_id(pepper_object_t *object);
+
+PEPPER_API pepper_object_t *
+pepper_object_from_id(uint32_t id);
+
 PEPPER_API pepper_compositor_t *
 pepper_compositor_create(const char *socket_name);