/*- * Copyright (c) 2017-2020 Carsten Sonne Larsen * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "config.h" #include "global.h" #include "message.h" #include "mem.h" void SendMessage(long type) { SendMessageTo(Ports.BrokerPort, Ports.MemoryPort, type); } void SendMessageTo(struct MsgPort *dest, struct MsgPort *reply, long type) { Forbid(); if (dest != NULL && reply != NULL) { struct ApplicationMesage *message = AllocStructSafe(struct ApplicationMesage); message->Msg.mn_Node.ln_Type = NT_MESSAGE; message->Msg.mn_Length = sizeof(struct ApplicationMesage); message->Msg.mn_ReplyPort = reply; message->MsgType = MSGTYPE_APP; message->MsgId = type; PutMsg(dest, (struct Message *)message); } Permit(); } void SendMessageWait(struct MsgPort *dest, long type) { struct MsgPort *replyPort; if (dest == NULL) { return; } replyPort = CreateMsgPort(); if (replyPort) { struct Message *msg; SendMessageTo(dest, replyPort, type); WaitPort(replyPort); msg = GetMsg(replyPort); DeleteMsgPort(replyPort); FreeMemSafe(msg); } } void CleanupVolMsgPort(struct MsgPort *volatile *port) { struct MsgPort *msgPort; bool exist = true; Forbid(); if (*port == NULL) { exist = false; } else { msgPort = *port; *port = NULL; } Permit(); if (exist) { struct Message *msg; while ((msg = GetMsg(msgPort))) { ReplyMsg(msg); } DeleteMsgPort(msgPort); } } void CleanupMsgPort(struct MsgPort **port) { struct Message *msg; struct MsgPort *msgPort = *port; if (*port == NULL) { return; } *port = NULL; while ((msg = GetMsg(msgPort))) { ReplyMsg(msg); } DeleteMsgPort(msgPort); }