[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