ecore - efl thread - handle write call mishaps and complain

fixes warnings too.
This commit is contained in:
Carsten Haitzler 2019-06-20 11:24:57 +01:00
parent 1064bd09c7
commit df286b238c
1 changed files with 43 additions and 6 deletions

View File

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