pepper: Output ID allocation.
authorTaekyun Kim <tkq.kim@samsung.com>
Wed, 8 Jul 2015 07:43:37 +0000 (16:43 +0900)
committerTaekyun Kim <tkq.kim@samsung.com>
Wed, 8 Jul 2015 09:49:40 +0000 (18:49 +0900)
It is useful allocating an integer ID for an output. We allocate a bit in a
32-bits unsigned integer. In this way, we don't have to maintain a list of
outputs and checking whether an integer contains a certain output is much
easier.

Change-Id: I42a4b309b6b94b8a9ca20f4b6c526e23922b96a6

pepper/src/output.c
pepper/src/pepper-internal.h

index 36bd6d5..400e4ac 100644 (file)
@@ -185,9 +185,20 @@ pepper_compositor_add_output(pepper_object_t *cmp,
 {
     pepper_output_t        *output;
     pepper_compositor_t    *compositor = (pepper_compositor_t *)cmp;
+    uint32_t                id;
 
     CHECK_MAGIC_AND_NON_NULL(cmp, PEPPER_COMPOSITOR);
 
+    id = ffs(~compositor->output_id_allocator);
+
+    if (id == 0)
+    {
+        PEPPER_ERROR("No available output ids.\n");
+        return NULL;
+    }
+
+    id = id - 1;
+
     output = (pepper_output_t *)pepper_object_alloc(sizeof(pepper_output_t), PEPPER_OUTPUT);
     if (!output)
         return NULL;
@@ -205,6 +216,9 @@ pepper_compositor_add_output(pepper_object_t *cmp,
         return NULL;
     }
 
+    output->id = id;
+    compositor->output_id_allocator |= (1 << output->id);
+
     /* Create backend-side object. */
     output->backend = (pepper_output_backend_t *)backend;
     output->data = data;
@@ -256,6 +270,7 @@ pepper_output_destroy(pepper_object_t *out)
 
     pepper_object_fini(&output->base);
 
+    output->compositor->output_id_allocator &= ~(1 << output->id);
     wl_list_remove(&output->link);
 
     if (output->backend && output->data)
index 6d9d86c..1f94f52 100644 (file)
@@ -43,6 +43,8 @@ typedef struct pepper_touch         pepper_touch_t;
             CHECK_MAGIC(obj, val);                                              \
     } while (0)
 
+#define PEPPER_MAX_OUTPUT_ID    32
+
 typedef struct pepper_region        pepper_region_t;
 typedef struct pepper_surface_state pepper_surface_state_t;
 typedef struct pepper_data_source   pepper_data_source_t;
@@ -89,6 +91,7 @@ struct pepper_compositor
     struct wl_list      regions;
     struct wl_list      seat_list;
     struct wl_list      output_list;
+    uint32_t            output_id_allocator;
     struct wl_list      event_hook_chain;
     pepper_list_t       root_view_list;
     pepper_list_t       view_list;
@@ -98,6 +101,7 @@ struct pepper_output
 {
     pepper_object_t             base;
     pepper_compositor_t        *compositor;
+    uint32_t                    id;
 
     struct wl_global           *global;
     struct wl_list              resources;