home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* mptsk.c -- MAIL BOX MULTITASKING CLUSTER (IMPLEMENTATION) */
- /* Created: 12/12/87 Release: 0.7 Version: 06/27/88 */
- /****************************************************************************
- (c) Copyright 1987, 1988 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: See mptsk.h */
- /****************************************************************************/
- /****************************************************************************/
- #include "mptsk.h"
- #include "mpsem.h"
- /****************************************************************************/
- /****************************************************************************/
- /* SUGGESTED TASK PRIORITY SCHEDULE */
- MPSCD mpscd_emergencytasks[1];
- MPSCD mpscd_timecriticaltasks[1];
- MPSCD mpscd_interactivetasks[1];
- MPSCD mpscd_backgroundtasks[1];
- MPSCD mpscd_batchtasks[1];
- MPSCD mpscd_idletasks[1];
- /****************************************************************************/
- MPTSKID _mptsk_me;
- MPTSK _mptsk_main[1];
- /****************************************************************************/
- #define mptsk_mpmsg(mptsk) ((mptsk)->mpmsg)
- #define mptsk_mympmsg() (mptsk_mpmsg(mptsk_me()))
- #define mptsk_recvside (BOOL_FALSE)
- #define mptsk_sendside (BOOL_TRUE)
- /****************************************************************************/
- /****************************************************************************/
- /****************************************************************************/
- void mptsk_setup()
- {
- mpscd_init(mpscd_emergencytasks);
- mpscd_init(mpscd_timecriticaltasks);
- mprng_twistnn(mpscd_emergencytasks,mpscd_timecriticaltasks);
- mpscd_init(mpscd_interactivetasks);
- mprng_twistnn(mpscd_timecriticaltasks,mpscd_interactivetasks);
- mpscd_init(mpscd_backgroundtasks);
- mprng_twistnn(mpscd_interactivetasks,mpscd_backgroundtasks);
- mpscd_init(mpscd_batchtasks);
- mprng_twistnn(mpscd_backgroundtasks,mpscd_batchtasks);
- mpscd_init(mpscd_idletasks);
- mprng_twistnn(mpscd_batchtasks,mpscd_idletasks);
-
- mptsk_init(_mptsk_main,mpthd_me(),mpscd_toptasks());
- mptsk_me()= mpbox_xfer(mpscd_toptasks(),mptsk_sendside,(MPMSGID)0);
- mptsk_mywaitingfor()= 0;
- mpbug_valp(mptsk_me());
- }
- /****************************************************************************/
- /****************************************************************************/
- /****************************************************************************/
- MPTSKID mptsk_init(buf,mpthd,mpscd)
- VOIDPTR buf;
- MPTHDID mpthd;
- MPSCDID mpscd;
- {
- MPTSKID mptsk= (MPTSKID)buf;
-
- if (!mpthd || !mptsk) return(0);
- mptsk_mpthd(mptsk)= mpthd;
- mptsk_mpmsg(mptsk)= 0;
- mprng_init(str2fld(mptsk,_mpmsg));
- mpbox_init(mptsk_mpbox(mptsk));
- mptsk_mpscd(mptsk)= mpscd;
- mptsk_waitingfor(mptsk)=mpscd;
- mpbox_xfer(mpscd,mptsk_recvside,mptsk);
- mprng_init(mptsk_owns(mptsk));
- /* mpbox_printall(mpscd);
- */ mpbug_lev();mpbug_valp(mpthd);mpbug_valp(mptsk);
- return(mptsk);
- }
- /****************************************************************************/
- void PTR mptsk_dinit(mpscd)
- MPSCDID mpscd;
- {
- MPTSKID mptsk= mpbox_xfer(mpscd,mptsk_sendside,(MPRNGID)0);
- if (mptsk) {
- mprng_dinit(str2fld(mptsk,_mpmsg));
- mpbox_dinit(mptsk_mpbox(mptsk));
- mprng_dinit(mptsk_owns(mptsk));
- /* mpthd_dinit(mptsk_mpthd(mptsk));*/
- return(mptsk);
- } else return(0);
- }
- /****************************************************************************/
- /****************************************************************************/
- /* THE mptsk_xfer() FUNCTION - FOR TRANSFERING MSGS & CTRL BETWEEN TASKS */
- /****************************************************************************/
- MPMSGID mptsk_xfer(MPBOXID mpbox, MPMSGID mpmsg, BOOL block, MPSCDID mpscd)
- {
- /* mpbox_printall(mpscd);
- */mpsig_critsect( do { /* DISABLE INTERRUPTS */
- mptsk_mympthd()= mpthd_me();
- /*SEND*/if (mpmsg) { /* IF SENDING A MESSAGE */
- MPTSKID mptsk;
- mptsk= mpbox_xfer(mpbox, /* QUEUE MSG <XOR> GET TSK */
- mptsk_sendside,(MPMSGID)(block?mpmsg:(MPMSGID)0));
- if (mptsk) { /* A TASK WAS WAITING */
- /* TRANSFER MESSAGE */
- mptsk_mpmsg(mptsk)= mpmsg; mpmsg= 0;
- /* SCHEDULE BOTH TASKS */
- mpbox_xfer(mptsk_waitingfor(mptsk)=mptsk_mpscd(mptsk),
- mptsk_recvside,mptsk);
- mpbox_xfer(mptsk_mywaitingfor()= mptsk_mympscd(),
- mptsk_recvside,mptsk_me());
- } else {
- if (block) mpmsg=0; /* MESSAGE SENT */
- break; /* RETURN IMMEDIATELY */
- }
-
- /*RECV*/} else { /* IF RECEIVING A MESSAGE */
- mpmsg= mpbox_xfer( /* GET MSG <XOR> QUEUE TSK */
- mptsk_mywaitingfor()= mpbox,
- mptsk_recvside, (MPMSGID)(block?mptsk_me():0));
- if (mpmsg) break; /* MESSAGE RECVED: RET IMMEDIATELY */
- if (!block) break; /* DON'T WAIT FOR MSG: RET IMMDLY */
- }
- /*SCHD*/{ /* SCHEDULE A NEW TASK TO RUN */
- MPTSKID mptsk;
- MPSCDID curmpscd= mpscd; /* USE USER SCHED LIST */
- /* SEARCH FROM HIGHEST TO LOWEST PRIORITY 'TILL TASK FOUND */
- while (!(mptsk= mpbox_xfer(curmpscd,mptsk_sendside,
- (MPMSGID)0))){
- curmpscd= mprng_next(curmpscd);
- if (curmpscd==mpscd) /* IF END OF USER SCHED LIST*/
- curmpscd= mpscd_toptasks(); /* USE SYS LST */
- }
- mptsk_mympmsg()=mpmsg; /* SAVE MESSAGE BETWEEN SWITCHES */
- mpbug_lev(); mpbug_valp(mptsk);
- if (!mpthd_switch(mptsk_mpthd(mptsk_me()= mptsk))) {
- fprintf(stderr,
- "\nmptsk_xfer(%lX,%lX,%d,%lX): FATAL ERROR!",
- ptr_2int(mpbox),ptr_2int(mpmsg),(int)block,
- ptr_2int(mpscd));
- fprintf(stderr,
- "\nAttempt to switch to the the corrupted mpthd %lX of mptsk %lX. Exiting!\n",
- ptr_2int(mptsk_mpthd(mptsk)),mptsk);
- exit(-1);
- }
- mpmsg= mptsk_mympmsg();/* RETURN RESULT MESSAGE */
- }
- } while (0);
- mptsk_mywaitingfor()= 0;);
- return(mpmsg);
- }
- /****************************************************************************/
- /****************************************************************************/