home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* mptsk.h -- MAIL BOX MULTITASKING CLUSTER (INTERFACE) */
- /* Created: 12/12/87 Release: 0.7 Version: 6/27/88 */
- /****************************************************************************
- (c) Copyright 1987 by Michael Benjamin Parker (USA SS# 557-49-4130)
-
- All Rights Reserved unless specified in the following include files: */
- #include "mptsk.cpy" /*
-
- DO NOT REMOVE OR ALTER THIS NOTICE AND ITS PROVISIONS.
- ****************************************************************************/
- /* OVERVIEW:
-
- WARNING WARNING: This code and/or the mptskex1.c code has a bug which causes
- the program to occasionally hang on a mptsk_xfer call (specifically in the
- mpthd_switch(). It will be debugged further.
-
-
- This cluster provides operations and datatypes for the middle (2nd) layer
- of mailbox multitasking. To the previous mpthd (thread) library, it
- adds tasks (mptsk), messages (mpmsg), and mailboxes (mpbox).
-
- Tasks can send and receive (transfer) messages through the mailboxes.
- For non-blocking transfers, if a message is sent to a mailbox and no tasks
- are waiting for it, the message is queued. Likewise, if task tries to
- receive off a mailbox and no messages are available, the task is queued.
- (Always FIFO ordering).
-
- Mailboxes, like all datatypes in this cluster, have a special ring (mprng)
- header. This allows mailboxes to be organized to rings (circular lists).
- A ring of mailboxes is treated as a priority schedule, each mailbox
- holding tasks waiting to be run. These mailboxes are given the special
- name mpscd (schedule) and are used for scheduling. When a new task is
- needed to run, the schedule boxes are searched in order until one is found.
-
- Normally, the uppermost schedule box (mpscd_toptasks()) is searched first,
- but an alternative schedule list can be provided and allows for tasks
- to subschedule their own time (elaborate priority hiearchies).
-
- Mailbox transfers and scheduling is very fast, with distributed local
- access ideally suited for course-grain multiprocessor machines.
-
- See file mptsk.tex (BYTE article) for more details.
-
- WARNING: Must be compiled with all stack-overflow checking features
- turned off!
- *****************************************************************************/
- /****************************************************************************/
- #ifndef MPTSK_H
- #define MPTSK_H
- /****************************************************************************/
- #if (!((defined(unix) && (defined(vax) || defined(ibm032)||defined(ibm370))) \
- || defined(__TURBOC__) || defined(M_I86)))
- Error! Currently, this code only runs:
- in UNIX C (on the IBM RT or VAX)
- in MS-DOS (in Turbo C or Microsoft C)
- #endif
- /****************************************************************************/
- /****************************************************************************/
- #include "mpmisc.h"
- #include "mpthd.h"
- #include "mpbox.h"
- #define NDEBUG 1
- #include "mpbug.h"
- /****************************************************************************/
- /****************************************************************************/
- /* DATA INTERFACE: */
- typedef struct _MPTSK MPTSK, PTR MPTSKID; /* A TASK */
- typedef MPRNG MPMSG, PTR MPMSGID; /* A MESSAGE */
- typedef MPBOX MPSCD, PTR MPSCDID; /* A TASK SCHEDULE */
- /****************************************************************************/
- /* SUGGESTED TASK PRIORITY SCHEDULE */
- extern MPSCD mpscd_emergencytasks[1];
- extern MPSCD mpscd_timecriticaltasks[1];
- extern MPSCD mpscd_interactivetasks[1];
- extern MPSCD mpscd_backgroundtasks[1];
- extern MPSCD mpscd_batchtasks[1];
- extern MPSCD mpscd_idletasks[1]; /* REQUIRED */
- /****************************************************************************/
- /* CODE INTERFACE: */
- /****************************************************************************/
- /****************************************************************************/
- /****************************************************************************/
- void mptsk_setup ARGS((void));
- MPTSKID mptsk_init ARGS(( VOIDPTR buf, MPTHDID mpthd,
- MPBOXID sched));
- VOIDPTR mptsk_dinit ARGS(( MPBOXID sched));
- MPMSGID mptsk_xfer ARGS((MPBOXID mpbox, MPMSGID mpmsg,
- BOOL block, MPSCDID mpscd));
- #define mpscd_init mpbox_init
- #define mpscd_dinit mpbox_dinit
- /****************************************************************************/
- /****************************************************************************/
- #define mpscd_toptasks() ((MPSCDID)mprng_next(mpscd_idletasks))
- /****************************************************************************/
- #define mptsk_me() (_mptsk_me)
- #define mptsk_mpscd(mptsk) ((mptsk)->mpscd)
- #define mptsk_mympscd() mptsk_mpscd(mptsk_me())
- #define mptsk_mpbox(mptsk) str2fld(mptsk,mpbox)
- #define mptsk_mympbox() (mptsk_mpbox(mptsk_me()))
- #define mptsk_owns(mptsk) str2fld(mptsk,owns)
- #define mptsk_myowns() mptsk_owns(mptsk_me())
- #define mptsk_waitingfor(mptsk) ((mptsk)->waitingfor)
- #define mptsk_mywaitingfor() mptsk_waitingfor(mptsk_me())
- #define mptsk_mpthd(mptsk) ((mptsk)->mpthd)
- #define mptsk_mympthd() mptsk_mpthd(mptsk_me())
- /****************************************************************************/
- /* MACROS FOR TYPICAL USES OF THE mptsk_xfer() FUNCTION */
- /****************************************************************************/
- #define mptsk_send(mpbox,mpmsg) /* SEND mpmsg TO mpbox */ \
- mptsk_xfer(mpbox,mpmsg,BOOL_TRUE,mpscd_toptasks())
-
- #define mptsk_csend(mpbox,mpmsg)/* SEND mpmsg TO mpbox IFF HAS A RECVR */ \
- mptsk_xfer(mpbox,mpmsg,BOOL_FALSE,mpscd_toptasks())
-
- #define mptsk_recv(mpbox) /* RECV A MPMSG FROM mpbox */ \
- mptsk_xfer(mpbox,(MPMSGID)0,BOOL_TRUE,mpscd_toptasks())
-
- #define mptsk_crecv(mpbox) /* RECV A MPMSG FROM mpbox IFF HAS A MSG */ \
- mptsk_xfer(mpbox,(MPMSGID)0,BOOL_FALSE,mpscd_toptasks())
-
- #define mptsk_yield() /* TEMPORARILY YIELD CTRL TO OTHER TASKS */ \
- mptsk_recv(mptsk_mympscd())
-
- #define mptsk_yieldto(sched) /* TEMPORARILY YIELD CTRL TO sched TSK LST */\
- mptsk_xfer(mptsk_mysched(),(MPMSGID)0,BOOL_TRUE,sched)
- #define mptsk_broadcast(mpbox,mpmsg) until(mptsk_csend(mpbox,mpmsg)) {}
- /****************************************************************************/
- /****************************************************************************/
- /****************************************************************************/
- /* STRUCTURE, EXTERNAL-VARIBLE, AND MACRO DEFINITION: */
- /****************************************************************************/
- /****************************************************************************/
- struct _MPTSK {
- MPMSG _mpmsg; /* MANIPULATE A TASK AS A MESSAGE */
- MPTHDID mpthd; /* STORAGE FOR THE TASK'S STATE */
- MPSCDID mpscd; /* THE TASK'S DEFAULT SCHEDULE BOX */
- MPMSGID mpmsg; /* TEMPORARY MESSAGE-PASSING STORAGE*/
- MPBOX mpbox; /* THE TASK'S PERSONAL MAIL BOX (ACCESSORY) */
- MPRNG owns; /* RESOURCE SOURCES THAT THE TASK OWNS */
- MPBOXID waitingfor; /* THE MAILBOX ON WHICH THE TASK IS WAITING */
- };
- /****************************************************************************/
- /* extern MPDEFID _mptsk_def; */
- extern MPTSKID _mptsk_me;
- /****************************************************************************/
- extern MPDEFID mpdef_tasksize;
- /*extern MPDEFID mpdef_mptsk;*/
- #define mpdef_mptsk (0)
- /****************************************************************************/
- #endif /* MPTSK_H */