[PATCH wayland v2 2/4] wayland-util: split out private functionality to separate file
Bakos, Yong J
yong.bakos at osucascades.edu
Tue Mar 14 18:13:34 UTC 2017
Hi Emil,
> On Feb 21, 2017, at 8:14 AM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
>
> From: Emil Velikov <emil.velikov at collabora.com>
>
> 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 <emil.velikov at collabora.com>
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 <ybakos at humanoriented.com>
Tested-by: Yong Bakos <ybakos at humanoriented.com>
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
> wayland-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
---
Yong Joseph Bakos
Instructor, Computer Science
Innovation Center for Entrepreneurship
OSU Cascades
yong.bakos at osucascades.edu
(541) 322-2060
More information about the wayland-devel
mailing list