/*
** ppc.library emulation
** (c)1998-2000 Frank Wille <frank@phoenix.owl.de>
**
** PowerUp Message System
**
** V0.8a (25.07.2000) phx
**       PPCMsgPort.pln is used for port list ports only, to allow
**       public ports to be in a port list too.
** V0.8  (28.06.2000) phx
**       Included PPCPortList definition and waitPortList() prototype.
** V0.5d (27.03.1999) phx
**       Created.
*/

#ifndef MSGSYSTEM_H
#define MSGSYSTEM_H

#ifndef EXEC_LISTS_H
#include <exec/lists.h>
#endif

#ifndef MPSEMA_H
#include "mpsema.h"
#endif


struct PPCMsgPort {
  struct Node n;                        /* node for public ports */
  struct Node pln;                      /* node for port-list ports */
  UBYTE flags;
  BYTE sigBit;
  void *sigTask;                        /* M68k or PPC task structure */
  struct MPSemaphore mpSema;            /* CPU and task arbitration */
  UBYTE reserved1[32];                  /* security gap */
  struct List msgList;                  /* list of PPCMessage structures */
  ULONG obtaincnt;                      /* port can only be deleted when 0 */
  UBYTE reserved2[32];                  /* security gap */
};


struct PPCMessage {
  struct Node n;
  UWORD reserved;
  struct PPCMsgPort *replyPort;
  ULONG maxdatasize;
  ULONG msgid;
  void *data;
  ULONG datasize;
};


struct PPCPortList {
  struct List portlist;                 /* list of PPCMsgPorts */
  ULONG signal_mask;                    /* MsgPorts and extended signals */
  ULONG extended_signals;               /* extended, non PortList signals */
  ULONG received_signals;               /* rec. sigs. after last Wait */
};


/* prototypes: PPC message system */
struct PPCMsgPort *createPPCMsgPort(struct PPCLibBase *,char *,ULONG *);
BOOL deletePPCMsgPort(struct PPCLibBase *,struct PPCMsgPort *);
struct PPCMsgPort *obtainPPCMsgPort(struct PPCLibBase *,char *);
BOOL releasePPCMsgPort(struct PPCLibBase *,struct PPCMsgPort *);
struct PPCMessage *waitPPCMessage(struct PPCLibBase *,struct PPCMsgPort *);
struct PPCMessage *getPPCMessage(struct PPCLibBase *,struct PPCMsgPort *);
BOOL putPPCMessage(struct PPCLibBase *,struct PPCMsgPort *,
                   struct PPCMessage *);
BOOL replyPPCMessage(struct PPCLibBase *,struct PPCMessage *);
struct PPCMsgPort *waitPortList(struct PPCLibBase *,struct PPCPortList *);

#endif /* MSGSYSTEM_H */
