#include        "queue.h"


/* Process management definitions : */

#define MAXPROCESS       64  /* maximum number of processes on one node */
#define MAXMSGQUEUE      16 /* maximum number of waiting messages */

#if DLINK
#define MSGLENGTH        80   /* message length defined by D-Link driver */
#elif TCPIP
#define MSGLENGTH       256   /* message length defined by me (PS) */
#else
#define MSGLENGTH       256   /* message length defined by me (PS) */
#endif


/* Process state : */

#define GENERATING      0    /* during generation of process object */
#define STOPPED         1      /* non-active process (suspended by STOP) */
#define EXECUTING       2     /* active process (ready to execute) */
#define WAITFORNEW      3    /* waiting for NEW of another process */
#define WAITFORRPC      4    /* waiting for remote procedure call */
#define ACCEPTING       5     /* during execution of ACCEPT statement */
#define WAITASKPRO      6    /* waiting for process prototype */

/* Process descriptor : */

typedef struct
{
    bool used;           /* TRUE if in use by some process */
    word mark;           /* process mark for proper detecting of none */
    int status;                /* process state */
    word prot;           /* process prototype number */
    memory M;      /* pointer to memory array */
    union value param[ MAXPARAM ];
    word ic;         /* instruction counter */
    word trlnumber;         /* trace line number */
    word lower;                /* first word of object area */
    word upper;                /* last word in memory */
    word lastused;           /* last word used by objects */
    word lastitem;           /* first word used by dictionary */
    word freeitem;           /* head of free dictionary item list */
    word headk;                /* head of killed object list for size > 2 */
    word headk2;               /* head of killed object list for size = 2 */
    word prochead;         /* am of process object */
    virtaddr procref;    /* process object virtual address */
    virtaddr template;   /* remote process or procedure template */
    word c1, c2;               /* pointers to current object */
    virtaddr backobj;     /* adress of object just left */
    word blck1, blck2;          /* used for LBLOCK1, LBLOCK2, LBLOCK3 */
    queue msgqueue;         /* queue of messages for this process */
    queue rpcwait;           /* queue of disabled RPC messages */
    stack rpcmask;           /* stack of set of enabled remote procedures */
    bool force_compactification; /* next allocate will forace compact... */
    word *hash;                /* table of pointers to processes in process */
    word hash_size;
} procdescr;


/* Message type : */

#define ERRSIG   0       /* error signal */
#define RESUME   1       /* resume request */
#define CREATE   2       /* create new process request */
#define CREACK   3       /* create process acknowledge */
#define KILLPR   4       /* kill process */
#define RPCALL   5       /* remote procedure call request */
#define RPCACK   6       /* remote procedure return */
#define ASKPRO   7       /* ask for process prototype */
#define PROACK   8       /* answer with process prototype */

typedef struct {
    word node;
    word pix;
    word mark;
} procaddr;

struct ctrlmsg
{
    procaddr sender;       /* address of the sender and */
    procaddr receiver;   /* receiver of the message */
    int type;      /* message type */
    int par;         /* prototype or error signal number */
};

#define MAXPROCPAR      (MSGLENGTH-sizeof(struct ctrlmsg))

typedef struct
{
    struct ctrlmsg control;
    char params[ MAXPROCPAR ];
} message;

/* Direction of copying of parameters (for moveparams()) : */

#define LOADPAR         0
#define SAVEPAR         1

typedef char *mask;

extern procdescr process[];     /* process descriptor table              */
extern procdescr *thisp;        /* pointer to current process descriptor */
extern word thispix;            /* current process index                 */
extern queue ready;             /* Round-Robin queue of ready processes  */
extern bool network;            /* TRUE if operating in D-Link network   */
extern message globmsgqueue[];  /* queue of waiting messages             */
extern int msgready;            /* number of waiting messages            */
extern int msghead, msgtail;    /* pointers to message queue             */
extern word ournode;            /* this machine node number              */
extern word console;            /* console node number                   */
extern bool remote;             /* TRUE if remote node                   */
extern bool reschedule;         /* TRUE if rescheduling is mandatory     */

#if OS2
extern PGINFOSEG ginf;          /* pointer to Global Info Segment */
#endif



#ifndef NO_PROTOTYPES
void obj2mess(word *,virtaddr *,procaddr*);
void mess2obj(procdescr *,procaddr *,virtaddr*);
bool isprocess(virtaddr *);
void hash_find(procaddr *,virtaddr *);
void hash_create(procdescr *,int);
void hash_set(procaddr *,word);
#else
void obj2mess();
void mess2obj();
bool isprocess();
void hash_find();
void hash_create();
void hash_set();
#endif

