summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2019-06-20 11:24:57 +0100
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2019-06-20 11:26:55 +0100
commitdf286b238c5aa2d7b615ca94a5b8aecd200a97b9 (patch)
treeeeecd72190cf29fb5a0f1b9b60ac3d5427bc3a22
parent1064bd09c7aa8f0a55a5634ef52822b0b38677b9 (diff)
downloadefl-df286b238c5aa2d7b615ca94a5b8aecd200a97b9.tar.gz
ecore - efl thread - handle write call mishaps and complain
fixes warnings too.
-rw-r--r--src/lib/ecore/efl_thread.c49
1 files changed, 43 insertions, 6 deletions
diff --git a/src/lib/ecore/efl_thread.c b/src/lib/ecore/efl_thread.c
index cff9314d1a..1545c74597 100644
--- a/src/lib/ecore/efl_thread.c
+++ b/src/lib/ecore/efl_thread.c
@@ -224,6 +224,43 @@ _cb_appthread_event_callback_del(void *data, const Efl_Event *event)
}
}
+static void
+_efl_thread_pipe_write(int fd, const void *buf, size_t count)
+{
+ const char *my_buf = buf;
+ ssize_t ret;
+
+ for (;;)
+ {
+ ret = write(fd, my_buf, count);
+ if (ret < 0)
+ {
+ // try again tyope errors
+ if (errno == EINTR) continue;
+ else if (errno == EAGAIN) continue;
+ // bad errors - fatal for this kind of write
+ else if (errno == EBADF)
+ ERR("Error writing to control pipe fd: Bad fd");
+ else if (errno == EFAULT)
+ ERR("Error writing to control pipe fd: Bad buf outside address space");
+ else if (errno == EINVAL)
+ ERR("Error writing to control pipe fd: Invalid value");
+ else if (errno == EPIPE)
+ ERR("Error writing to control pipe fd: Broken Pipe");
+ else
+ ERR("Error writing to control pipe fd: Something else unexpected");
+ return;
+ }
+ // do it in multiple writes then if only part was written
+ else if (ret >= 0)
+ {
+ my_buf += ret;
+ count -= ret;
+ if (count == 0) return;
+ }
+ }
+}
+
EFL_CALLBACKS_ARRAY_DEFINE(_appthread_event_callback_watch,
{ EFL_EVENT_CALLBACK_ADD, _cb_appthread_event_callback_add },
{ EFL_EVENT_CALLBACK_DEL, _cb_appthread_event_callback_del });
@@ -300,7 +337,7 @@ _efl_thread_main(void *data, Eina_Thread t)
memset(&cmd, 0, sizeof(cmd));
cmd.d.command = CMD_EXITED;
cmd.d.data = real;
- write(thdat->ctrl.in, &cmd, sizeof(Control_Data));
+ _efl_thread_pipe_write(thdat->ctrl.in, &cmd, sizeof(Control_Data));
efl_unref(obj);
@@ -805,7 +842,7 @@ _efl_thread_efl_task_end(Eo *obj EINA_UNUSED, Efl_Thread_Data *pd)
pd->end_sent = EINA_TRUE;
memset(&cmd, 0, sizeof(cmd));
cmd.d.command = CMD_EXIT;
- write(pd->ctrl.in, &cmd, sizeof(Control_Data));
+ _efl_thread_pipe_write(pd->ctrl.in, &cmd, sizeof(Control_Data));
}
}
@@ -1010,7 +1047,7 @@ _appthread_threadio_call(Eo *obj EINA_UNUSED, Efl_Appthread_Data *pd,
cmd.d.ptr[0] = func;
cmd.d.ptr[1] = func_data;
cmd.d.ptr[2] = func_free_cb;
- write(thdat->ctrl.in, &cmd, sizeof(Control_Data));
+ _efl_thread_pipe_write(thdat->ctrl.in, &cmd, sizeof(Control_Data));
}
EOLIAN static void
@@ -1024,7 +1061,7 @@ _efl_thread_efl_threadio_call(Eo *obj EINA_UNUSED, Efl_Thread_Data *pd,
cmd.d.ptr[0] = func;
cmd.d.ptr[1] = func_data;
cmd.d.ptr[2] = func_free_cb;
- write(pd->ctrl.in, &cmd, sizeof(Control_Data));
+ _efl_thread_pipe_write(pd->ctrl.in, &cmd, sizeof(Control_Data));
}
void *
@@ -1046,7 +1083,7 @@ _appthread_threadio_call_sync(Eo *obj EINA_UNUSED, Efl_Appthread_Data *pd,
cmd.d.ptr[3] = rep;
rep->data = NULL;
eina_semaphore_new(&(rep->sem), 0);
- write(thdat->ctrl.in, &cmd, sizeof(Control_Data));
+ _efl_thread_pipe_write(thdat->ctrl.in, &cmd, sizeof(Control_Data));
eina_semaphore_lock(&(rep->sem));
data = rep->data;
free(rep);
@@ -1071,7 +1108,7 @@ _efl_thread_efl_threadio_call_sync(Eo *obj EINA_UNUSED, Efl_Thread_Data *pd,
cmd.d.ptr[3] = rep;
rep->data = NULL;
eina_semaphore_new(&(rep->sem), 0);
- write(pd->ctrl.in, &cmd, sizeof(Control_Data));
+ _efl_thread_pipe_write(pd->ctrl.in, &cmd, sizeof(Control_Data));
eina_semaphore_lock(&(rep->sem));
data = rep->data;
free(rep);