/************* * DESCRIPTION: send a shutdown message to a subtask and free subtask structure * INPUT: st subtask structure * OUTPUT: - *************/ void KillSubTaskPPC(struct SubTask *st) { SendSubTaskMsgPPC(st,STC_SHUTDOWN,st); if(st->st_Port) DeleteMsgPortPPC(st->st_Port); if(st->st_Reply) DeleteMsgPortPPC(st->st_Reply); FreeVec(st); }
/************* * DESCRIPTION: create a subtask * INPUT: type type of subtask * sigbit signal bit for reply port * name name of the task * priority * stack * OUTPUT: subtask structure *************/ struct SubTask *CreateSubTaskPPC(ULONG type, LONG sigbit, char *name, ULONG priority, ULONG stack) { struct SubTask *st; st = (struct SubTask*)AllocVec(sizeof(struct SubTask), MEMF_PUBLIC|MEMF_CLEAR); if(st) { st->st_Reply = CreateMsgPortPPC(); if(!st->st_Reply) { FreeVec(st); return NULL; } st->st_Port = CreateMsgPortPPC(); if(!st->st_Port) { DeleteMsgPortPPC(st->st_Reply); FreeVec(st); return NULL; } st->st_Task = (struct Task *)CreateTaskPPCTags( TASKATTR_CODE, PreviewSubTaskPPC, TASKATTR_NAME, name, //TASKATTR_PRI, priority, TASKATTR_R3, st, //TASKATTR_STACKSIZE, stack, TAG_DONE); if(!st->st_Task) { FreeVec(st); st = NULL; } } return st; }
void amigaExit(void) { #if USE_RESETHANDLER rem_resethandler(); #endif #ifndef NO_GUI amigaCloseNewConsole(); amigaGUIDeinit(); #endif #ifdef __amigaos4__ if (ISocket) DropInterface((struct Interface *)ISocket); #else CloseLibrary((struct Library *)LocaleBase); #endif CloseLibrary((struct Library *)SocketBase); #ifdef __OS3PPC__ /* ** PPC */ #ifdef CHANGE_MIRROR_TASK_PRI SetTaskPri(FindTask(NULL), Old68kMirrorPri); #endif #ifdef __POWERUP__ /* ** PowerUp */ if (TriggerPort) { while (!PPCDeletePort(TriggerPort)) amigaSleep(0,250000); } CloseLibrary(PPCLibBase); #else /* ** WarpOS */ if (TriggerPort) { RemPortPPC(TriggerPort); DeleteMsgPortPPC(TriggerPort); } #endif #else /* ** 68K / OS4 / MorphOS */ if (TriggerPort) { RemPort(TriggerPort); DeleteMsgPort(TriggerPort); } #endif GlobalTimerDeinit(); #if USE_RESETHANDLER finish_resethandler(); #endif }
int amigaPutTriggerSigs(ULONG trigs) { int done = -1; #ifndef __OS3PPC__ /* ** 68K / OS4 / MorphOS */ struct TriggerMessage msg; if ((msg.tm_ExecMsg.mn_ReplyPort = CreateMsgPort())) { struct MsgPort *port; msg.tm_TriggerType = trigs; msg.tm_ExecMsg.mn_Node.ln_Type = NT_MESSAGE; msg.tm_ExecMsg.mn_Length = sizeof(struct TriggerMessage); Forbid(); if ((port = FindPort("dnetc")) && port != TriggerPort) { PutMsg(port,(struct Message *)&msg); } Permit(); if (port && port != TriggerPort) { WaitPort(msg.tm_ExecMsg.mn_ReplyPort); GetMsg(msg.tm_ExecMsg.mn_ReplyPort); done = 1; } else { done = 0; } DeleteMsgPort(msg.tm_ExecMsg.mn_ReplyPort); } #elif !defined(__POWERUP__) /* ** WarpOS */ struct TriggerMessage msg; struct MsgPortPPC *replyport; if ((replyport = CreateMsgPortPPC())) { msg.tm_ExecMsg.mn_ReplyPort = (struct MsgPort *)replyport; msg.tm_ExecMsg.mn_Node.ln_Type = NT_MESSAGE; msg.tm_ExecMsg.mn_Length = sizeof(struct TriggerMessage); msg.tm_TriggerType = trigs; struct MsgPortPPC *port; if ((port = FindPortPPC("dnetc")) && port != TriggerPort) { PutMsgPPC(port,(struct Message *)&msg); WaitPortPPC(replyport); GetMsgPPC(replyport); done = 1; } else { done = 0; } DeleteMsgPortPPC(replyport); } #else /* ** PowerUp */ struct TagItem tags[2] = { {PPCPORTTAG_NAME, (ULONG)"dnetc"}, {TAG_END,0} }; void *msg, *replyport, *port; if ((replyport = PPCCreatePort(NULL))) { if ((msg = PPCCreateMessage(replyport,0))) { done = 0; if ((port = PPCObtainPort(tags))) { if (port != TriggerPort) { if (PPCSendMessage(port,msg,NULL,0,trigs)) { PPCWaitPort(replyport); PPCGetMessage(replyport); done = 1; } } PPCReleasePort(port); } PPCDeleteMessage(msg); } PPCDeletePort(replyport); } #endif return(done); }