Path: utzoo!utgpu!watserv1!ria!helios.physics.utoronto.ca!news-server.csri.toronto.edu!rutgers!cbmvax!cbmehq!babylon!rbabel From: rbabel@babylon.rmt.sub.org (Ralph Babel) Newsgroups: comp.sys.amiga.programmer Subject: Re: Help! (AmigaDOS CreateProc/LoadSeg) Message-ID: <06585.AA06585@babylon.rmt.sub.org> Date: 13 Mar 91 10:43:13 GMT References: <63329@eerie.acsu.Buffalo.EDU> <19578@cbmvax.commodore.com> <06417.AA06417@babylon.rmt.sub.org> <06533.AA06533@babylon.rmt.sub.org> <19832@cbmvax.commodore.com> Reply-To: cbmvax.commodore.com!cbmehq!babylon!rbabel (Ralph Babel) Lines: 65 In article <19832@cbmvax.commodore.com>, mks@cbmvax.commodore.com (Michael Sinz) writes: > Have always the same startup code which gets the startup > message. In the startup message, have a function pointer > that points at the real function to run. Sounds a lot like an article of mine published in Amiga-Magazin #2/1990. :-) Here's an excerpt: ------------------------------------------------------------ struct StartupMessage { struct Message Message; LONG (*Function)(void *); void *Argument; LONG Result; }; /*** process entry point, MUST BE first function in module! ***/ static void __saveds ProcEntry(void) { struct MsgPort *mp; struct StartupMessage *sm; mp = &((struct Process *)FindTask(NULL))->pr_MsgPort; for(;;) if(WaitPort(mp) != NULL) if((sm = (struct StartupMessage *)GetMsg(mp)) != NULL) break; sm->Result = (*sm->Function)(sm->Argument); Forbid(); ReplyMsg((struct Message *)sm); } /*** code section ***/ static struct MsgPort *NewProc( struct StartupMessage *sm, LONG (*pfl)(void *), void *arg) { struct MsgPort *mp; sm->Function = pfl; sm->Argument = arg; if((mp = CreateProc("ChildProc", DEFAULT_PRI, CADDR(ProcEntry) - 1, DEFAULT_STACK)) != NULL) { PutMsg(mp, (struct Message *)sm); } return mp; } ------------------------------------------------------------ Ralph