From ee155b771ddb8f063105f013c652b65f2ff663c1 Mon Sep 17 00:00:00 2001 From: Stefan Schmidt Date: Fri, 11 Oct 2013 09:32:09 +0100 Subject: [PATCH] Revert "Revert "eina: use Eina_Spinlock for Eina_Chained_Mempool."" You can bet on reverting makes people speed up the process in fixing it. Revert the revert here now that Cedric fixed it in eina. This reverts commit 875e7cf74de68d05f6fd28d26ad8bddab7782316. --- ChangeLog | 3 +- NEWS | 2 +- src/Makefile_Ecore_Wayland.am | 1 - src/lib/ecore_wayland/Ecore_Wayland.h | 92 ---------- src/lib/ecore_wayland/ecore_wl.c | 8 - src/lib/ecore_wayland/ecore_wl_private.h | 2 - src/lib/ecore_wayland/ecore_wl_subsurf.c | 191 --------------------- src/lib/ecore_wayland/ecore_wl_window.c | 2 - .../eina/mp/chained_pool/eina_chained_mempool.c | 20 +-- 9 files changed, 13 insertions(+), 308 deletions(-) delete mode 100644 src/lib/ecore_wayland/ecore_wl_subsurf.c diff --git a/ChangeLog b/ChangeLog index bc5ce0c..ba374ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,7 +8,8 @@ 2013-10-11 Cedric Bail * Eina: add Eina_Spinlock API, - use Eina_Spinlock in Eina_Log, replace Eina_Lock by Eina_Spinlock in Eina_Stringshare. + use Eina_Spinlock in Eina_Log, replace Eina_Lock by Eina_Spinlock in Eina_Stringshare, + Eina_Chained_Mempool. * Eet: replace Eina_Lock by Eina_Spinlock in Eet_Dictionnary. * Evas: replace Eina_Lock by Eina_Spinlock in Evas_ScaleCache, Evas_Async_Events and Image_Entry. * Ecore: use Eina_Spinlock for Ecore_Thread. diff --git a/NEWS b/NEWS index fa799cb..210b8f5 100644 --- a/NEWS +++ b/NEWS @@ -200,7 +200,7 @@ Improvements: - Eina_Tiler now take tile size into account. - Improve support for 64bits system. - eina_strlcat now work with a NULL source. - - Use Eina_Spinlock for eina_log, eina_stringshare. + - Use Eina_Spinlock for eina_log, eina_stringshare and chained_mempool. * Eet: - Display more information with eet -l -v. - Force thread to always run during eet_cache_concurrency test. diff --git a/src/Makefile_Ecore_Wayland.am b/src/Makefile_Ecore_Wayland.am index b2c66a1..607d26e 100644 --- a/src/Makefile_Ecore_Wayland.am +++ b/src/Makefile_Ecore_Wayland.am @@ -14,7 +14,6 @@ lib/ecore_wayland/ecore_wl_dnd.c \ lib/ecore_wayland/ecore_wl_input.c \ lib/ecore_wayland/ecore_wl_output.c \ lib/ecore_wayland/ecore_wl_window.c \ -lib/ecore_wayland/ecore_wl_subsurf.c \ lib/ecore_wayland/ecore_wl_private.h lib_ecore_wayland_libecore_wayland_la_BUILT_SOURCES = \ diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h b/src/lib/ecore_wayland/Ecore_Wayland.h index 30545b7..05ceb00 100644 --- a/src/lib/ecore_wayland/Ecore_Wayland.h +++ b/src/lib/ecore_wayland/Ecore_Wayland.h @@ -35,7 +35,6 @@ typedef struct _Ecore_Wl_Display Ecore_Wl_Display; typedef struct _Ecore_Wl_Output Ecore_Wl_Output; typedef struct _Ecore_Wl_Input Ecore_Wl_Input; typedef struct _Ecore_Wl_Global Ecore_Wl_Global; /** @since 1.7.6 */ -typedef struct _Ecore_Wl_Subsurf Ecore_Wl_Subsurf; /** @since 1.8 */ # ifndef _ECORE_WAYLAND_WINDOW_PREDEF typedef struct _Ecore_Wl_Window Ecore_Wl_Window; @@ -102,7 +101,6 @@ struct _Ecore_Wl_Display struct wl_display *display; struct wl_registry *registry; struct wl_compositor *compositor; - struct wl_subcompositor *subcompositor; struct wl_shell *shell; struct wl_shell *desktop_shell; struct wl_shm *shm; @@ -253,8 +251,6 @@ struct _Ecore_Wl_Window /* FIXME: Ideally we should record the cursor name for this window * so we can compare and avoid unnecessary cursor set calls to wayland */ - Ecore_Wl_Subsurf *subsurfs; - void *data; }; @@ -385,7 +381,6 @@ struct _Ecore_Wl_Event_Interfaces_Bound * @li @ref Ecore_Wl_Window_Group * @li @ref Ecore_Wl_Input_Group * @li @ref Ecore_Wl_Dnd_Group - * @li @ref Ecore_Wl_Subsurf */ EAPI extern int ECORE_WL_EVENT_MOUSE_IN; @@ -869,93 +864,6 @@ EAPI struct wl_array *ecore_wl_dnd_drag_types_get(Ecore_Wl_Input *input); EAPI void ecore_wl_server_mode_set(Eina_Bool on); -/** - * @defgroup Ecore_Wl_Subsurf Functions to manipulate subsurfaces. - * @ingroup Ecore_Wl_Group - * - * Functions to manipulate wayland subsurfaces, using Ecore_Wl_Subsurf. - * - * This API is intended to expose Wayland subsurface functionality, although it - * should not be necessary for most applications to use it, as soon as we have - * means to make Evas automatically switch Evas images to use subsurfaces. - * - * It can/should be used, for instance, when subsurfaces are needed to be not - * in sync with the main window surface. - */ - -/** - * Create and return a new subsurface. - * - * Create a new surface (and subsurface interface), with the parent surface - * being the one associated with the given @param win. - * - * The @param win must be visible, otherwise there will be no surface created - * for it yet. - * - * @ingroup Ecore_Wl_Subsurf - * @since 1.8 - */ -EAPI Ecore_Wl_Subsurf *ecore_wl_subsurf_create(Ecore_Wl_Window *win); - -/** - * Destroy the given subsurface, as well as the surface associated with it. - * - * @ingroup Ecore_Wl_Subsurf - * @since 1.8 - */ -EAPI void ecore_wl_subsurf_del(Ecore_Wl_Subsurf *ess); - -/** - * Return the wl_surface associated with this subsurface. - * - * @ingroup Ecore_Wl_Subsurf - * @since 1.8 - */ -EAPI struct wl_surface *ecore_wl_subsurf_surface_get(Ecore_Wl_Subsurf *ess); - -/** - * Set the position of this subsurface, relative to its parent surface. - * - * @ingroup Ecore_Wl_Subsurf - * @since 1.8 - */ -EAPI void ecore_wl_subsurf_position_set(Ecore_Wl_Subsurf *ess, int x, int y); - -/** - * Get the position of this subsurface, relative to its parent surface. - * - * @ingroup Ecore_Wl_Subsurf - * @since 1.8 - */ -EAPI void ecore_wl_subsurf_position_get(Ecore_Wl_Subsurf *ess, int *x, int *y); - -/** - * @ingroup Ecore_Wl_Subsurf - * @since 1.8 - */ -EAPI void ecore_wl_subsurf_place_above(Ecore_Wl_Subsurf *ess, struct wl_surface *surface); - -/** - * @ingroup Ecore_Wl_Subsurf - * @since 1.8 - */ -EAPI void ecore_wl_subsurf_place_below(Ecore_Wl_Subsurf *ess, struct wl_surface *surface); - -/** - * @ingroup Ecore_Wl_Subsurf - * @since 1.8 - */ -EAPI void ecore_wl_subsurf_sync_set(Ecore_Wl_Subsurf *ess, Eina_Bool val); - -/** - * Set an opaque region for the given subsurface. - * - * Use a 0x0 region size to unset the opaque region. - * - * @ingroup Ecore_Wl_Subsurf - * @since 1.8 - */ -EAPI void ecore_wl_subsurf_opaque_region_set(Ecore_Wl_Subsurf *ess, int x, int y, int w, int h); #ifdef __cplusplus } #endif diff --git a/src/lib/ecore_wayland/ecore_wl.c b/src/lib/ecore_wayland/ecore_wl.c index ee614e0..acce728 100644 --- a/src/lib/ecore_wayland/ecore_wl.c +++ b/src/lib/ecore_wayland/ecore_wl.c @@ -4,7 +4,6 @@ #include #include "ecore_wl_private.h" -#include /* local function prototypes */ static Eina_Bool _ecore_wl_shutdown(Eina_Bool close); @@ -398,8 +397,6 @@ _ecore_wl_shutdown(Eina_Bool close) wl_data_device_manager_destroy(_ecore_wl_disp->wl.data_device_manager); if (_ecore_wl_disp->wl.compositor) wl_compositor_destroy(_ecore_wl_disp->wl.compositor); - if (_ecore_wl_disp->wl.subcompositor) - wl_subcompositor_destroy(_ecore_wl_disp->wl.subcompositor); if (_ecore_wl_disp->wl.display) { wl_registry_destroy(_ecore_wl_disp->wl.registry); @@ -518,11 +515,6 @@ _ecore_wl_cb_handle_global(void *data, struct wl_registry *registry, unsigned in ewd->wl.compositor = wl_registry_bind(registry, id, &wl_compositor_interface, 3); } - else if (!strcmp(interface, "wl_subcompositor")) - { - ewd->wl.subcompositor = - wl_registry_bind(registry, id, &wl_subcompositor_interface, 1); - } else if (!strcmp(interface, "wl_output")) _ecore_wl_output_add(ewd, id); else if (!strcmp(interface, "wl_seat")) diff --git a/src/lib/ecore_wayland/ecore_wl_private.h b/src/lib/ecore_wayland/ecore_wl_private.h index b83aae3..dc034af 100644 --- a/src/lib/ecore_wayland/ecore_wl_private.h +++ b/src/lib/ecore_wayland/ecore_wl_private.h @@ -95,6 +95,4 @@ void _ecore_wl_dnd_del(Ecore_Wl_Dnd_Source *source); void _ecore_wl_events_init(void); void _ecore_wl_events_shutdown(void); -void _ecore_wl_subsurfs_del_all(Ecore_Wl_Window *win); - #endif diff --git a/src/lib/ecore_wayland/ecore_wl_subsurf.c b/src/lib/ecore_wayland/ecore_wl_subsurf.c deleted file mode 100644 index 4e144fa..0000000 --- a/src/lib/ecore_wayland/ecore_wl_subsurf.c +++ /dev/null @@ -1,191 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "ecore_wl_private.h" -#include - -struct _Ecore_Wl_Subsurf -{ - EINA_INLIST; - Ecore_Wl_Window *parent_win; - struct wl_surface *surface; - struct wl_subsurface *subsurface; - - int x, y; - - Eina_Bool sync : 1; -}; - -EAPI Ecore_Wl_Subsurf * -ecore_wl_subsurf_create(Ecore_Wl_Window *win) -{ - struct wl_subsurface *subsurface; - struct wl_surface *surface; - Ecore_Wl_Subsurf *ess; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!win) return NULL; - if (!win->surface) return NULL; - if (!_ecore_wl_disp->wl.subcompositor) return NULL; - - surface = wl_compositor_create_surface(_ecore_wl_disp->wl.compositor); - if (!surface) - return NULL; - - subsurface = wl_subcompositor_get_subsurface - (_ecore_wl_disp->wl.subcompositor, surface, win->surface); - if (!subsurface) - { - wl_surface_destroy(surface); - return NULL; - } - - ess = calloc(1, sizeof(*ess)); - ess->surface = surface; - ess->subsurface = subsurface; - ess->parent_win = win; - - win->subsurfs = (Ecore_Wl_Subsurf *)eina_inlist_append - (EINA_INLIST_GET(win->subsurfs), EINA_INLIST_GET(ess)); - - return ess; -} - -static void -_ecore_wl_subsurf_destroy(Ecore_Wl_Subsurf *ess) -{ - Ecore_Wl_Window *parent; - - wl_subsurface_destroy(ess->subsurface); - wl_surface_destroy(ess->surface); - - parent = ess->parent_win; - parent->subsurfs = (Ecore_Wl_Subsurf *)eina_inlist_remove - (EINA_INLIST_GET(parent->subsurfs), EINA_INLIST_GET(ess)); - - free(ess); -} - -EAPI void -ecore_wl_subsurf_del(Ecore_Wl_Subsurf *ess) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ess) return; - - _ecore_wl_subsurf_destroy(ess); -} - -void -_ecore_wl_subsurfs_del_all(Ecore_Wl_Window *win) -{ - Ecore_Wl_Subsurf *ess; - - if (!win) return; - - EINA_INLIST_FREE(win->subsurfs, ess) - { - _ecore_wl_subsurf_destroy(ess); - } -} - -EAPI struct wl_surface * -ecore_wl_subsurf_surface_get(Ecore_Wl_Subsurf *ess) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ess) return NULL; - - return ess->surface; -} - -EAPI void -ecore_wl_subsurf_position_set(Ecore_Wl_Subsurf *ess, int x, int y) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ess) return; - - if ((x == ess->x) && (y == ess->y)) - return; - - ess->x = x; - ess->y = y; - - wl_subsurface_set_position(ess->subsurface, x, y); -} - -EAPI void -ecore_wl_subsurf_position_get(Ecore_Wl_Subsurf *ess, int *x, int *y) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ess) return; - - if (x) *x = ess->x; - if (y) *y = ess->y; -} - -EAPI void -ecore_wl_subsurf_place_above(Ecore_Wl_Subsurf *ess, struct wl_surface *surface) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ess) return; - if (!surface) return; - - wl_subsurface_place_above(ess->subsurface, surface); -} - -EAPI void -ecore_wl_subsurf_place_below(Ecore_Wl_Subsurf *ess, struct wl_surface *surface) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ess) return; - if (!surface) return; - - wl_subsurface_place_below(ess->subsurface, surface); -} - -EAPI void -ecore_wl_subsurf_sync_set(Ecore_Wl_Subsurf *ess, Eina_Bool val) -{ - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ess) return; - - val = !!val; - if (val == ess->sync) return; - - ess->sync = val; - - if (ess->sync) - wl_subsurface_set_sync(ess->subsurface); - else - wl_subsurface_set_desync(ess->subsurface); -} - -EAPI void -ecore_wl_subsurf_opaque_region_set(Ecore_Wl_Subsurf *ess, int x, int y, int w, int h) -{ - Ecore_Wl_Window *parent; - struct wl_region *region = NULL; - - LOGFN(__FILE__, __LINE__, __FUNCTION__); - - if (!ess) return; - - if ((w > 0) && (h > 0)) - { - parent = ess->parent_win; - region = wl_compositor_create_region(parent->display->wl.compositor); - wl_region_add(region, x, y, w, h); - wl_surface_set_opaque_region(ess->surface, region); - wl_region_destroy(region); - } - else - wl_surface_set_opaque_region(ess->surface, NULL); -} diff --git a/src/lib/ecore_wayland/ecore_wl_window.c b/src/lib/ecore_wayland/ecore_wl_window.c index 4ec78c8..cd5aabe 100644 --- a/src/lib/ecore_wayland/ecore_wl_window.c +++ b/src/lib/ecore_wayland/ecore_wl_window.c @@ -114,8 +114,6 @@ ecore_wl_window_free(Ecore_Wl_Window *win) if (win->anim_callback) wl_callback_destroy(win->anim_callback); win->anim_callback = NULL; - if (win->subsurfs) _ecore_wl_subsurfs_del_all(win); - if (win->shell_surface) wl_shell_surface_destroy(win->shell_surface); win->shell_surface = NULL; if (win->surface) wl_surface_destroy(win->surface); diff --git a/src/modules/eina/mp/chained_pool/eina_chained_mempool.c b/src/modules/eina/mp/chained_pool/eina_chained_mempool.c index c0257b1..b71b79d 100644 --- a/src/modules/eina/mp/chained_pool/eina_chained_mempool.c +++ b/src/modules/eina/mp/chained_pool/eina_chained_mempool.c @@ -83,7 +83,7 @@ struct _Chained_Mempool #ifdef EINA_HAVE_DEBUG_THREADS Eina_Thread self; #endif - Eina_Lock mutex; + Eina_Spinlock mutex; }; typedef struct _Chained_Pool Chained_Pool; @@ -262,7 +262,7 @@ eina_chained_mempool_malloc(void *data, EINA_UNUSED unsigned int size) Chained_Pool *p = NULL; void *mem; - if (!eina_lock_take(&pool->mutex)) + if (!eina_spinlock_take(&pool->mutex)) { #ifdef EINA_HAVE_DEBUG_THREADS assert(eina_thread_equal(pool->self, eina_thread_self())); @@ -288,7 +288,7 @@ eina_chained_mempool_malloc(void *data, EINA_UNUSED unsigned int size) p = _eina_chained_mp_pool_new(pool); if (!p) { - eina_lock_release(&pool->mutex); + eina_spinlock_release(&pool->mutex); return NULL; } @@ -299,7 +299,7 @@ eina_chained_mempool_malloc(void *data, EINA_UNUSED unsigned int size) mem = _eina_chained_mempool_alloc_in(pool, p); - eina_lock_release(&pool->mutex); + eina_spinlock_release(&pool->mutex); return mem; } @@ -312,7 +312,7 @@ eina_chained_mempool_free(void *data, void *ptr) Chained_Pool *p; // look 4 pool - if (!eina_lock_take(&pool->mutex)) + if (!eina_spinlock_take(&pool->mutex)) { #ifdef EINA_HAVE_DEBUG_THREADS assert(eina_thread_equal(pool->self, eina_thread_self())); @@ -343,7 +343,7 @@ eina_chained_mempool_free(void *data, void *ptr) } #endif - eina_lock_release(&pool->mutex); + eina_spinlock_release(&pool->mutex); return; } @@ -357,7 +357,7 @@ eina_chained_mempool_repack(void *data, Chained_Pool *tail; /* FIXME: Improvement - per Chained_Pool lock */ - if (!eina_lock_take(&pool->mutex)) + if (!eina_spinlock_take(&pool->mutex)) { #ifdef EINA_HAVE_DEBUG_THREADS assert(eina_thread_equal(pool->self, eina_thread_self())); @@ -430,7 +430,7 @@ eina_chained_mempool_repack(void *data, } /* FIXME: improvement - reorder pool so that the most used one get in front */ - eina_lock_release(&pool->mutex); + eina_spinlock_release(&pool->mutex); } static void * @@ -486,7 +486,7 @@ eina_chained_mempool_init(const char *context, mp->self = eina_thread_self(); #endif - eina_lock_new(&mp->mutex); + eina_spinlock_new(&mp->mutex); return mp; } @@ -524,7 +524,7 @@ eina_chained_mempool_shutdown(void *data) VALGRIND_DESTROY_MEMPOOL(mp); #endif - eina_lock_free(&mp->mutex); + eina_spinlock_free(&mp->mutex); #ifdef EINA_HAVE_DEBUG_THREADS assert(eina_thread_equal(mp->self, eina_thread_self())); -- 2.7.4