Ecore exe: refactor and fix compilation on windows.

This is the first step towards splitting it nicely. This fixes
compilation on windows (or so it seems from my testing) and takes out
all the platform specific code (posix included) out of the main source
file.
This commit is contained in:
Tom Hacohen 2014-08-27 11:00:11 +01:00
parent 5551567847
commit 686acd88f7
5 changed files with 1422 additions and 1323 deletions

View File

@ -97,6 +97,7 @@ lib/ecore/ecore_exe_private.h \
lib/ecore/ecore_private.h
if HAVE_WIN32
lib_ecore_libecore_la_SOURCES += lib/ecore/ecore_exe_win32.c
else
EXTRA_DIST += lib/ecore/ecore_exe_ps3.c
#if ECORE_HAVE_PS3
@ -105,7 +106,7 @@ EXTRA_DIST += lib/ecore/ecore_exe_ps3.c
#if ECORE_HAVE_EXOTIC
#libecore_la_SOURCES +=
#else
lib_ecore_libecore_la_SOURCES += lib/ecore/ecore_signal.c
lib_ecore_libecore_la_SOURCES += lib/ecore/ecore_signal.c lib/ecore/ecore_exe_posix.c
#endif
#endif
endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,11 @@
typedef enum
{
ECORE_EXE_WIN32_SIGINT,
ECORE_EXE_WIN32_SIGQUIT,
ECORE_EXE_WIN32_SIGTERM,
ECORE_EXE_WIN32_SIGKILL
} Ecore_Exe_Win32_Signal;
/* FIXME: Getting respawn to work
*
* There is no way that we can do anything about the internal state info of
@ -101,9 +109,7 @@ struct _Ecore_Exe_Data
Eina_Bool close_threads : 1;
Eina_Bool is_suspended : 1;
#endif
// FIXME: For now just waste memory on windows.
// #else
#else
Ecore_Fd_Handler *write_fd_handler; /* the fd_handler to handle write to child - if this was used, or NULL if not */
Ecore_Fd_Handler *read_fd_handler; /* the fd_handler to handle read from child - if this was used, or NULL if not */
Ecore_Fd_Handler *error_fd_handler; /* the fd_handler to handle errors from child - if this was used, or NULL if not */
@ -127,7 +133,7 @@ struct _Ecore_Exe_Data
Ecore_Timer *doomsday_clock; /* The Timer of Death. Muahahahaha. */
void *doomsday_clock_dead; /* data for the doomsday clock */
//#endif
#endif
Ecore_Exe_Cb pre_free_cb;
Eina_Bool close_stdin : 1;
@ -135,18 +141,32 @@ struct _Ecore_Exe_Data
typedef struct _Ecore_Exe_Data Ecore_Exe_Data;
EAPI extern int ECORE_EXE_EVENT_ADD;
EAPI extern int ECORE_EXE_EVENT_DEL;
EAPI extern int ECORE_EXE_EVENT_DATA;
EAPI extern int ECORE_EXE_EVENT_ERROR;
extern Eina_List *_ecore_exe_exes;
#ifdef _WIN32
void _win32_ecore_exe_run_priority_set(int pri);
int _win32_ecore_exe_run_priority_get(void);
Eo *_win32_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe);
Eina_Bool _win32_ecore_exe_send(Ecore_Exe *obj, Ecore_Exe_Data *exe, const void *data, int size);
Ecore_Exe_Event_Data *ecore_exe_event_data_get(Ecore_Exe *obj, Ecore_Exe_Data *exe, Ecore_Exe_Flags flags);
void _win32_ecore_exe_eo_base_destructor(Eo *obj, Ecore_Exe_Data *exe);
void _win32_ecore_exe_pause(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _win32_ecore_exe_continue(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _win32_ecore_exe_interrupt(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _win32_ecore_exe_quit(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _win32_ecore_exe_terminate(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _win32_ecore_exe_kill(Ecore_Exe *obj, Ecore_Exe_Data *exe);
#endif
Ecore_Exe *_ecore_exe_find(pid_t pid);
void *_ecore_exe_event_del_new(void);
void _ecore_exe_event_del_free(void *data EINA_UNUSED, void *ev);
void _ecore_exe_event_exe_data_free(void *data EINA_UNUSED, void *ev);
Ecore_Exe_Event_Add * _ecore_exe_event_add_new(void);
void _ecore_exe_event_add_free(void *data EINA_UNUSED, void *ev);
void _impl_ecore_exe_run_priority_set(int pri);
int _impl_ecore_exe_run_priority_get(void);
void _impl_ecore_exe_auto_limits_set(Ecore_Exe *obj, Ecore_Exe_Data *exe, int start_bytes, int end_bytes, int start_lines, int end_lines);
Eo *_impl_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe);
void _impl_ecore_exe_efl_control_suspend_set(Eo *obj EINA_UNUSED, Ecore_Exe_Data *exe, Eina_Bool suspend);
Eina_Bool _impl_ecore_exe_send(Ecore_Exe *obj, Ecore_Exe_Data *exe, const void *data, int size);
Ecore_Exe_Event_Data *_impl_ecore_exe_event_data_get(Ecore_Exe *obj, Ecore_Exe_Data *exe, Ecore_Exe_Flags flags);
void _impl_ecore_exe_eo_base_destructor(Eo *obj, Ecore_Exe_Data *exe);
void _impl_ecore_exe_pause(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _impl_ecore_exe_continue(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _impl_ecore_exe_interrupt(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _impl_ecore_exe_quit(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _impl_ecore_exe_terminate(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _impl_ecore_exe_kill(Ecore_Exe *obj, Ecore_Exe_Data *exe);
void _impl_ecore_exe_signal(Ecore_Exe *obj, Ecore_Exe_Data *exe, int num);
void _impl_ecore_exe_hup(Ecore_Exe *obj EINA_UNUSED, Ecore_Exe_Data *exe);

View File

@ -34,13 +34,7 @@
#define ECORE_EXE_WIN32_TIMEOUT 3000
typedef enum
{
ECORE_EXE_WIN32_SIGINT,
ECORE_EXE_WIN32_SIGQUIT,
ECORE_EXE_WIN32_SIGTERM,
ECORE_EXE_WIN32_SIGKILL
} Ecore_Exe_Win32_Signal;
static int run_pri = ECORE_EXE_PRIORITY_INHERIT;
static Eina_Bool
_ecore_exe_close_cb(void *data,
@ -303,7 +297,7 @@ _ecore_exe_enum_windows_procedure(HWND window,
}
void
_win32_ecore_exe_run_priority_set(int pri)
_impl_ecore_exe_run_priority_set(int pri)
{
switch (pri)
{
@ -337,7 +331,7 @@ _win32_ecore_exe_run_priority_set(int pri)
}
int
_win32_ecore_exe_run_priority_get(void)
_impl_ecore_exe_run_priority_get(void)
{
switch (run_pri)
{
@ -366,7 +360,7 @@ _win32_ecore_exe_run_priority_get(void)
}
Eo *
_win32_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe);
_impl_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe)
{
char exe_cmd_buf[PATH_MAX];
SECURITY_ATTRIBUTES sa;
@ -378,8 +372,8 @@ _win32_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe);
EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
DBG("Creating process %s", exe_cmd);
const char *exe_cmd = exe->cmd;
DBG("Creating process %s", exe_cmd);
Ecore_Exe_Flags flags = exe->flags;
if ((flags & ECORE_EXE_PIPE_AUTO) && (!(flags & ECORE_EXE_PIPE_ERROR))
@ -503,7 +497,7 @@ _win32_ecore_exe_eo_base_finalize(Eo *obj, Ecore_Exe_Data *exe);
goto delete_h_close;
}
exes = eina_list_append(exes, obj);
_ecore_exe_exes = eina_list_append(_ecore_exe_exes, obj);
e = (Ecore_Exe_Event_Add *)calloc(1, sizeof(Ecore_Exe_Event_Add));
if (!e) goto delete_h_close;
@ -546,7 +540,7 @@ delete_h_close:
}
Eina_Bool
_win32_ecore_exe_send(Ecore_Exe *obj,
_impl_ecore_exe_send(Ecore_Exe *obj,
Ecore_Exe_Data *exe,
const void *data,
int size)
@ -575,7 +569,7 @@ _win32_ecore_exe_send(Ecore_Exe *obj,
}
Ecore_Exe_Event_Data *
_win32_ecore_exe_event_data_get(Ecore_Exe *obj,
_impl_ecore_exe_event_data_get(Ecore_Exe *obj,
Ecore_Exe_Data *exe,
Ecore_Exe_Flags flags)
{
@ -687,7 +681,7 @@ _win32_ecore_exe_event_data_get(Ecore_Exe *obj,
}
void
_win32_ecore_exe_eo_base_destructor(Eo *obj, Ecore_Exe_Data *exe)
_impl_ecore_exe_eo_base_destructor(Eo *obj, Ecore_Exe_Data *exe)
{
void *data;
@ -714,12 +708,12 @@ _win32_ecore_exe_eo_base_destructor(Eo *obj, Ecore_Exe_Data *exe)
CloseHandle(exe->pipe_read.child_pipe_x);
free(exe->cmd);
exes = eina_list_remove(exes, obj);
_ecore_exe_exes = eina_list_remove(_ecore_exe_exes, obj);
IF_FREE(exe->tag);
}
void
_win32_ecore_exe_pause(Ecore_Exe *obj, Ecore_Exe_Data *exe)
_impl_ecore_exe_pause(Ecore_Exe *obj EINA_UNUSED, Ecore_Exe_Data *exe)
{
if (exe->is_suspended)
return;
@ -729,7 +723,7 @@ _win32_ecore_exe_pause(Ecore_Exe *obj, Ecore_Exe_Data *exe)
}
void
_win32_ecore_exe_continue(Ecore_Exe *obj, Ecore_Exe_Data *exe)
_impl_ecore_exe_continue(Ecore_Exe *obj EINA_UNUSED, Ecore_Exe_Data *exe)
{
if (!exe->is_suspended)
return;
@ -739,13 +733,8 @@ _win32_ecore_exe_continue(Ecore_Exe *obj, Ecore_Exe_Data *exe)
}
void
_win32_ecore_exe_interrupt(Ecore_Exe *obj)
_impl_ecore_exe_interrupt(Ecore_Exe *obj, Ecore_Exe_Data *exe)
{
EINA_MAIN_LOOP_CHECK_RETURN;
Ecore_Exe_Data *exe = eo_data_scope_get(obj, ECORE_EXE_CLASS);
if (!exe)
return;
CloseHandle(exe->process_thread);
exe->process_thread = NULL;
CloseHandle(exe->process);
@ -755,13 +744,8 @@ _win32_ecore_exe_interrupt(Ecore_Exe *obj)
}
void
_win32_ecore_exe_quit(Ecore_Exe *obj)
_impl_ecore_exe_quit(Ecore_Exe *obj, Ecore_Exe_Data *exe)
{
EINA_MAIN_LOOP_CHECK_RETURN;
Ecore_Exe_Data *exe = eo_data_scope_get(obj, ECORE_EXE_CLASS);
if (!exe)
return;
CloseHandle(exe->process_thread);
exe->process_thread = NULL;
CloseHandle(exe->process);
@ -771,14 +755,8 @@ _win32_ecore_exe_quit(Ecore_Exe *obj)
}
void
_win32_ecore_exe_terminate(Ecore_Exe *obj)
_impl_ecore_exe_terminate(Ecore_Exe *obj, Ecore_Exe_Data *exe)
{
EINA_MAIN_LOOP_CHECK_RETURN;
Ecore_Exe_Data *exe = eo_data_scope_get(obj, ECORE_EXE_CLASS);
if (!exe)
return;
/* CloseHandle(exe->thread); */
CloseHandle(exe->process);
exe->process = NULL;
@ -787,13 +765,8 @@ _win32_ecore_exe_terminate(Ecore_Exe *obj)
}
void
_win32_ecore_exe_kill(Ecore_Exe *obj)
_impl_ecore_exe_kill(Ecore_Exe *obj, Ecore_Exe_Data *exe)
{
EINA_MAIN_LOOP_CHECK_RETURN;
Ecore_Exe_Data *exe = eo_data_scope_get(obj, ECORE_EXE_CLASS);
if (!exe)
return;
CloseHandle(exe->process_thread);
exe->process_thread = NULL;
CloseHandle(exe->process);
@ -801,3 +774,29 @@ _win32_ecore_exe_kill(Ecore_Exe *obj)
exe->sig = ECORE_EXE_WIN32_SIGKILL;
while (EnumWindows(_ecore_exe_enum_windows_procedure, (LPARAM)obj)) ;
}
void
_impl_ecore_exe_auto_limits_set(Ecore_Exe *obj EINA_UNUSED,
Ecore_Exe_Data *exe EINA_UNUSED,
int start_bytes EINA_UNUSED,
int end_bytes EINA_UNUSED,
int start_lines EINA_UNUSED,
int end_lines EINA_UNUSED)
{
ERR("Not implemented on windows!");
}
void
_impl_ecore_exe_signal(Ecore_Exe *obj EINA_UNUSED,
Ecore_Exe_Data *exe EINA_UNUSED,
int num EINA_UNUSED)
{
ERR("Not implemented on windows!");
}
void
_impl_ecore_exe_hup(Ecore_Exe *obj EINA_UNUSED,
Ecore_Exe_Data *exe EINA_UNUSED)
{
ERR("Not implemented on windows!");
}