From: Sebastian B. <sb...@us...> - 2013-12-24 08:58:27
|
Update of /cvsroot/simplemail/simplemail/gtk In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv28684/gtk Modified Files: subthreads.c Log Message: Improved implementation of thread_call_parent_function_async_string(). Index: subthreads.c =================================================================== RCS file: /cvsroot/simplemail/simplemail/gtk/subthreads.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- subthreads.c 24 Dec 2013 08:57:37 -0000 1.30 +++ subthreads.c 24 Dec 2013 08:58:25 -0000 1.31 @@ -570,24 +570,61 @@ /***************************************************************************************/ +/* FIXME: Note that if the args are not passed in a register, but e.g., on the stack this doesn't need to + * work depending on the ABI + */ +static gboolean thread_call_function_async_string_entry(gpointer user_data) +{ + struct thread_call_function_sync_data *data = (struct thread_call_function_sync_data*)user_data; + + switch (data->argcount) + { + case 0: data->function(); break; + case 1: ((int (*)(void*))data->function)(data->arg[0]);break; + case 2: ((int (*)(void*,void*))data->function)(data->arg[0],data->arg[1]);break; + case 3: ((int (*)(void*,void*,void*))data->function)(data->arg[0],data->arg[1],data->arg[2]);break; + case 4: ((int (*)(void*,void*,void*,void*))data->function)(data->arg[0],data->arg[1],data->arg[2],data->arg[3]);break; + case 5: ((int (*)(void*,void*,void*,void*,void*))data->function)(data->arg[0],data->arg[1],data->arg[2],data->arg[3],data->arg[4]);break; + case 6: ((int (*)(void*,void*,void*,void*,void*,void*))data->function)(data->arg[0],data->arg[1],data->arg[2],data->arg[3],data->arg[4],data->arg[5]);break; + } + + if (data->argcount) + free(data->arg[0]); + + return 0; +} + int thread_call_parent_function_async_string(void *function, int argcount, ...) { - struct ipc_message msg; + struct thread_call_function_sync_data *data; + int i; + + struct thread_s *thread; + va_list argptr; + thread = &main_thread; + + assert(argcount < THREAD_CALL_FUNCTION_SYNC_DATA_NUM_ARGS); + + if (!(data = malloc(sizeof(*data)))) + return 0; + memset(data, 0, sizeof(*data)); + va_start(argptr,argcount); - memset(&msg,0,sizeof(msg)); - msg.async = 1; - msg.string = 1; - msg.function = function; - msg.argcount = argcount; - if (argcount--) msg.arg1 = mystrdup(va_arg(argptr, char *)); - if (argcount--) msg.arg2 = va_arg(argptr, void *); - if (argcount--) msg.arg3 = va_arg(argptr, void *); - if (argcount--) msg.arg4 = va_arg(argptr, void *); - write(sockets[1],&msg,sizeof(msg)); - va_end(argptr); - return 0; + + data->function = (int (*)(void))function; + data->argcount = argcount; + + if (argcount) + data->arg[0] = strdup(va_arg(argptr, char *)); + + for (i=1; i < argcount; i++) + data->arg[i] = va_arg(argptr, void *); + + va_end (argptr); + + g_main_context_invoke(thread->context, thread_call_function_async_string_entry, data); } /***************************************************************************************/ |