/* queue.h - firstid, firstkey, isempty, lastkey, nonempty */ /* Queue structure declarations, constants, and inline functions */ /* Default # of queue entries: 1 per process plus 2 for ready list plus */ /* 2 for sleep list plus 2 per semaphore */ #ifndef NQENT #define NQENT (NPROC + 4 + NSEM + NSEM) #endif #define EMPTY (-1) /* Null value for qnext or qprev index */ #define MAXKEY 0x7FFFFFFF /* Max key that can be stored in queue */ #define MINKEY 0x80000000 /* Min key that can be stored in queue */ struct qentry { /* One per process plus two per list */ uint16 qkey; /* Key on which the queue is ordered */ // int32 qkey; /* Key on which the queue is ordered */ qid16 qnext; /* Index of next process or tail */ qid16 qprev; /* Index of previous process or head */ }; extern struct qentry queuetab[]; /* Inline queue manipulation functions */ #define queuehead(q) (q) #define queuetail(q) ((q) + 1) #define firstid(q) (queuetab[queuehead(q)].qnext) #define lastid(q) (queuetab[queuetail(q)].qprev) #define isempty(q) (firstid(q) >= NPROC) #define nonempty(q) (firstid(q) < NPROC) #define firstkey(q) (queuetab[firstid(q)].qkey) #define lastkey(q) (queuetab[ lastid(q)].qkey) /* Inline to check queue id assumes interrupts are disabled */ #define isbadqid(x) (((int32)(x) < NPROC) || (int32)(x) >= NQENT-1)