From: Sebastian B. <sb...@us...> - 2001-09-30 13:35:44
|
Update of /cvsroot/simplemail/amiga-mui In directory usw-pr-cvs1:/tmp/cvs-serv31522 Modified Files: subthreads.c Log Message: Written a function to call functions asynchron Index: subthreads.c =================================================================== RCS file: /cvsroot/simplemail/amiga-mui/subthreads.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -r1.8 -r1.9 *** subthreads.c 2001/03/10 09:58:48 1.8 --- subthreads.c 2001/09/30 13:35:41 1.9 *************** *** 36,39 **** --- 36,40 ---- struct Message msg; int (*function)(void); + int async; int argcount; void *arg1,*arg2,*arg3,*arg4; *************** *** 93,97 **** } } ! ReplyMsg(&tmsg->msg); } } --- 94,99 ---- } } ! if (tmsg->async) FreeVec(tmsg); ! else ReplyMsg(&tmsg->msg); } } *************** *** 200,203 **** --- 202,206 ---- tmsg->arg3 = va_arg(argptr, void *);/*(void*)(*(&argcount + 3));*/ tmsg->arg4 = va_arg(argptr, void *);/*(void*)(*(&argcount + 4));*/ + tmsg->async = 0; va_end (arg_ptr); *************** *** 211,214 **** --- 214,270 ---- return rc; + #else + int rc; + void *arg1,*arg2,*arg3,*arg4; + va_list argptr; + + va_start(argptr,argcount); + + arg1 = va_arg(argptr, void *); + arg2 = va_arg(argptr, void *); + arg3 = va_arg(argptr, void *); + arg4 = va_arg(argptr, void *); + + switch (argcount) + { + case 0: return ((int (*)(void))function)();break; + case 1: return ((int (*)(void*))function)(arg1);break; + case 2: return ((int (*)(void*,void*))function)(arg1,arg2);break; + case 3: return ((int (*)(void*,void*,void*))function)(arg1,arg2,arg3);break; + case 4: return ((int (*)(void*,void*,void*,void*))function)(arg1,arg2,arg3,arg4);break; + } + + return 0; + #endif + } + + int thread_call_parent_function_async(void *function, int argcount, ...) + { + #ifndef DONT_USE_THREADS + struct ThreadMessage *tmsg = (struct ThreadMessage *)AllocVec(sizeof(struct ThreadMessage),MEMF_PUBLIC|MEMF_CLEAR); + if (tmsg) + { + struct Process *p = (struct Process*)FindTask(NULL); + va_list argptr; + + va_start(argptr,argcount); + + tmsg->msg.mn_ReplyPort = &p->pr_MsgPort; + tmsg->msg.mn_Length = sizeof(struct ThreadMessage); + tmsg->function = (int (*)(void))function; + tmsg->argcount = argcount; + tmsg->arg1 = va_arg(argptr, void *);/*(*(&argcount + 1));*/ + tmsg->arg2 = va_arg(argptr, void *);/*(void*)(*(&argcount + 2));*/ + tmsg->arg3 = va_arg(argptr, void *);/*(void*)(*(&argcount + 3));*/ + tmsg->arg4 = va_arg(argptr, void *);/*(void*)(*(&argcount + 4));*/ + tmsg->async = 1; + + va_end (arg_ptr); + + PutMsg(thread_port,&tmsg->msg); + return 1; + } + + return 0; #else int rc; |