From: Sebastian B. <sb...@us...> - 2013-12-24 08:51:18
|
Update of /cvsroot/simplemail/simplemail/gtk In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv27882/gtk Modified Files: subthreads.c Log Message: Implemented thread_push_function() in a naive fashion. Index: subthreads.c =================================================================== RCS file: /cvsroot/simplemail/simplemail/gtk/subthreads.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- subthreads.c 24 Dec 2013 08:50:33 -0000 1.19 +++ subthreads.c 24 Dec 2013 08:51:16 -0000 1.20 @@ -335,12 +335,59 @@ /***************************************************************************************/ +gboolean thread_push_function_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; + } + free(data); + return FALSE; +} + int thread_push_function(void *function, int argcount, ...) { - int rc = 0; - fprintf(stderr, "%s() not implemented yet!\n", __PRETTY_FUNCTION__); - exit(1); - return rc; + struct thread_call_function_sync_data *data; + int i; + + va_list argptr; + + if (!(data = malloc(sizeof(*data)))) + return 0; + memset(data, 0, sizeof(*data)); + + assert(argcount < THREAD_CALL_FUNCTION_SYNC_DATA_NUM_ARGS); + + va_start(argptr,argcount); + + data->function = (int (*)(void))function; + data->argcount = argcount; + data->sync_cond = g_cond_new(); + data->sync_mutex = g_mutex_new(); + + assert(data->sync_cond); + assert(data->sync_mutex); + + for (i=0; i < argcount; i++) + data->arg[i] = va_arg(argptr, void *); + + va_end (argptr); + + + GSource *s = g_timeout_source_new(1); + g_source_set_callback(s, thread_push_function_entry, data, NULL); + g_source_attach(s, thread_get()->context); + g_source_unref(s); + + return 1; } /***************************************************************************************/ |