/************* * 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); }
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); }