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 875e7cf74d.
This commit is contained in:
Stefan Schmidt 2013-10-11 09:32:09 +01:00
parent 68a4e85483
commit ee155b771d
9 changed files with 13 additions and 308 deletions

View File

@ -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.

2
NEWS
View File

@ -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.

View File

@ -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 = \

View File

@ -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

View File

@ -4,7 +4,6 @@
#include <fcntl.h>
#include "ecore_wl_private.h"
#include <subsurface-client-protocol.h>
/* 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"))

View File

@ -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

View File

@ -1,191 +0,0 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "ecore_wl_private.h"
#include <subsurface-client-protocol.h>
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);
}

View File

@ -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);

View File

@ -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()));