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 certainly have to chime in 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

Reply via email to