summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-07-26 13:18:22 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-07-26 13:21:50 +0900
commit93a683daad30bdf4440efaa0a1c5bffcb81f53ef (patch)
tree9a621e46d645459e4b303e2e4cc984a22f373f2d
parente2093f788600e64fe17ee4d79d89e23e2127676c (diff)
downloadefl-93a683daad30bdf4440efaa0a1c5bffcb81f53ef.tar.gz
evas and ecore_x shm segment management - fix over allocation and perms
so our sysv shm segments were both over-permissive (nothing bad really, just other users could read and write to/from our pixel data destined for the screen... they could do this to x11 directly anyway so no real issue), but be more restrictive and use 0600 as xserver runs as root so can read/write anyway and we only want our own uid access. but even more - fix our shm segment flushing to not keep lots of segments floating about like a bad smell when we don't need them. we had a cache but it wasnt flushed when it should be since async rendering turned up. this fixes that and we're back to agressively flushing them out when idle. @fix
-rw-r--r--src/lib/ecore_x/xcb/ecore_xcb_image.c4
-rw-r--r--src/lib/ecore_x/xlib/ecore_x_image.c4
-rw-r--r--src/modules/evas/engines/software_x11/evas_engine.h1
-rw-r--r--src/modules/evas/engines/software_x11/evas_xcb_buffer.c2
-rw-r--r--src/modules/evas/engines/software_x11/evas_xcb_outbuf.c64
-rw-r--r--src/modules/evas/engines/software_x11/evas_xlib_buffer.c2
-rw-r--r--src/modules/evas/engines/software_x11/evas_xlib_outbuf.c72
-rw-r--r--src/modules/evas/engines/software_x11/evas_xlib_swapper.c2
8 files changed, 121 insertions, 30 deletions
diff --git a/src/lib/ecore_x/xcb/ecore_xcb_image.c b/src/lib/ecore_x/xcb/ecore_xcb_image.c
index 67a1470ffd..b6ac6ff4b0 100644
--- a/src/lib/ecore_x/xcb/ecore_xcb_image.c
+++ b/src/lib/ecore_x/xcb/ecore_xcb_image.c
@@ -621,7 +621,7 @@ _ecore_xcb_image_shm_check(void)
}
shminfo.shmid =
- shmget(IPC_PRIVATE, img->stride * img->height, (IPC_CREAT | 0666));
+ shmget(IPC_PRIVATE, img->stride * img->height, (IPC_CREAT | 0600));
if (shminfo.shmid == (uint32_t)-1)
{
xcb_image_destroy(img);
@@ -675,7 +675,7 @@ _ecore_xcb_image_shm_create(Ecore_X_Image *im)
im->depth, NULL, ~0, NULL);
if (!im->xim) return;
- im->shminfo.shmid = shmget(IPC_PRIVATE, im->xim->size, (IPC_CREAT | 0666));
+ im->shminfo.shmid = shmget(IPC_PRIVATE, im->xim->size, (IPC_CREAT | 0600));
if (im->shminfo.shmid == (uint32_t)-1)
{
xcb_image_destroy(im->xim);
diff --git a/src/lib/ecore_x/xlib/ecore_x_image.c b/src/lib/ecore_x/xlib/ecore_x_image.c
index 6dfe931d04..35ee976971 100644
--- a/src/lib/ecore_x/xlib/ecore_x_image.c
+++ b/src/lib/ecore_x/xlib/ecore_x_image.c
@@ -120,7 +120,7 @@ _ecore_x_image_shm_check(void)
}
shminfo.shmid = shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height,
- IPC_CREAT | 0666);
+ IPC_CREAT | 0600);
if (shminfo.shmid == -1)
{
ERR("%s", strerror(errno));
@@ -246,7 +246,7 @@ _ecore_x_image_shm_create(Ecore_X_Image *im)
im->shminfo.shmid = shmget(IPC_PRIVATE,
im->xim->bytes_per_line * im->xim->height,
- IPC_CREAT | 0666);
+ IPC_CREAT | 0600);
if (im->shminfo.shmid == -1)
{
ERR("shmget failed: %s", strerror(errno));
diff --git a/src/modules/evas/engines/software_x11/evas_engine.h b/src/modules/evas/engines/software_x11/evas_engine.h
index c29f62deea..895e320621 100644
--- a/src/modules/evas/engines/software_x11/evas_engine.h
+++ b/src/modules/evas/engines/software_x11/evas_engine.h
@@ -106,6 +106,7 @@ struct _Outbuf
/* a list of previous frame pending regions to write to the target */
Eina_List *prev_pending_writes;
+ Eina_Spinlock lock;
unsigned char mask_dither : 1;
unsigned char destination_alpha : 1;
diff --git a/src/modules/evas/engines/software_x11/evas_xcb_buffer.c b/src/modules/evas/engines/software_x11/evas_xcb_buffer.c
index 38d4584e50..ff90a6898c 100644
--- a/src/modules/evas/engines/software_x11/evas_xcb_buffer.c
+++ b/src/modules/evas/engines/software_x11/evas_xcb_buffer.c
@@ -282,7 +282,7 @@ evas_software_xcb_output_buffer_new(xcb_connection_t *conn, xcb_visualtype_t *vi
xcbob->shm_info->shmid =
shmget(IPC_PRIVATE,
xcbob->xim->stride * xcbob->xim->height,
- (IPC_CREAT | 0777));
+ (IPC_CREAT | 0600));
if (xcbob->shm_info->shmid == (uint32_t)-1)
{
xcb_image_destroy(xcbob->xim);
diff --git a/src/modules/evas/engines/software_x11/evas_xcb_outbuf.c b/src/modules/evas/engines/software_x11/evas_xcb_outbuf.c
index 632d13cd64..cee38e9d5a 100644
--- a/src/modules/evas/engines/software_x11/evas_xcb_outbuf.c
+++ b/src/modules/evas/engines/software_x11/evas_xcb_outbuf.c
@@ -46,6 +46,7 @@ evas_software_xcb_outbuf_init(void)
void
evas_software_xcb_outbuf_free(Outbuf *buf)
{
+ eina_spinlock_take(&(buf->priv.lock));
while (buf->priv.pending_writes)
{
RGBA_Image *im = NULL;
@@ -67,6 +68,7 @@ evas_software_xcb_outbuf_free(Outbuf *buf)
if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
free(obr);
}
+ eina_spinlock_release(&(buf->priv.lock));
evas_software_xcb_outbuf_idle_flush(buf);
evas_software_xcb_outbuf_flush(buf, NULL, MODE_FULL);
@@ -82,10 +84,9 @@ evas_software_xcb_outbuf_free(Outbuf *buf)
buf->priv.pal);
eina_array_flush(&buf->priv.onebuf_regions);
-
+ eina_spinlock_free(&(buf->priv.lock));
free(buf);
- _clear_xcbob(EINA_FALSE);
- eina_spinlock_free(&shmpool_lock);
+ _clear_xcbob(EINA_TRUE);
}
Outbuf *
@@ -260,6 +261,7 @@ evas_software_xcb_outbuf_setup(int w, int h, int rot, Outbuf_Depth depth, xcb_co
evas_software_xcb_outbuf_drawable_set(buf, draw);
evas_software_xcb_outbuf_mask_set(buf, mask);
+ eina_spinlock_new(&(buf->priv.lock));
return buf;
}
@@ -273,6 +275,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
Eina_Bool alpha = EINA_FALSE;
int bpl = 0;
+ eina_spinlock_take(&(buf->priv.lock));
if ((buf->onebuf) && (buf->priv.x11.xcb.shm))
{
Eina_Rectangle *rect;
@@ -280,11 +283,15 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h);
if (!(obr = calloc(1, sizeof(Outbuf_Region))))
- return NULL;
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return NULL;
+ }
if (!(rect = eina_rectangle_new(x, y, w, h)))
{
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
@@ -301,6 +308,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
buf->priv.synced = EINA_TRUE;
}
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return buf->priv.onebuf;
}
obr->x = 0;
@@ -330,6 +338,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
if (!obr->xcbob)
{
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
#ifdef EVAS_CSERVE2
@@ -355,6 +364,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
{
evas_software_xcb_output_buffer_free(obr->xcbob, EINA_FALSE);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
im->extended_info = obr;
@@ -387,6 +397,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
if (!im)
{
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
im->cache_entry.flags.alpha |= (alpha ? 1 : 0);
@@ -423,6 +434,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
evas_cache_image_drop(&im->cache_entry);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
if (buf->priv.x11.xcb.mask)
@@ -441,11 +453,15 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
// memset(im->image.data, 0, (w * h * sizeof(DATA32)));
}
buf->priv.onebuf = im;
+ eina_spinlock_release(&(buf->priv.lock));
return im;
}
if (!(obr = calloc(1, sizeof(Outbuf_Region))))
- return NULL;
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return NULL;
+ }
obr->x = x;
obr->y = y;
@@ -470,6 +486,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
if (!obr->xcbob)
{
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
#ifdef EVAS_CSERVE2
@@ -495,6 +512,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
{
_unfind_xcbob(obr->xcbob, EINA_FALSE);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
im->extended_info = obr;
@@ -525,6 +543,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
if (!im)
{
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
im->cache_entry.flags.alpha |= (alpha ? 1 : 0);
@@ -558,6 +577,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
#endif
evas_cache_image_drop(&im->cache_entry);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
if (buf->priv.x11.xcb.mask)
@@ -577,6 +597,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w,
buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
+ eina_spinlock_release(&(buf->priv.lock));
return im;
}
@@ -587,14 +608,13 @@ evas_software_xcb_outbuf_free_region_for_update(Outbuf *buf EINA_UNUSED, RGBA_Im
}
void
-evas_software_xcb_outbuf_flush(Outbuf *buf, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode render_mode)
+evas_software_xcb_outbuf_flush(Outbuf *buf, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode render_mode EINA_UNUSED)
{
Eina_List *l = NULL;
RGBA_Image *im = NULL;
Outbuf_Region *obr = NULL;
- if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
-
+ eina_spinlock_take(&(buf->priv.lock));
if ((buf->priv.onebuf) && (eina_array_count(&buf->priv.onebuf_regions)))
{
Eina_Array_Iterator it;
@@ -743,12 +763,14 @@ evas_software_xcb_outbuf_flush(Outbuf *buf, Tilebuf_Rect *rects EINA_UNUSED, Eva
}
#endif
}
+ eina_spinlock_release(&(buf->priv.lock));
evas_common_cpu_end_opt();
}
void
evas_software_xcb_outbuf_idle_flush(Outbuf *buf)
{
+ eina_spinlock_release(&(buf->priv.lock));
if (buf->priv.onebuf)
{
RGBA_Image *im;
@@ -795,6 +817,7 @@ evas_software_xcb_outbuf_idle_flush(Outbuf *buf)
}
_clear_xcbob(EINA_FALSE);
}
+ eina_spinlock_release(&(buf->priv.lock));
}
void
@@ -807,8 +830,13 @@ evas_software_xcb_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, in
int bpl = 0, yy = 0;
int bw = 0, bh = 0;
+ eina_spinlock_release(&(buf->priv.lock));
obr = update->extended_info;
- if (!obr->xcbob) return;
+ if (!obr->xcbob)
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return;
+ }
if ((buf->rot == 0) || (buf->rot == 180))
{
@@ -834,11 +862,22 @@ evas_software_xcb_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, in
buf->priv.mask.g, buf->priv.mask.b,
PAL_MODE_NONE, buf->rot);
}
- if (!func_conv) return;
+ if (!func_conv)
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return;
+ }
if (!(data = evas_software_xcb_output_buffer_data(obr->xcbob, &bpl)))
- return;
- if (!(src_data = update->image.data)) return;
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return;
+ }
+ if (!(src_data = update->image.data))
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return;
+ }
if (buf->rot == 0)
{
obr->x = x;
@@ -965,6 +1004,7 @@ evas_software_xcb_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, in
#else
xcb_flush(buf->priv.x11.xcb.conn);
#endif
+ eina_spinlock_release(&(buf->priv.lock));
}
void
diff --git a/src/modules/evas/engines/software_x11/evas_xlib_buffer.c b/src/modules/evas/engines/software_x11/evas_xlib_buffer.c
index 9faf9eb7d7..6ab127839f 100644
--- a/src/modules/evas/engines/software_x11/evas_xlib_buffer.c
+++ b/src/modules/evas/engines/software_x11/evas_xlib_buffer.c
@@ -288,7 +288,7 @@ evas_software_xlib_x_output_buffer_new(Display *d, Visual *v, int depth, int w,
xob->shm_info->shmid = shmget(IPC_PRIVATE,
xob->xim->bytes_per_line *
xob->xim->height,
- IPC_CREAT | 0777);
+ IPC_CREAT | 0600);
if (xob->shm_info->shmid >= 0)
{
xob->shm_info->readOnly = False;
diff --git a/src/modules/evas/engines/software_x11/evas_xlib_outbuf.c b/src/modules/evas/engines/software_x11/evas_xlib_outbuf.c
index 52dffd6a5d..63b55c476e 100644
--- a/src/modules/evas/engines/software_x11/evas_xlib_outbuf.c
+++ b/src/modules/evas/engines/software_x11/evas_xlib_outbuf.c
@@ -161,6 +161,7 @@ evas_software_xlib_outbuf_init(void)
void
evas_software_xlib_outbuf_free(Outbuf *buf)
{
+ eina_spinlock_take(&(buf->priv.lock));
while (buf->priv.pending_writes)
{
RGBA_Image *im;
@@ -181,6 +182,7 @@ evas_software_xlib_outbuf_free(Outbuf *buf)
if (obr->mxob) _unfind_xob(obr->mxob, 0);
free(obr);
}
+ eina_spinlock_release(&(buf->priv.lock));
evas_software_xlib_outbuf_idle_flush(buf);
evas_software_xlib_outbuf_flush(buf, NULL, EVAS_RENDER_MODE_UNDEF);
if (buf->priv.x11.xlib.gc)
@@ -195,8 +197,9 @@ evas_software_xlib_outbuf_free(Outbuf *buf)
XFreeColormap (buf->priv.x11.xlib.disp, buf->priv.x11.xlib.cmap);
eina_array_flush(&buf->priv.onebuf_regions);
+ eina_spinlock_free(&(buf->priv.lock));
free(buf);
- _clear_xob(0);
+ _clear_xob(1);
}
Outbuf *
@@ -372,6 +375,7 @@ evas_software_xlib_outbuf_setup_x(int w, int h, int rot, Outbuf_Depth depth,
evas_software_xlib_outbuf_drawable_set(buf, draw);
evas_software_xlib_outbuf_mask_set(buf, mask);
}
+ eina_spinlock_new(&(buf->priv.lock));
return buf;
}
@@ -384,6 +388,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
int use_shm = 1;
int alpha;
+ eina_spinlock_take(&(buf->priv.lock));
if ((buf->onebuf) && (buf->priv.x11.xlib.shm))
{
Eina_Rectangle *rect;
@@ -391,7 +396,11 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h);
rect = eina_rectangle_new(x, y, w, h);
- if (!rect) return NULL;
+ if (!rect)
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return NULL;
+ }
if ((eina_array_push(&buf->priv.onebuf_regions, rect)) &&
(buf->priv.onebuf))
@@ -405,13 +414,18 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
XSync(buf->priv.x11.xlib.disp, False);
buf->priv.synced = 1;
}
+ eina_spinlock_release(&(buf->priv.lock));
return buf->priv.onebuf;
}
if (rect) eina_rectangle_free(rect);
obr = calloc(1, sizeof(Outbuf_Region));
- if (!obr) return NULL;
+ if (!obr)
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return NULL;
+ }
obr->x = 0;
obr->y = 0;
@@ -440,6 +454,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
if (!obr->xob)
{
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
#ifdef EVAS_CSERVE2
@@ -460,6 +475,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
{
evas_software_xlib_x_output_buffer_free(obr->xob, 0);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
im->extended_info = obr;
@@ -482,6 +498,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
if (!im)
{
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
im->cache_entry.flags.alpha |= alpha ? 1 : 0;
@@ -511,6 +528,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
#endif
evas_cache_image_drop(&im->cache_entry);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
if (buf->priv.x11.xlib.mask)
@@ -539,6 +557,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
#endif
evas_cache_image_drop(&im->cache_entry);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
if (buf->priv.x11.xlib.mask)
@@ -558,11 +577,16 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
}
buf->priv.onebuf = im;
+ eina_spinlock_release(&(buf->priv.lock));
return im;
}
obr = calloc(1, sizeof(Outbuf_Region));
- if (!obr) return NULL;
+ if (!obr)
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return NULL;
+ }
obr->x = x;
obr->y = y;
obr->w = w;
@@ -596,6 +620,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
if (!obr->xob)
{
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
#ifdef EVAS_CSERVE2
@@ -614,6 +639,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
{
_unfind_xob(obr->xob, 0);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
im->extended_info = obr;
@@ -635,6 +661,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
if (!im)
{
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
im->cache_entry.w = w;
@@ -666,6 +693,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
#endif
evas_cache_image_drop(&im->cache_entry);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
if (buf->priv.x11.xlib.mask)
@@ -694,6 +722,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
#endif
evas_cache_image_drop(&im->cache_entry);
free(obr);
+ eina_spinlock_release(&(buf->priv.lock));
return NULL;
}
if (buf->priv.x11.xlib.mask)
@@ -714,6 +743,7 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
}
buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
+ eina_spinlock_release(&(buf->priv.lock));
return im;
}
@@ -724,14 +754,13 @@ evas_software_xlib_outbuf_free_region_for_update(Outbuf *buf EINA_UNUSED, RGBA_I
}
void
-evas_software_xlib_outbuf_flush(Outbuf *buf, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode render_mode)
+evas_software_xlib_outbuf_flush(Outbuf *buf, Tilebuf_Rect *rects EINA_UNUSED, Evas_Render_Mode render_mode EINA_UNUSED)
{
Eina_List *l;
RGBA_Image *im;
Outbuf_Region *obr;
- if (render_mode == EVAS_RENDER_MODE_ASYNC_INIT) return;
-
+ eina_spinlock_take(&(buf->priv.lock));
if ((buf->priv.onebuf) && eina_array_count(&buf->priv.onebuf_regions))
{
Eina_Rectangle *rect;
@@ -890,12 +919,14 @@ evas_software_xlib_outbuf_flush(Outbuf *buf, Tilebuf_Rect *rects EINA_UNUSED, Ev
}
#endif
}
+ eina_spinlock_release(&(buf->priv.lock));
evas_common_cpu_end_opt();
}
void
evas_software_xlib_outbuf_idle_flush(Outbuf *buf)
{
+ eina_spinlock_take(&(buf->priv.lock));
if (buf->priv.onebuf)
{
RGBA_Image *im;
@@ -943,6 +974,7 @@ evas_software_xlib_outbuf_idle_flush(Outbuf *buf)
}
_clear_xob(0);
}
+ eina_spinlock_release(&(buf->priv.lock));
}
void
@@ -954,6 +986,7 @@ evas_software_xlib_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, i
unsigned char *data;
int bpl = 0, yy;
+ eina_spinlock_take(&(buf->priv.lock));
obr = update->extended_info;
if (buf->priv.pal)
{
@@ -985,13 +1018,29 @@ evas_software_xlib_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, i
buf->priv.mask.g, buf->priv.mask.b,
PAL_MODE_NONE, buf->rot);
}
- if (!conv_func) return;
+ if (!conv_func)
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return;
+ }
- if (!obr->xob) return;
+ if (!obr->xob)
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return;
+ }
data = evas_software_xlib_x_output_buffer_data(obr->xob, &bpl);
- if (!data) return;
+ if (!data)
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return;
+ }
src_data = update->image.data;
- if (!src_data) return;
+ if (!src_data)
+ {
+ eina_spinlock_release(&(buf->priv.lock));
+ return;
+ }
if (buf->rot == 0)
{
obr->x = x;
@@ -1125,6 +1174,7 @@ evas_software_xlib_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, i
#else
XFlush(buf->priv.x11.xlib.disp);
#endif
+ eina_spinlock_release(&(buf->priv.lock));
}
void
diff --git a/src/modules/evas/engines/software_x11/evas_xlib_swapper.c b/src/modules/evas/engines/software_x11/evas_xlib_swapper.c
index c60c9d7ee4..6749f8c113 100644
--- a/src/modules/evas/engines/software_x11/evas_xlib_swapper.c
+++ b/src/modules/evas/engines/software_x11/evas_xlib_swapper.c
@@ -59,7 +59,7 @@ _buf_new(X_Swapper *swp, Buffer *buf)
buf->bpl = buf->xim->bytes_per_line;
buf->shm_info.shmid = shmget(IPC_PRIVATE, buf->bpl * buf->h,
- IPC_CREAT | 0777);
+ IPC_CREAT | 0600);
if (buf->shm_info.shmid >= 0)
{
buf->shm_info.readOnly = False;