Ecore Exe: Migrate to eo.

This commit is contained in:
Tom Hacohen 2014-08-07 14:57:50 +01:00
parent 3f29b35662
commit eed11ac529
6 changed files with 232 additions and 169 deletions

View File

@ -8,6 +8,9 @@ BUILT_SOURCES += \
lib/ecore/ecore_poller.eo.c \ lib/ecore/ecore_poller.eo.c \
lib/ecore/ecore_poller.eo.h \ lib/ecore/ecore_poller.eo.h \
lib/ecore/ecore_poller.eo.legacy.h \ lib/ecore/ecore_poller.eo.legacy.h \
lib/ecore/ecore_exe.eo.c \
lib/ecore/ecore_exe.eo.h \
lib/ecore/ecore_exe.eo.legacy.h \
lib/ecore/ecore_job.eo.c \ lib/ecore/ecore_job.eo.c \
lib/ecore/ecore_job.eo.h \ lib/ecore/ecore_job.eo.h \
lib/ecore/ecore_job.eo.legacy.h \ lib/ecore/ecore_job.eo.legacy.h \
@ -31,6 +34,7 @@ ecoreeolianfiles_DATA = \
lib/ecore/ecore_timer.eo \ lib/ecore/ecore_timer.eo \
lib/ecore/ecore_poller.eo \ lib/ecore/ecore_poller.eo \
lib/ecore/ecore_job.eo \ lib/ecore/ecore_job.eo \
lib/ecore/ecore_exe.eo \
lib/ecore/ecore_idler.eo \ lib/ecore/ecore_idler.eo \
lib/ecore/ecore_idle_enterer.eo \ lib/ecore/ecore_idle_enterer.eo \
lib/ecore/ecore_idle_exiter.eo \ lib/ecore/ecore_idle_exiter.eo \
@ -54,6 +58,8 @@ lib/ecore/Ecore_Getopt.h
nodist_installed_ecoremainheaders_DATA = \ nodist_installed_ecoremainheaders_DATA = \
lib/ecore/ecore_timer.eo.h \ lib/ecore/ecore_timer.eo.h \
lib/ecore/ecore_poller.eo.h \ lib/ecore/ecore_poller.eo.h \
lib/ecore/ecore_exe.eo.h \
lib/ecore/ecore_exe.eo.legacy.h \
lib/ecore/ecore_job.eo.h \ lib/ecore/ecore_job.eo.h \
lib/ecore/ecore_idler.eo.h \ lib/ecore/ecore_idler.eo.h \
lib/ecore/ecore_idle_enterer.eo.h \ lib/ecore/ecore_idle_enterer.eo.h \

View File

@ -891,7 +891,7 @@ enum _Ecore_Exe_Win32_Priority
}; };
typedef enum _Ecore_Exe_Win32_Priority Ecore_Exe_Win32_Priority; typedef enum _Ecore_Exe_Win32_Priority Ecore_Exe_Win32_Priority;
typedef struct _Ecore_Exe Ecore_Exe; /**< A handle for spawned processes */ typedef Eo Ecore_Exe; /**< A handle for spawned processes */
/** /**
* @typedef Ecore_Exe_Cb Ecore_Exe_Cb * @typedef Ecore_Exe_Cb Ecore_Exe_Cb

View File

@ -55,6 +55,19 @@ extern "C" {
* @} * @}
*/ */
/**
* @ingroup Ecore_Exe_Group
*
* @{
*/
#include "ecore_exe.eo.h"
/**
* @}
*/
/** /**
* @ingroup Ecore_Job_Group * @ingroup Ecore_Job_Group
* *

View File

@ -286,6 +286,18 @@ EAPI void *ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
#include "ecore_idler.eo.legacy.h" #include "ecore_idler.eo.legacy.h"
/**
* @}
*/
/**
* @ingroup Ecore_Exe_Group
*
* @{
*/
#include "ecore_exe.eo.legacy.h"
/** /**
* @} * @}
*/ */

View File

