From 1dbef95fd9245c7f066a80f1f60d8c412565c545 Mon Sep 17 00:00:00 2001 From: Taekyun Kim Date: Wed, 8 Jul 2015 16:43:37 +0900 Subject: [PATCH] pepper: Output ID allocation. 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 | 15 +++++++++++++++ pepper/src/pepper-internal.h | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/pepper/src/output.c b/pepper/src/output.c index 36bd6d5..400e4ac 100644 --- a/pepper/src/output.c +++ b/pepper/src/output.c @@ -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) diff --git a/pepper/src/pepper-internal.h b/pepper/src/pepper-internal.h index 6d9d86c..1f94f52 100644 --- a/pepper/src/pepper-internal.h +++ b/pepper/src/pepper-internal.h @@ -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; -- 2.34.1