home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / MAILBOX.ZIP / MPTSK.H < prev    next >
Encoding:
C/C++ Source or Header  |  1988-06-27  |  7.5 KB  |  152 lines

  1. /****************************************************************************/
  2. /* mptsk.h  -- MAIL BOX MULTITASKING CLUSTER        (INTERFACE)        */
  3. /* Created:  12/12/87        Release:  0.7        Version:  6/27/88   */
  4. /****************************************************************************
  5. (c) Copyright 1987 by Michael Benjamin Parker           (USA SS# 557-49-4130)
  6.  
  7. All Rights Reserved unless specified in the following include files: */
  8. #include "mptsk.cpy" /*
  9.  
  10. DO NOT REMOVE OR ALTER THIS NOTICE AND ITS PROVISIONS.
  11. ****************************************************************************/
  12. /* OVERVIEW:
  13.  
  14. WARNING WARNING:  This code and/or the mptskex1.c code has a bug which causes
  15. the program to occasionally hang on a mptsk_xfer call (specifically in the
  16. mpthd_switch().  It will be debugged further.
  17.  
  18.  
  19. This cluster provides operations and datatypes for the middle (2nd) layer
  20. of mailbox multitasking.  To the previous mpthd (thread) library, it
  21. adds tasks (mptsk), messages (mpmsg), and mailboxes (mpbox).
  22.  
  23. Tasks can send and receive (transfer) messages through the mailboxes.
  24. For non-blocking transfers, if a message is sent to a mailbox and no tasks
  25. are waiting for it, the message is queued.  Likewise, if task tries to
  26. receive off a mailbox and no messages are available, the task is queued.
  27. (Always FIFO ordering).
  28.  
  29. Mailboxes, like all datatypes in this cluster, have a special ring (mprng)
  30. header.  This allows mailboxes to be organized to rings (circular lists).
  31. A ring of mailboxes is treated as a priority schedule, each mailbox
  32. holding tasks waiting to be run.  These mailboxes are given the special
  33. name mpscd (schedule) and are used for scheduling.  When a new task is
  34. needed to run, the schedule boxes are searched in order until one is found.
  35.  
  36. Normally, the uppermost schedule box (mpscd_toptasks()) is searched first,
  37. but an alternative schedule list can be provided and allows for tasks
  38. to subschedule their own time (elaborate priority hiearchies).
  39.  
  40. Mailbox transfers and scheduling is very fast, with distributed local
  41. access ideally suited for course-grain multiprocessor machines.
  42.  
  43. See file mptsk.tex (BYTE article) for more details.
  44.  
  45. WARNING: Must be compiled with all stack-overflow checking features
  46. turned off!
  47. *****************************************************************************/
  48. /****************************************************************************/
  49. #ifndef    MPTSK_H
  50. #define MPTSK_H
  51. /****************************************************************************/
  52. #if (!((defined(unix) && (defined(vax) || defined(ibm032)||defined(ibm370))) \
  53.     || defined(__TURBOC__) || defined(M_I86)))
  54.     Error!  Currently, this code only runs:
  55.         in UNIX C (on the IBM RT or VAX)
  56.         in MS-DOS (in  Turbo C or Microsoft C)
  57. #endif
  58. /****************************************************************************/
  59. /****************************************************************************/
  60. #include "mpmisc.h"
  61. #include "mpthd.h"
  62. #include "mpbox.h"
  63. #define    NDEBUG    1
  64. #include "mpbug.h"
  65. /****************************************************************************/
  66. /****************************************************************************/
  67. /* DATA INTERFACE:                                */
  68. typedef    struct _MPTSK    MPTSK,    PTR MPTSKID;    /* A TASK */
  69. typedef    MPRNG        MPMSG,    PTR MPMSGID;    /* A MESSAGE */
  70. typedef    MPBOX        MPSCD,  PTR MPSCDID;    /* A TASK SCHEDULE */
  71. /****************************************************************************/
  72. /* SUGGESTED TASK PRIORITY SCHEDULE                        */
  73. extern    MPSCD    mpscd_emergencytasks[1];
  74. extern    MPSCD    mpscd_timecriticaltasks[1];
  75. extern    MPSCD    mpscd_interactivetasks[1];
  76. extern    MPSCD    mpscd_backgroundtasks[1];
  77. extern    MPSCD    mpscd_batchtasks[1];
  78. extern    MPSCD    mpscd_idletasks[1];        /* REQUIRED */
  79. /****************************************************************************/
  80. /* CODE INTERFACE:                                */
  81. /****************************************************************************/
  82. /****************************************************************************/
  83. /****************************************************************************/
  84. void        mptsk_setup    ARGS((void));
  85. MPTSKID        mptsk_init    ARGS((    VOIDPTR buf, MPTHDID mpthd,
  86.                     MPBOXID sched));
  87. VOIDPTR        mptsk_dinit    ARGS((    MPBOXID sched));
  88. MPMSGID        mptsk_xfer    ARGS((MPBOXID mpbox, MPMSGID mpmsg,
  89.                      BOOL block, MPSCDID mpscd));
  90. #define    mpscd_init    mpbox_init
  91. #define    mpscd_dinit    mpbox_dinit
  92. /****************************************************************************/
  93. /****************************************************************************/
  94. #define    mpscd_toptasks()    ((MPSCDID)mprng_next(mpscd_idletasks))
  95. /****************************************************************************/
  96. #define    mptsk_me()            (_mptsk_me)
  97. #define    mptsk_mpscd(mptsk)        ((mptsk)->mpscd)
  98. #define    mptsk_mympscd()            mptsk_mpscd(mptsk_me())
  99. #define    mptsk_mpbox(mptsk)        str2fld(mptsk,mpbox)
  100. #define    mptsk_mympbox()            (mptsk_mpbox(mptsk_me()))
  101. #define    mptsk_owns(mptsk)        str2fld(mptsk,owns)
  102. #define    mptsk_myowns()            mptsk_owns(mptsk_me())
  103. #define    mptsk_waitingfor(mptsk)        ((mptsk)->waitingfor)
  104. #define    mptsk_mywaitingfor()        mptsk_waitingfor(mptsk_me())
  105. #define    mptsk_mpthd(mptsk)        ((mptsk)->mpthd)
  106. #define    mptsk_mympthd()            mptsk_mpthd(mptsk_me())
  107. /****************************************************************************/
  108. /*    MACROS FOR TYPICAL USES OF THE mptsk_xfer() FUNCTION            */
  109. /****************************************************************************/
  110. #define    mptsk_send(mpbox,mpmsg)    /* SEND mpmsg TO mpbox */        \
  111.         mptsk_xfer(mpbox,mpmsg,BOOL_TRUE,mpscd_toptasks())
  112.  
  113. #define    mptsk_csend(mpbox,mpmsg)/* SEND mpmsg TO mpbox IFF HAS A RECVR */ \
  114.         mptsk_xfer(mpbox,mpmsg,BOOL_FALSE,mpscd_toptasks())
  115.  
  116. #define    mptsk_recv(mpbox)    /* RECV A MPMSG FROM mpbox */        \
  117.         mptsk_xfer(mpbox,(MPMSGID)0,BOOL_TRUE,mpscd_toptasks())
  118.  
  119. #define    mptsk_crecv(mpbox)      /* RECV A MPMSG FROM mpbox IFF HAS A MSG */ \
  120.         mptsk_xfer(mpbox,(MPMSGID)0,BOOL_FALSE,mpscd_toptasks())
  121.  
  122. #define    mptsk_yield()        /* TEMPORARILY YIELD CTRL TO OTHER TASKS */ \
  123.             mptsk_recv(mptsk_mympscd())
  124.  
  125. #define    mptsk_yieldto(sched)    /* TEMPORARILY YIELD CTRL TO sched TSK LST */\
  126.             mptsk_xfer(mptsk_mysched(),(MPMSGID)0,BOOL_TRUE,sched)
  127. #define    mptsk_broadcast(mpbox,mpmsg)    until(mptsk_csend(mpbox,mpmsg)) {}
  128. /****************************************************************************/
  129. /****************************************************************************/
  130. /****************************************************************************/
  131. /* STRUCTURE, EXTERNAL-VARIBLE, AND MACRO DEFINITION:                */
  132. /****************************************************************************/
  133. /****************************************************************************/
  134. struct _MPTSK {
  135.     MPMSG    _mpmsg;        /* MANIPULATE A TASK AS A MESSAGE */
  136.     MPTHDID    mpthd;        /* STORAGE FOR THE TASK'S STATE */
  137.     MPSCDID    mpscd;        /* THE TASK'S DEFAULT SCHEDULE BOX */
  138.     MPMSGID    mpmsg;        /* TEMPORARY MESSAGE-PASSING STORAGE*/
  139.     MPBOX    mpbox;        /* THE TASK'S PERSONAL MAIL BOX (ACCESSORY) */
  140.     MPRNG    owns;        /* RESOURCE SOURCES THAT THE TASK OWNS */
  141.     MPBOXID    waitingfor;    /* THE MAILBOX ON WHICH THE TASK IS WAITING */
  142. };
  143. /****************************************************************************/
  144. /* extern    MPDEFID    _mptsk_def; */
  145. extern    MPTSKID    _mptsk_me;
  146. /****************************************************************************/
  147. extern    MPDEFID    mpdef_tasksize;
  148. /*extern    MPDEFID    mpdef_mptsk;*/
  149. #define    mpdef_mptsk    (0)
  150. /****************************************************************************/
  151. #endif    /* MPTSK_H */
  152.