sjorr@rose.waterloo.edu (Stephen Orr) (03/18/90)
Below is an example of my failure to get CreateTask to behave the way I expect it to. If anybody has any suggestions I would be very thankful. The code is compiled under Lattice, and while it will sometimes run fine, if I reboot the machine and run the same code it will lock up the machine (ie no Task Error, no Guru just everything stops). Upon reboot I get a Guru. Thanks in Advance Stephen Orr SandIsoft ---------------8<-------------------8<----------------------- /* * Here is example code to run two tasks on an Amiga, * compile it under Lattice with * * LC -L twotasks * * the __saveds keyword IS neccessary in order to ensure that * the new task(s) re-access the shared data space (ds) * * Initial test to open up two tasks, and have them close down * without crashing the Amiga ! (I hope) */ #include <exec/types.h> #include <exec/memory.h> #include <intuition/intuition.h> #include <exec/tasks.h> #include <proto/all.h> #define STACK 4096 struct NewWindow nw1 = {0,0,640,100,0,1,CLOSEWINDOW,WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|ACTIVATE,NULL,NULL,"Hello",NULL,NULL,0,0,0,0,WBENCHSCREEN}; struct NewWindow nw2 = {0,100,640,100,0,1,CLOSEWINDOW,WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|ACTIVATE,NULL,NULL,"There",NULL,NULL,0,0,0,0,WBENCHSCREEN}; volatile int task2 = 0;/* prevent register optimizations */ __saveds void OpenAWindow1(void); __saveds void OpenAWindow2(void); /* * here is our main code module */ main() { struct Task *subtask; IntuitionBase = (void *) OpenLibrary("intuition.library",0); GfxBase = (void *) OpenLibrary("graphics.library",0); if (IntuitionBase && GfxBase) { /* * Here we create the other task * and call our own */ subtask = CreateTask("Task Two",0,(APTR)OpenAWindow2, (unsigned long)STACK); OpenAWindow1(); /* * here's the really crude 'exit code', it ensures the sub-task * is done before killing it. The Delay(1) polls the sub task every * second (?) checking to see if it's done yet. There are other, * better ways to do this, but this one works for now. */ while (!task2) Delay(1); DeleteTask(subtask); } if (IntuitionBase) CloseLibrary(IntuitionBase); if (GfxBase) CloseLibrary(GfxBase); } /* end of main */ /* * This function opens a window as our main task */ __saveds void OpenAWindow1() { struct Window *win; struct Message *msg; win = OpenWindow(&nw1); /* * now wait for the closewindow message to come */ if (win) { Wait(1<<win->UserPort->mp_SigBit); while (msg=GetMsg(win->UserPort)) ReplyMsg(msg); CloseWindow(win); } } /* * This function is our 'sub task', it also opens a window */ __saveds void OpenAWindow2() { struct Window *win; struct Message *msg; win = OpenWindow(&nw2); if (win) { /* * now wait for the closewindow message to come */ Wait(1<<win->UserPort->mp_SigBit); while (msg=GetMsg(win->UserPort)) ReplyMsg(msg); CloseWindow(win); } task2 = 1; SetTaskPri(FindTask(0),-120); while (1); /* wait to die */ }