/************* * DESCRIPTION: send a message to a subtask and wait for reply * INPUT: st subtask structure * command * params * OUTPUT: result returned from subtask *************/ LONG SendSubTaskMsgPPC(struct SubTask *st, WORD command, APTR params) { st->st_Message.stm_Message.mn_ReplyPort = (struct MsgPort*)st->st_Reply; st->st_Message.stm_Message.mn_Length = sizeof(struct SubTaskMsg); st->st_Message.stm_Command = command; st->st_Message.stm_Parameter = params; st->st_Message.stm_Result = 0; PutMsgPPC(st->st_Port, (struct Message *)&st->st_Message); WaitPortPPC(st->st_Reply); GetMsgPPC(st->st_Reply); return(st->st_Message.stm_Result); }
ULONG amigaGetTriggerSigs(void) { ULONG trigs = 0, sigr; sigr = SetSignal(0L,0L); if ( sigr & SIGBREAKF_CTRL_C ) trigs |= DNETC_MSG_SHUTDOWN; #ifndef NO_GUI if ( DnetcBase && ModeReqIsSet(-1) ) trigs |= dnetcguiHandleMsgs(sigr); #endif #ifndef __OS3PPC__ /* ** 68K / OS4 / MorphOS */ if ( TriggerPort && sigr & 1L << TriggerPort->mp_SigBit ) { struct TriggerMessage *msg; while ((msg = (struct TriggerMessage *)GetMsg(TriggerPort))) { trigs |= msg->tm_TriggerType; ReplyMsg((struct Message *)msg); } } #elif !defined(__POWERUP__) /* ** WarpOS */ if ( TriggerPort && sigr & 1L << TriggerPort->mp_Port.mp_SigBit ) { struct TriggerMessage *msg; while ((msg = (struct TriggerMessage *)GetMsgPPC(TriggerPort))) { trigs |= msg->tm_TriggerType; ReplyMsgPPC((struct Message *)msg); } } #else /* ** PowerUp */ { void *msg; while ((msg = PPCGetMessage(TriggerPort))) { trigs |= PPCGetMessageAttr(msg,PPCMSGTAG_MSGID); PPCReplyMessage(msg); } } #endif return(trigs); }
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); }