Hi Emil, > On Feb 21, 2017, at 8:14 AM, Emil Velikov <[email protected]> wrote: > > From: Emil Velikov <[email protected]> > > With next commit we'll make wayland-util a shared library (for reasons > mentioned in the commit). As such we need to make sure that the private > symbols are somewhere that they can be used internally. Otherwise we'll > end up with link errors. > > v2: Rebase. > > Signed-off-by: Emil Velikov <[email protected]>
While others will have to chime in about the separate .so and approve patches 2 - 4, the remainder of this series is Reviewed-by: Yong Bakos <[email protected]> Tested-by: Yong Bakos <[email protected]> Regards, yong > --- > Makefile.am | 1 + > src/wayland-util-private.c | 303 +++++++++++++++++++++++++++++++++++++++++++++ > src/wayland-util.c | 272 +--------------------------------------- > 3 files changed, 305 insertions(+), 271 deletions(-) > create mode 100644 src/wayland-util-private.c > > diff --git a/Makefile.am b/Makefile.am > index d0c8bd3..7e15465 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -56,6 +56,7 @@ libwayland_private_la_SOURCES = \ > src/connection.c \ > src/wayland-os.c \ > src/wayland-os.h \ > + src/wayland-util-private.c \ > src/wayland-private.h > > include_HEADERS = \ > diff --git a/src/wayland-util-private.c b/src/wayland-util-private.c > new file mode 100644 > index 0000000..9861170 > --- /dev/null > +++ b/src/wayland-util-private.c > @@ -0,0 +1,303 @@ > +/* > + * Copyright © 2008-2011 Kristian Høgsberg > + * Copyright © 2011 Intel Corporation > + * > + * Permission is hereby granted, free of charge, to any person obtaining > + * a copy of this software and associated documentation files (the > + * "Software"), to deal in the Software without restriction, including > + * without limitation the rights to use, copy, modify, merge, publish, > + * distribute, sublicense, and/or sell copies of the Software, and to > + * permit persons to whom the Software is furnished to do so, subject to > + * the following conditions: > + * > + * The above copyright notice and this permission notice (including the > + * next paragraph) shall be included in all copies or substantial > + * portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND > + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS > + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN > + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN > + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE > + * SOFTWARE. > + */ > + > +#include <stdlib.h> > +#include <stdint.h> > +#include <stdio.h> > +#include <string.h> > +#include <stdarg.h> > + > +#include "wayland-private.h" > + > +/** \cond */ > + > +struct wl_object global_zombie_object; > + > +int > +wl_interface_equal(const struct wl_interface *a, const struct wl_interface > *b) > +{ > + /* In most cases the pointer equality test is sufficient. > + * However, in some cases, depending on how things are split > + * across shared objects, we can end up with multiple > + * instances of the interface metadata constants. So if the > + * pointers match, the interfaces are equal, if they don't > + * match we have to compare the interface names. > + */ > + return a == b || strcmp(a->name, b->name) == 0; > +} > + > +union map_entry { > + uintptr_t next; > + void *data; > +}; > + > +#define map_entry_is_free(entry) ((entry).next & 0x1) > +#define map_entry_get_data(entry) ((void *)((entry).next & ~(uintptr_t)0x3)) > +#define map_entry_get_flags(entry) (((entry).next >> 1) & 0x1) > + > +void > +wl_map_init(struct wl_map *map, uint32_t side) > +{ > + memset(map, 0, sizeof *map); > + map->side = side; > +} > + > +void > +wl_map_release(struct wl_map *map) > +{ > + wl_array_release(&map->client_entries); > + wl_array_release(&map->server_entries); > +} > + > +uint32_t > +wl_map_insert_new(struct wl_map *map, uint32_t flags, void *data) > +{ > + union map_entry *start, *entry; > + struct wl_array *entries; > + uint32_t base; > + > + if (map->side == WL_MAP_CLIENT_SIDE) { > + entries = &map->client_entries; > + base = 0; > + } else { > + entries = &map->server_entries; > + base = WL_SERVER_ID_START; > + } > + > + if (map->free_list) { > + start = entries->data; > + entry = &start[map->free_list >> 1]; > + map->free_list = entry->next; > + } else { > + entry = wl_array_add(entries, sizeof *entry); > + if (!entry) > + return 0; > + start = entries->data; > + } > + > + entry->data = data; > + entry->next |= (flags & 0x1) << 1; > + > + return (entry - start) + base; > +} > + > +int > +wl_map_insert_at(struct wl_map *map, uint32_t flags, uint32_t i, void *data) > +{ > + union map_entry *start; > + uint32_t count; > + struct wl_array *entries; > + > + if (i < WL_SERVER_ID_START) { > + entries = &map->client_entries; > + } else { > + entries = &map->server_entries; > + i -= WL_SERVER_ID_START; > + } > + > + count = entries->size / sizeof *start; > + if (count < i) > + return -1; > + > + if (count == i) > + wl_array_add(entries, sizeof *start); > + > + start = entries->data; > + start[i].data = data; > + start[i].next |= (flags & 0x1) << 1; > + > + return 0; > +} > + > +int > +wl_map_reserve_new(struct wl_map *map, uint32_t i) > +{ > + union map_entry *start; > + uint32_t count; > + struct wl_array *entries; > + > + if (i < WL_SERVER_ID_START) { > + if (map->side == WL_MAP_CLIENT_SIDE) > + return -1; > + > + entries = &map->client_entries; > + } else { > + if (map->side == WL_MAP_SERVER_SIDE) > + return -1; > + > + entries = &map->server_entries; > + i -= WL_SERVER_ID_START; > + } > + > + count = entries->size / sizeof *start; > + > + if (count < i) > + return -1; > + > + if (count == i) { > + wl_array_add(entries, sizeof *start); > + start = entries->data; > + start[i].data = NULL; > + } else { > + start = entries->data; > + if (start[i].data != NULL) { > + return -1; > + } > + } > + > + return 0; > +} > + > +void > +wl_map_remove(struct wl_map *map, uint32_t i) > +{ > + union map_entry *start; > + struct wl_array *entries; > + > + if (i < WL_SERVER_ID_START) { > + if (map->side == WL_MAP_SERVER_SIDE) > + return; > + > + entries = &map->client_entries; > + } else { > + if (map->side == WL_MAP_CLIENT_SIDE) > + return; > + > + entries = &map->server_entries; > + i -= WL_SERVER_ID_START; > + } > + > + start = entries->data; > + start[i].next = map->free_list; > + map->free_list = (i << 1) | 1; > +} > + > +void * > +wl_map_lookup(struct wl_map *map, uint32_t i) > +{ > + union map_entry *start; > + uint32_t count; > + struct wl_array *entries; > + > + if (i < WL_SERVER_ID_START) { > + entries = &map->client_entries; > + } else { > + entries = &map->server_entries; > + i -= WL_SERVER_ID_START; > + } > + > + start = entries->data; > + count = entries->size / sizeof *start; > + > + if (i < count && !map_entry_is_free(start[i])) > + return map_entry_get_data(start[i]); > + > + return NULL; > +} > + > +uint32_t > +wl_map_lookup_flags(struct wl_map *map, uint32_t i) > +{ > + union map_entry *start; > + uint32_t count; > + struct wl_array *entries; > + > + if (i < WL_SERVER_ID_START) { > + entries = &map->client_entries; > + } else { > + entries = &map->server_entries; > + i -= WL_SERVER_ID_START; > + } > + > + start = entries->data; > + count = entries->size / sizeof *start; > + > + if (i < count && !map_entry_is_free(start[i])) > + return map_entry_get_flags(start[i]); > + > + return 0; > +} > + > +static enum wl_iterator_result > +for_each_helper(struct wl_array *entries, wl_iterator_func_t func, void > *data) > +{ > + union map_entry *start, *end, *p; > + enum wl_iterator_result ret = WL_ITERATOR_CONTINUE; > + > + start = entries->data; > + end = (union map_entry *) ((char *) entries->data + entries->size); > + > + for (p = start; p < end; p++) > + if (p->data && !map_entry_is_free(*p)) { > + ret = func(map_entry_get_data(*p), data); > + if (ret != WL_ITERATOR_CONTINUE) > + break; > + } > + > + return ret; > +} > + > +void > +wl_map_for_each(struct wl_map *map, wl_iterator_func_t func, void *data) > +{ > + enum wl_iterator_result ret; > + > + ret = for_each_helper(&map->client_entries, func, data); > + if (ret == WL_ITERATOR_CONTINUE) > + for_each_helper(&map->server_entries, func, data); > +} > + > +static void > +wl_log_stderr_handler(const char *fmt, va_list arg) > +{ > + vfprintf(stderr, fmt, arg); > +} > + > +wl_log_func_t wl_log_handler = wl_log_stderr_handler; > + > +void > +wl_log(const char *fmt, ...) > +{ > + va_list argp; > + > + va_start(argp, fmt); > + wl_log_handler(fmt, argp); > + va_end(argp); > +} > + > +void > +wl_abort(const char *fmt, ...) > +{ > + va_list argp; > + > + va_start(argp, fmt); > + wl_log_handler(fmt, argp); > + va_end(argp); > + > + abort(); > +} > + > +/** \endcond */ > diff --git a/src/wayland-util.c b/src/wayland-util.c > index cab7fc5..bb91aa7 100644 > --- a/src/wayland-util.c > +++ b/src/wayland-util.c > @@ -30,8 +30,8 @@ > #include <string.h> > #include <stdarg.h> > > -#include "wayland-util.h" > #include "wayland-private.h" > +#include "wayland-util.h" > > WL_EXPORT void > wl_list_init(struct wl_list *list) > @@ -150,273 +150,3 @@ wl_array_copy(struct wl_array *array, struct wl_array > *source) > memcpy(array->data, source->data, source->size); > return 0; > } > - > -/** \cond */ > - > -struct wl_object global_zombie_object; > - > -int > -wl_interface_equal(const struct wl_interface *a, const struct wl_interface > *b) > -{ > - /* In most cases the pointer equality test is sufficient. > - * However, in some cases, depending on how things are split > - * across shared objects, we can end up with multiple > - * instances of the interface metadata constants. So if the > - * pointers match, the interfaces are equal, if they don't > - * match we have to compare the interface names. > - */ > - return a == b || strcmp(a->name, b->name) == 0; > -} > - > -union map_entry { > - uintptr_t next; > - void *data; > -}; > - > -#define map_entry_is_free(entry) ((entry).next & 0x1) > -#define map_entry_get_data(entry) ((void *)((entry).next & ~(uintptr_t)0x3)) > -#define map_entry_get_flags(entry) (((entry).next >> 1) & 0x1) > - > -void > -wl_map_init(struct wl_map *map, uint32_t side) > -{ > - memset(map, 0, sizeof *map); > - map->side = side; > -} > - > -void > -wl_map_release(struct wl_map *map) > -{ > - wl_array_release(&map->client_entries); > - wl_array_release(&map->server_entries); > -} > - > -uint32_t > -wl_map_insert_new(struct wl_map *map, uint32_t flags, void *data) > -{ > - union map_entry *start, *entry; > - struct wl_array *entries; > - uint32_t base; > - > - if (map->side == WL_MAP_CLIENT_SIDE) { > - entries = &map->client_entries; > - base = 0; > - } else { > - entries = &map->server_entries; > - base = WL_SERVER_ID_START; > - } > - > - if (map->free_list) { > - start = entries->data; > - entry = &start[map->free_list >> 1]; > - map->free_list = entry->next; > - } else { > - entry = wl_array_add(entries, sizeof *entry); > - if (!entry) > - return 0; > - start = entries->data; > - } > - > - entry->data = data; > - entry->next |= (flags & 0x1) << 1; > - > - return (entry - start) + base; > -} > - > -int > -wl_map_insert_at(struct wl_map *map, uint32_t flags, uint32_t i, void *data) > -{ > - union map_entry *start; > - uint32_t count; > - struct wl_array *entries; > - > - if (i < WL_SERVER_ID_START) { > - entries = &map->client_entries; > - } else { > - entries = &map->server_entries; > - i -= WL_SERVER_ID_START; > - } > - > - count = entries->size / sizeof *start; > - if (count < i) > - return -1; > - > - if (count == i) > - wl_array_add(entries, sizeof *start); > - > - start = entries->data; > - start[i].data = data; > - start[i].next |= (flags & 0x1) << 1; > - > - return 0; > -} > - > -int > -wl_map_reserve_new(struct wl_map *map, uint32_t i) > -{ > - union map_entry *start; > - uint32_t count; > - struct wl_array *entries; > - > - if (i < WL_SERVER_ID_START) { > - if (map->side == WL_MAP_CLIENT_SIDE) > - return -1; > - > - entries = &map->client_entries; > - } else { > - if (map->side == WL_MAP_SERVER_SIDE) > - return -1; > - > - entries = &map->server_entries; > - i -= WL_SERVER_ID_START; > - } > - > - count = entries->size / sizeof *start; > - > - if (count < i) > - return -1; > - > - if (count == i) { > - wl_array_add(entries, sizeof *start); > - start = entries->data; > - start[i].data = NULL; > - } else { > - start = entries->data; > - if (start[i].data != NULL) { > - return -1; > - } > - } > - > - return 0; > -} > - > -void > -wl_map_remove(struct wl_map *map, uint32_t i) > -{ > - union map_entry *start; > - struct wl_array *entries; > - > - if (i < WL_SERVER_ID_START) { > - if (map->side == WL_MAP_SERVER_SIDE) > - return; > - > - entries = &map->client_entries; > - } else { > - if (map->side == WL_MAP_CLIENT_SIDE) > - return; > - > - entries = &map->server_entries; > - i -= WL_SERVER_ID_START; > - } > - > - start = entries->data; > - start[i].next = map->free_list; > - map->free_list = (i << 1) | 1; > -} > - > -void * > -wl_map_lookup(struct wl_map *map, uint32_t i) > -{ > - union map_entry *start; > - uint32_t count; > - struct wl_array *entries; > - > - if (i < WL_SERVER_ID_START) { > - entries = &map->client_entries; > - } else { > - entries = &map->server_entries; > - i -= WL_SERVER_ID_START; > - } > - > - start = entries->data; > - count = entries->size / sizeof *start; > - > - if (i < count && !map_entry_is_free(start[i])) > - return map_entry_get_data(start[i]); > - > - return NULL; > -} > - > -uint32_t > -wl_map_lookup_flags(struct wl_map *map, uint32_t i) > -{ > - union map_entry *start; > - uint32_t count; > - struct wl_array *entries; > - > - if (i < WL_SERVER_ID_START) { > - entries = &map->client_entries; > - } else { > - entries = &map->server_entries; > - i -= WL_SERVER_ID_START; > - } > - > - start = entries->data; > - count = entries->size / sizeof *start; > - > - if (i < count && !map_entry_is_free(start[i])) > - return map_entry_get_flags(start[i]); > - > - return 0; > -} > - > -static enum wl_iterator_result > -for_each_helper(struct wl_array *entries, wl_iterator_func_t func, void > *data) > -{ > - union map_entry *start, *end, *p; > - enum wl_iterator_result ret = WL_ITERATOR_CONTINUE; > - > - start = entries->data; > - end = (union map_entry *) ((char *) entries->data + entries->size); > - > - for (p = start; p < end; p++) > - if (p->data && !map_entry_is_free(*p)) { > - ret = func(map_entry_get_data(*p), data); > - if (ret != WL_ITERATOR_CONTINUE) > - break; > - } > - > - return ret; > -} > - > -void > -wl_map_for_each(struct wl_map *map, wl_iterator_func_t func, void *data) > -{ > - enum wl_iterator_result ret; > - > - ret = for_each_helper(&map->client_entries, func, data); > - if (ret == WL_ITERATOR_CONTINUE) > - for_each_helper(&map->server_entries, func, data); > -} > - > -static void > -wl_log_stderr_handler(const char *fmt, va_list arg) > -{ > - vfprintf(stderr, fmt, arg); > -} > - > -wl_log_func_t wl_log_handler = wl_log_stderr_handler; > - > -void > -wl_log(const char *fmt, ...) > -{ > - va_list argp; > - > - va_start(argp, fmt); > - wl_log_handler(fmt, argp); > - va_end(argp); > -} > - > -void > -wl_abort(const char *fmt, ...) > -{ > - va_list argp; > - > - va_start(argp, fmt); > - wl_log_handler(fmt, argp); > - va_end(argp); > - > - abort(); > -} > - > -/** \endcond */ > -- > 2.11.0 > > _______________________________________________ > wayland-devel mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/wayland-devel --- Yong Joseph Bakos Instructor, Computer Science Innovation Center for Entrepreneurship OSU Cascades [email protected] (541) 322-2060 _______________________________________________ wayland-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/wayland-devel