@ -23,6 +23,8 @@
#include "Ecore.h" #include "Ecore.h"
#include "ecore_private.h" #include "ecore_private.h"
#define MY_CLASS ECORE_EXE_CLASS
/* FIXME: Getting respawn to work /* FIXME: Getting respawn to work
* *
* There is no way that we can do anything about the internal state info of * There is no way that we can do anything about the internal state info of
@ -45,7 +47,6 @@
* *
* These structure members don't need to change - * These structure members don't need to change -
* __list_data - we stay on the list * __list_data - we stay on the list
* ECORE_MAGIC - this is a constant
* data - passed in originally * data - passed in originally
* cmd - passed in originally * cmd - passed in originally
* flags - passed in originally * flags - passed in originally
@ -84,10 +85,8 @@
* hurt. The user code may need to be informed that a timeout is in progress. * hurt. The user code may need to be informed that a timeout is in progress.
*/ */
struct _Ecore_Exe struct _Ecore_Exe_Data
{ {
EINA_INLIST;
ECORE_MAGIC;
pid_t pid; pid_t pid;
void *data; void *data;
char *tag, *cmd; char *tag, *cmd;
@ -120,6 +119,8 @@ struct _Ecore_Exe
Ecore_Exe_Cb pre_free_cb; Ecore_Exe_Cb pre_free_cb;
}; };
typedef struct _Ecore_Exe_Data Ecore_Exe_Data;
/* TODO: Something to let people build a command line and does auto escaping - /* TODO: Something to let people build a command line and does auto escaping -
* *
* ecore_exe_snprintf() * ecore_exe_snprintf()
@ -149,7 +150,7 @@ static Eina_Bool _ecore_exe_data_read_handler(void *data,
Ecore_Fd_Handler *fd_handler); Ecore_Fd_Handler *fd_handler);
static Eina_Bool _ecore_exe_data_write_handler(void *data, static Eina_Bool _ecore_exe_data_write_handler(void *data,
Ecore_Fd_Handler *fd_handler); Ecore_Fd_Handler *fd_handler);
static void _ecore_exe_flush(Ecore_Exe *exe); static void _ecore_exe_flush(Ecore_Exe *obj);
static void _ecore_exe_event_exe_data_free(void *data EINA_UNUSED, static void _ecore_exe_event_exe_data_free(void *data EINA_UNUSED,
void *ev); void *ev);
static Ecore_Exe *_ecore_exe_is_it_alive(pid_t pid); static Ecore_Exe *_ecore_exe_is_it_alive(pid_t pid);
@ -158,14 +159,14 @@ static Eina_Bool _ecore_exe_make_sure_its_really_dead(void *data);
static Ecore_Exe_Event_Add *_ecore_exe_event_add_new(void); static Ecore_Exe_Event_Add *_ecore_exe_event_add_new(void);
static void _ecore_exe_event_add_free(void *data, static void _ecore_exe_event_add_free(void *data,
void *ev); void *ev);
static void _ecore_exe_dead_attach(Ecore_Exe *exe); static void _ecore_exe_dead_attach(Ecore_Exe *obj);
EAPI int ECORE_EXE_EVENT_ADD = 0; EAPI int ECORE_EXE_EVENT_ADD = 0;
EAPI int ECORE_EXE_EVENT_DEL = 0; EAPI int ECORE_EXE_EVENT_DEL = 0;
EAPI int ECORE_EXE_EVENT_DATA = 0; EAPI int ECORE_EXE_EVENT_DATA = 0;
EAPI int ECORE_EXE_EVENT_ERROR = 0; EAPI int ECORE_EXE_EVENT_ERROR = 0;
static Ecore_Exe *exes = NULL; static Eina_List *exes = NULL;
static const char *shell = NULL; static const char *shell = NULL;
/* FIXME: This errno checking stuff should be put elsewhere for everybody to use. /* FIXME: This errno checking stuff should be put elsewhere for everybody to use.
@ -343,7 +344,33 @@ ecore_exe_pipe_run(const char *exe_cmd,
Ecore_Exe_Flags flags, Ecore_Exe_Flags flags,
const void *data) const void *data)
{ {
Ecore_Exe *exe = NULL; Ecore_Exe *ret = eo_add(MY_CLASS, NULL, ecore_obj_exe_command_set(exe_cmd, flags));
if (ret)
{
Ecore_Exe_Data *pd = eo_data_scope_get(ret, MY_CLASS);
pd->data = (void *) data;
}
return ret;
}
EOLIAN static void
_ecore_exe_command_set(Eo *obj EINA_UNUSED, Ecore_Exe_Data *pd, const char *cmd, Ecore_Exe_Flags flags)
{
pd->cmd = strdup(cmd);
pd->flags = flags;
}
EOLIAN static void
_ecore_exe_command_get(Eo *obj EINA_UNUSED, Ecore_Exe_Data *pd, const char **cmd, Ecore_Exe_Flags *flags)
{
if (cmd) *cmd = pd->cmd;
if (flags) *flags = pd->flags;
}
EOLIAN static Eo *
_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe)
{
int statusPipe[2] = { -1, -1 }; int statusPipe[2] = { -1, -1 };
int errorPipe[2] = { -1, -1 }; int errorPipe[2] = { -1, -1 };
int readPipe[2] = { -1, -1 }; int readPipe[2] = { -1, -1 };
@ -353,9 +380,10 @@ ecore_exe_pipe_run(const char *exe_cmd,
int result; int result;
EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
if (!exe_cmd) return NULL; if (!exe->cmd) return NULL;
exe = calloc(1, sizeof(Ecore_Exe));
if (!exe) return NULL; const char *exe_cmd = exe->cmd;
Ecore_Exe_Flags flags = exe->flags;
if ((flags & ECORE_EXE_PIPE_AUTO) && (!(flags & ECORE_EXE_PIPE_ERROR)) if ((flags & ECORE_EXE_PIPE_AUTO) && (!(flags & ECORE_EXE_PIPE_ERROR))
&& (!(flags & ECORE_EXE_PIPE_READ))) && (!(flags & ECORE_EXE_PIPE_READ)))
@ -521,15 +549,13 @@ ecore_exe_pipe_run(const char *exe_cmd,
if (pid) if (pid)
{ {
/* Setup the exe structure. */ /* Setup the exe structure. */
ECORE_MAGIC_SET(exe, ECORE_MAGIC_EXE);
exe->start_bytes = -1; exe->start_bytes = -1;
exe->end_bytes = -1; exe->end_bytes = -1;
exe->start_lines = -1; exe->start_lines = -1;
exe->end_lines = -1; exe->end_lines = -1;
exe->pid = pid; exe->pid = pid;
exe->flags = flags; exe->flags = flags;
exe->data = (void *)data; if (exe->cmd)
if ((exe->cmd = strdup(exe_cmd)))
{ {
if (flags & ECORE_EXE_PIPE_ERROR) /* Setup the error stuff. */ if (flags & ECORE_EXE_PIPE_ERROR) /* Setup the error stuff. */
{ {
@ -550,7 +576,7 @@ ecore_exe_pipe_run(const char *exe_cmd,
ecore_main_fd_handler_add(exe->child_fd_error, ecore_main_fd_handler_add(exe->child_fd_error,
ECORE_FD_READ, ECORE_FD_READ,
_ecore_exe_data_error_handler, _ecore_exe_data_error_handler,
exe, NULL, NULL); obj, NULL, NULL);
if (!exe->error_fd_handler) if (!exe->error_fd_handler)
ok = 0; ok = 0;
} }
@ -574,7 +600,7 @@ ecore_exe_pipe_run(const char *exe_cmd,
ecore_main_fd_handler_add(exe->child_fd_read, ecore_main_fd_handler_add(exe->child_fd_read,
ECORE_FD_READ, ECORE_FD_READ,
_ecore_exe_data_read_handler, _ecore_exe_data_read_handler,
exe, NULL, NULL); obj, NULL, NULL);
if (!exe->read_fd_handler) if (!exe->read_fd_handler)
ok = 0; ok = 0;
} }
@ -598,7 +624,7 @@ ecore_exe_pipe_run(const char *exe_cmd,
ecore_main_fd_handler_add(exe->child_fd_write, ecore_main_fd_handler_add(exe->child_fd_write,
ECORE_FD_WRITE, ECORE_FD_WRITE,
_ecore_exe_data_write_handler, _ecore_exe_data_write_handler,
exe, NULL, NULL); obj, NULL, NULL);
if (exe->write_fd_handler) if (exe->write_fd_handler)
ecore_main_fd_handler_active_set(exe->write_fd_handler, 0); /* Nothing to write to start with. */ ecore_main_fd_handler_active_set(exe->write_fd_handler, 0); /* Nothing to write to start with. */
else else
@ -606,7 +632,7 @@ ecore_exe_pipe_run(const char *exe_cmd,
} }
} }
exes = (Ecore_Exe *)eina_inlist_append(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe)); exes = eina_list_append(exes, obj);
n = 0; n = 0;
} }
else else
@ -618,8 +644,8 @@ ecore_exe_pipe_run(const char *exe_cmd,
if (!ok) /* Something went wrong, so pull down everything. */ if (!ok) /* Something went wrong, so pull down everything. */
{ {
if (exe->pid) ecore_exe_terminate(exe); if (exe->pid) ecore_exe_terminate(obj);
IF_FN_DEL(ecore_exe_free, exe); IF_FN_DEL(ecore_exe_free, obj);
} }
else else
{ {
@ -628,7 +654,7 @@ ecore_exe_pipe_run(const char *exe_cmd,
e = _ecore_exe_event_add_new(); e = _ecore_exe_event_add_new();
if (e) if (e)
{ {
e->exe = exe; e->exe = obj;
/* Send the event. */ /* Send the event. */
ecore_event_add(ECORE_EXE_EVENT_ADD, e, ecore_event_add(ECORE_EXE_EVENT_ADD, e,
_ecore_exe_event_add_free, NULL); _ecore_exe_event_add_free, NULL);
@ -637,36 +663,31 @@ ecore_exe_pipe_run(const char *exe_cmd,
} }
errno = n; errno = n;
return exe; return obj;
} }
EAPI void EAPI void
ecore_exe_callback_pre_free_set(Ecore_Exe *exe, ecore_exe_callback_pre_free_set(Ecore_Exe *obj,
Ecore_Exe_Cb func) Ecore_Exe_Cb func)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE,
"ecore_exe_callback_pre_free_set");
return; return;
}
exe->pre_free_cb = func; exe->pre_free_cb = func;
} }
EAPI Eina_Bool EAPI Eina_Bool
ecore_exe_send(Ecore_Exe *exe, ecore_exe_send(Ecore_Exe *obj,
const void *data, const void *data,
int size) int size)
{ {
void *buf;
EINA_MAIN_LOOP_CHECK_RETURN_VAL(EINA_FALSE); EINA_MAIN_LOOP_CHECK_RETURN_VAL(EINA_FALSE);
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_send");
return EINA_FALSE; return EINA_FALSE;
}
void *buf;
if (exe->close_stdin) if (exe->close_stdin)
{ {
@ -696,30 +717,27 @@ ecore_exe_send(Ecore_Exe *exe,
} }
EAPI void EAPI void
ecore_exe_close_stdin(Ecore_Exe *exe) ecore_exe_close_stdin(Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_close_stdin");
return; return;
}
exe->close_stdin = 1; exe->close_stdin = 1;
} }
EAPI void EAPI void
ecore_exe_auto_limits_set(Ecore_Exe *exe, ecore_exe_auto_limits_set(Ecore_Exe *obj,
int start_bytes, int start_bytes,
int end_bytes, int end_bytes,
int start_lines, int start_lines,
int end_lines) int end_lines)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_auto_limits_set");
return; return;
}
/* FIXME: sanitize the input. */ /* FIXME: sanitize the input. */
exe->start_bytes = start_bytes; exe->start_bytes = start_bytes;
exe->end_bytes = end_bytes; exe->end_bytes = end_bytes;
@ -767,7 +785,7 @@ ecore_exe_auto_limits_set(Ecore_Exe *exe,
} }
EAPI Ecore_Exe_Event_Data * EAPI Ecore_Exe_Event_Data *
ecore_exe_event_data_get(Ecore_Exe *exe, ecore_exe_event_data_get(Ecore_Exe *obj,
Ecore_Exe_Flags flags) Ecore_Exe_Flags flags)
{ {
Ecore_Exe_Event_Data *e = NULL; Ecore_Exe_Event_Data *e = NULL;
@ -776,11 +794,9 @@ ecore_exe_event_data_get(Ecore_Exe *exe,
int inbuf_num; int inbuf_num;
EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_event_data_get");
return NULL; return NULL;
}
/* Sort out what sort of event we are. */ /* Sort out what sort of event we are. */
if (flags & ECORE_EXE_PIPE_READ) if (flags & ECORE_EXE_PIPE_READ)
@ -815,7 +831,7 @@ ecore_exe_event_data_get(Ecore_Exe *exe,
e = calloc(1, sizeof(Ecore_Exe_Event_Data)); e = calloc(1, sizeof(Ecore_Exe_Event_Data));
if (e) if (e)
{ {
e->exe = exe; e->exe = obj;
e->data = inbuf; e->data = inbuf;
e->size = inbuf_num; e->size = inbuf_num;
@ -893,15 +909,14 @@ ecore_exe_event_data_get(Ecore_Exe *exe,
} }
EAPI void EAPI void
ecore_exe_tag_set(Ecore_Exe *exe, ecore_exe_tag_set(Ecore_Exe *obj,
const char *tag) const char *tag)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_set");
return; return;
}
IF_FREE(exe->tag); IF_FREE(exe->tag);
if (tag) if (tag)
exe->tag = strdup(tag); exe->tag = strdup(tag);
@ -910,36 +925,32 @@ ecore_exe_tag_set(Ecore_Exe *exe,
} }
EAPI const char * EAPI const char *
ecore_exe_tag_get(const Ecore_Exe *exe) ecore_exe_tag_get(const Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_get");
return NULL; return NULL;
}
return exe->tag; return exe->tag;
} }
EAPI void * EAPI void *
ecore_exe_free(Ecore_Exe *exe) ecore_exe_free(Ecore_Exe *obj)
{ {
void *data; void *data;
int ok = 0; int ok = 0;
int result; int result;
if (!exe) return NULL;
EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_free");
return NULL; return NULL;
}
data = exe->data; data = exe->data;
if (exe->pre_free_cb) if (exe->pre_free_cb)
exe->pre_free_cb(data, exe); exe->pre_free_cb(data, obj);
if (exe->doomsday_clock) if (exe->doomsday_clock)
{ {
@ -975,10 +986,8 @@ ecore_exe_free(Ecore_Exe *exe)
IF_FREE(exe->error_data_buf); IF_FREE(exe->error_data_buf);
IF_FREE(exe->cmd); IF_FREE(exe->cmd);
exes = (Ecore_Exe *)eina_inlist_remove(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe)); exes = eina_list_remove(exes, obj);
ECORE_MAGIC_SET(exe, ECORE_MAGIC_NONE);
IF_FREE(exe->tag); IF_FREE(exe->tag);
free(exe);
return data; return data;
} }
@ -992,144 +1001,131 @@ ecore_exe_event_data_free(Ecore_Exe_Event_Data *e)
} }
EAPI pid_t EAPI pid_t
ecore_exe_pid_get(const Ecore_Exe *exe) ecore_exe_pid_get(const Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN_VAL(0); EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pid_get");
return -1; return -1;
}
return exe->pid; return exe->pid;
} }
EAPI const char * EAPI const char *
ecore_exe_cmd_get(const Ecore_Exe *exe) ecore_exe_cmd_get(const Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) const char *ret = NULL;
{
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_cmd_get"); eo_do(obj, ecore_obj_exe_command_get(&ret, NULL));
return NULL;
} return ret;
return exe->cmd;
} }
EAPI void * EAPI void *
ecore_exe_data_get(const Ecore_Exe *exe) ecore_exe_data_get(const Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
return NULL; return NULL;
}
return exe->data; return exe->data;
} }
EAPI void * EAPI void *
ecore_exe_data_set(Ecore_Exe *exe, ecore_exe_data_set(Ecore_Exe *obj,
void *data) void *data)
{ {
void *ret; void *ret;
EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, __func__);
return NULL; return NULL;
}
ret = exe->data; ret = exe->data;
exe->data = data; exe->data = data;
return ret; return ret;
} }
EAPI Ecore_Exe_Flags EAPI Ecore_Exe_Flags
ecore_exe_flags_get(const Ecore_Exe *exe) ecore_exe_flags_get(const Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN_VAL(0); EINA_MAIN_LOOP_CHECK_RETURN_VAL(0);
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
return 0; return 0;
}
return exe->flags; return exe->flags;
} }
EAPI void EAPI void
ecore_exe_pause(Ecore_Exe *exe) ecore_exe_pause(Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pause");
return; return;
}
kill(exe->pid, SIGSTOP); kill(exe->pid, SIGSTOP);
} }
EAPI void EAPI void
ecore_exe_continue(Ecore_Exe *exe) ecore_exe_continue(Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_continue");
return; return;
}
kill(exe->pid, SIGCONT); kill(exe->pid, SIGCONT);
} }
EAPI void EAPI void
ecore_exe_interrupt(Ecore_Exe *exe) ecore_exe_interrupt(Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_interrupt");
return; return;
}
_ecore_exe_dead_attach(exe); _ecore_exe_dead_attach(obj);
kill(exe->pid, SIGINT); kill(exe->pid, SIGINT);
} }
EAPI void EAPI void
ecore_exe_quit(Ecore_Exe *exe) ecore_exe_quit(Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_quit");
return; return;
}
_ecore_exe_dead_attach(exe); _ecore_exe_dead_attach(obj);
kill(exe->pid, SIGQUIT); kill(exe->pid, SIGQUIT);
} }
EAPI void EAPI void
ecore_exe_terminate(Ecore_Exe *exe) ecore_exe_terminate(Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_terminate");
return; return;
}
_ecore_exe_dead_attach(exe); _ecore_exe_dead_attach(obj);
INF("Sending TERM signal to %s (%d).", exe->cmd, exe->pid); INF("Sending TERM signal to %s (%d).", exe->cmd, exe->pid);
kill(exe->pid, SIGTERM); kill(exe->pid, SIGTERM);
} }
EAPI void EAPI void
ecore_exe_kill(Ecore_Exe *exe) ecore_exe_kill(Ecore_Exe *obj)
{ {
struct _ecore_exe_dead_exe *dead; struct _ecore_exe_dead_exe *dead;
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_kill");
return; return;
}
dead = calloc(1, sizeof(struct _ecore_exe_dead_exe)); dead = calloc(1, sizeof(struct _ecore_exe_dead_exe));
if (dead) if (dead)
@ -1146,15 +1142,14 @@ ecore_exe_kill(Ecore_Exe *exe)
} }
EAPI void EAPI void
ecore_exe_signal(Ecore_Exe *exe, ecore_exe_signal(Ecore_Exe *obj,
int num) int num)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_signal");
return; return;
}
if (num == 1) if (num == 1)
kill(exe->pid, SIGUSR1); kill(exe->pid, SIGUSR1);
else if (num == 2) else if (num == 2)
@ -1162,14 +1157,13 @@ ecore_exe_signal(Ecore_Exe *exe,
} }
EAPI void EAPI void
ecore_exe_hup(Ecore_Exe *exe) ecore_exe_hup(Ecore_Exe *obj)
{ {
EINA_MAIN_LOOP_CHECK_RETURN; EINA_MAIN_LOOP_CHECK_RETURN;
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE)) Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
{ if (!eo_isa(obj, MY_CLASS))
ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_hup");
return; return;
}
kill(exe->pid, SIGHUP); kill(exe->pid, SIGHUP);
} }
@ -1201,11 +1195,6 @@ _ecore_exe_is_it_alive(pid_t pid)
* I will probably copy my urunlevel code into here someday. * I will probably copy my urunlevel code into here someday.
*/ */
exe = _ecore_exe_find(pid); exe = _ecore_exe_find(pid);
if (exe)
{
if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
exe = NULL;
}
return exe; return exe;
} }
@ -1218,10 +1207,11 @@ _ecore_exe_make_sure_its_dead(void *data)
dead = data; dead = data;
if (dead) if (dead)
{ {
Ecore_Exe *exe = NULL; Ecore_Exe *obj = NULL;
if ((exe = _ecore_exe_is_it_alive(dead->pid))) if ((obj = _ecore_exe_is_it_alive(dead->pid)))
{ {
Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
if (dead->cmd) if (dead->cmd)
INF("Sending KILL signal to allegedly dead %s (%d).", INF("Sending KILL signal to allegedly dead %s (%d).",
dead->cmd, dead->pid); dead->cmd, dead->pid);
@ -1250,10 +1240,11 @@ _ecore_exe_make_sure_its_really_dead(void *data)
dead = data; dead = data;
if (dead) if (dead)
{ {
Ecore_Exe *exe = NULL; Ecore_Exe *obj = NULL;
if ((exe = _ecore_exe_is_it_alive(dead->pid))) if ((obj = _ecore_exe_is_it_alive(dead->pid)))
{ {
Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
ERR("RUN! The zombie wants to eat your brains! And your CPU!"); ERR("RUN! The zombie wants to eat your brains! And your CPU!");
if (dead->cmd) if (dead->cmd)
INF("%s (%d) is not really dead.", dead->cmd, dead->pid); INF("%s (%d) is not really dead.", dead->cmd, dead->pid);
@ -1279,33 +1270,39 @@ _ecore_exe_init(void)
void void
_ecore_exe_shutdown(void) _ecore_exe_shutdown(void)
{ {
while (exes) Ecore_Exe *exe = NULL;
ecore_exe_free(exes); Eina_List *l1, *l2;
EINA_LIST_FOREACH_SAFE(exes, l1, l2, exe)
ecore_exe_free(exe);
} }
Ecore_Exe * Ecore_Exe *
_ecore_exe_find(pid_t pid) _ecore_exe_find(pid_t pid)
{ {
Ecore_Exe *exe; Eina_List *itr;
Ecore_Exe *obj;
EINA_INLIST_FOREACH(exes, exe) EINA_LIST_FOREACH(exes, itr, obj)
{ {
Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
if (exe->pid == pid) if (exe->pid == pid)
return exe; return obj;
} }
return NULL; return NULL;
} }
Ecore_Timer * Ecore_Timer *
_ecore_exe_doomsday_clock_get(Ecore_Exe *exe) _ecore_exe_doomsday_clock_get(Ecore_Exe *obj)
{ {
Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
return exe->doomsday_clock; return exe->doomsday_clock;
} }
void void
_ecore_exe_doomsday_clock_set(Ecore_Exe *exe, _ecore_exe_doomsday_clock_set(Ecore_Exe *obj,
Ecore_Timer *dc) Ecore_Timer *dc)
{ {
Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
exe->doomsday_clock = dc; exe->doomsday_clock = dc;
} }
@ -1427,11 +1424,11 @@ _ecore_exe_data_generic_handler(void *data,
Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler *fd_handler,
Ecore_Exe_Flags flags) Ecore_Exe_Flags flags)
{ {
Ecore_Exe *exe; Ecore_Exe *obj = data;
int child_fd; int child_fd;
int event_type; int event_type;
exe = data; Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
/* Sort out what sort of handler we are. */ /* Sort out what sort of handler we are. */
if (flags & ECORE_EXE_PIPE_READ) if (flags & ECORE_EXE_PIPE_READ)
@ -1514,7 +1511,7 @@ _ecore_exe_data_generic_handler(void *data,
if (!(exe->flags & ECORE_EXE_PIPE_AUTO)) if (!(exe->flags & ECORE_EXE_PIPE_AUTO))
{ {
e = ecore_exe_event_data_get(exe, flags); e = ecore_exe_event_data_get(obj, flags);
if (e) /* Send the event. */ if (e) /* Send the event. */
ecore_event_add(event_type, e, ecore_event_add(event_type, e,
_ecore_exe_event_exe_data_free, _ecore_exe_event_exe_data_free,
@ -1542,7 +1539,7 @@ _ecore_exe_data_generic_handler(void *data,
* mechenism should kick in. But let's give it a good * mechenism should kick in. But let's give it a good
* kick in the head anyway. * kick in the head anyway.
*/ */
ecore_exe_terminate(exe); ecore_exe_terminate(obj);
} }
break; break;
} }
@ -1572,13 +1569,13 @@ static Eina_Bool
_ecore_exe_data_write_handler(void *data, _ecore_exe_data_write_handler(void *data,
Ecore_Fd_Handler *fd_handler EINA_UNUSED) Ecore_Fd_Handler *fd_handler EINA_UNUSED)
{ {
Ecore_Exe *exe; Ecore_Exe *obj = data;
Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
exe = data;
if ((exe->write_fd_handler) && if ((exe->write_fd_handler) &&
(ecore_main_fd_handler_active_get (ecore_main_fd_handler_active_get
(exe->write_fd_handler, ECORE_FD_WRITE))) (exe->write_fd_handler, ECORE_FD_WRITE)))
_ecore_exe_flush(exe); _ecore_exe_flush(obj);
/* If we have sent all there is to send, and we need to close the pipe, then close it. */ /* If we have sent all there is to send, and we need to close the pipe, then close it. */
if ((exe->close_stdin == 1) if ((exe->close_stdin == 1)
@ -1600,9 +1597,10 @@ _ecore_exe_data_write_handler(void *data,
} }
static void static void
_ecore_exe_flush(Ecore_Exe *exe) _ecore_exe_flush(Ecore_Exe *obj)
{ {
int count; int count;
Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
/* check whether we need to write anything at all. */ /* check whether we need to write anything at all. */
if ((exe->child_fd_write == -1) || (!exe->write_data_buf)) if ((exe->child_fd_write == -1) || (!exe->write_data_buf))
@ -1617,7 +1615,7 @@ _ecore_exe_flush(Ecore_Exe *exe)
{ {
if (errno == EIO || errno == EBADF || errno == EPIPE || errno == EINVAL || errno == ENOSPC) /* we lost our exe! */ if (errno == EIO || errno == EBADF || errno == EPIPE || errno == EINVAL || errno == ENOSPC) /* we lost our exe! */
{ {
ecore_exe_terminate(exe); ecore_exe_terminate(obj);
if (exe->write_fd_handler) if (exe->write_fd_handler)
ecore_main_fd_handler_active_set(exe->write_fd_handler, 0); ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
} }
@ -1687,9 +1685,10 @@ _ecore_exe_event_del_free(void *data EINA_UNUSED,
} }
static void static void
_ecore_exe_dead_attach(Ecore_Exe *exe) _ecore_exe_dead_attach(Ecore_Exe *obj)
{ {
struct _ecore_exe_dead_exe *dead; struct _ecore_exe_dead_exe *dead;
Ecore_Exe_Data *exe = eo_data_scope_get(obj, MY_CLASS);
if (exe->doomsday_clock_dead) return; if (exe->doomsday_clock_dead) return;
dead = calloc(1, sizeof(struct _ecore_exe_dead_exe)); dead = calloc(1, sizeof(struct _ecore_exe_dead_exe));
@ -1704,3 +1703,4 @@ _ecore_exe_dead_attach(Ecore_Exe *exe)
} }
} }
#include "ecore_exe.eo.c"

View File

@ -0,0 +1,32 @@
class Ecore.Exe (Eo.Base)
{
eo_prefix: ecore_obj_exe;
properties {
command @constructor {
/*@ Control the command that's executed. FIXME: May need a split/rename. */
set {
legacy null;
}
get {
legacy null;
}
values {
const(char) *exe_cmd; /*@ The command to execute. */
Ecore_Exe_Flags flags; /*@ The execution flags. */
}
}
}
methods {
}
implements {
Eo.Base.finalize;
}
}
/* FIXME: Notes:
Should run_priority be a class function?
Instead of having quit, interrupt, bla bla bla, just have an enum and one function? As it's essentially a signal send.
Rename the events.
*/