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);
}
/***************************************************************************************/
|