home *** CD-ROM | disk | FTP | other *** search
-
- /* C O P Y R I G H T N O T I C E : */
- /* Copyright 1986 Eric Jul and Norm Hutchinson. May not be used for any */
- /* purpose without written permission from the authors. */
-
- /* Header file for internal kernel data structures */
-
- /* Messages each consist of an Eden msg hdr and one or more socalled */
- /* items. Each item consists of a hdr field desribing the type and size */
- /* of the item followed by the data of the item. This organization */
- /* allows multiple items to be sent in a single message, e.g., an */
- /* request and one or more moves of parameters. */
- /* It also allows for easy piggybacking of other information. */
-
- #ifndef LMTYPES
- #include "Kernel/h/lmTypes.h"
- #endif LMTYPES
-
- #ifndef map_h
- #include "Kernel/h/map.h"
- #endif map_h
-
- #ifndef set_h
- #include "Kernel/h/set.h"
- #endif
-
- /************************************************************************/
- /* Stacks are initially allocated STDSTACKSIZE bytes and */
- /* are allocated up to a maximum of DEFAULTMAXPROCESSSTACKSIZE */
- /* If this maximum is exceeded, the process is terminated. */
- /************************************************************************/
-
- #define DEFAULTMAXSTACKSIZE 10000 /* Max. overall total */
- #define STACKSAFETY 300 /* See note below */
- #define STDSTACKSIZE 600 /* Usual size */
- #define MINSTACKSIZE 200 /* Min. allocation allowed */
-
- /* STACKSAFETY must NOT be decreased for two reasons:
- 1. the compiler assumes that there always is room enough to call
- another opertion without having to do a stack check.
- This means that there should be about 20 - 40 bytes extra slop.
- 2. UNIX bashes stuff onto the stack when signals occur.
- Experiments have shown that 200 bytes of safety is INSUFFICIENT
- An attempt has been made to avoid such stack bashing:
- An alternate stack is used for signals, cf. sigstack(2), sigvec(2)
- However, UNIX still bashes a few bytes above (== lower addresses)
- the current stack top so a margin of some bytes is necessary
- and one must consider ALL data beyound the stack top to
- be invalid. (This is a hard bug to find.)
- Therefore, in theory, about 20 bytes of safety for UNIX signals
- should suffices, but sure enough at some point a signal handler
- was defined to run on the regular stack and wierd behaviour ensued.
- To protect against any recurrence of such bugs, the stack safety
- is defined here to be in excess of 200 bytes.
- ANY REDUCTION in STACKSAFETY should be carefully considered and
- is NOT recommended.
- Thank you for your attention.
- */
-
-
-
-
-
- /* Tags for inter-node items */
-
- typedef enum {
- InvalidITag,
- InvokeITag,
- ReplyITag,
- RemoteLoadReqITag,
- CodeTransferITag,
- ParamTag,
- ConfirmITag,
- ShoutITag,
- SearchITag,
- ConfirmReplyITag,
- ShoutReplyITag,
- SearchReplyITag,
- PingITag,
- PongITag,
- PingTimingITag,
- PongTimingITag,
- MoveITag,
- MoveReplyITag,
- /* TT*ITag must be contiguous from TTFirst to TTLast*/
- TTFirstITag, /* This tag must be the first of the TT tags */
- TTGODITag,
- TTSSODITag,
- TTCodeODITag,
- TTAbConITag,
- TTGODataITag,
- TTLOITag,
- TTROITag,
- TTMoveGODITag,
- TTMoveSSODITag,
- TTMoveCITag,
- TTFetchGODITag,
- TTCodeAddrITag,
- TTInvokeITag,
- TTIncomingIITag,
- TTCondITag,
- TTMoveCondITag,
- TTLastITag, /* Must be the last TT tag */
-
- LastITag /* Must be the very last tag */
- } ITag;
-
- #define MAXTAG ((int) LastITag)
-
- typedef struct ItemHdr {
- ITag itemTag:8;
- unsigned int size:24;
- } ItemHdr, *ItemHdrPtr;
-
- typedef HandlerPtr ItemHandlerPtr;
- typedef HandlerPtr GenericHandlerPtr;
-
- typedef enum {
- RefSent,
- RefMoved
- } RefStatus;
-
- typedef unsigned int MoveMask;
-
- typedef struct InvokeReqItem {
- ItemHdr hdr;
- OID callerSSOID;
- EmLocation callerLoc;
- OID processOID;
- OID targetOID;
- EmLocation targetTryAtLoc;
- OID opOID;
- int opNumber;
- ODTag abConTag;
- OID abstractTypeOID;
- OID concreteTypeOID;
- unsigned int stackAvailable;
- short int argumentCount;
- short int resultCount;
- MoveMask resultMoveMask;
- MoveMask paramMoveMask;
- /* Now the results and params */
- } InvokeReqItem, *InvokeReqItemPtr;
-
- typedef enum {
- INVOKEDONE,
- INVOKEUNAVAILABLE,
- INVOKEFAILED
- } InvokeResult;
-
- typedef struct InvokeReplyItem {
- ItemHdr hdr;
- OID callerSSOID;
- InvokeResult result;
- /* Now the results and params */
- } InvokeReplyItem, *InvokeReplyItemPtr;
-
- typedef struct RemoteLoadReqItem {
- ItemHdr hdr;
- OID theOID;
- } RemoteLoadReqItem, *RemoteLoadReqItemPtr;
-
- typedef struct TTGenericEntry { /* Generic */
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- } TTGenericEntry, *TTGenericEntryPtr;
-
- typedef struct TTGODEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- OID myCodeOID;
- } TTGODEntry;
-
- typedef struct TTCEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- } TTCEntry;
-
- typedef struct TTSSODEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- OID processOID;
- } TTSSODEntry;
-
- typedef struct TTAbConEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ATOID;
- OID restrictOID;
- OID CodeOID;
- } TTAbConEntry;
-
- typedef struct TTLOEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- /* and the rest of the data */
- } TTLOEntry;
-
- typedef struct TTROEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- /* and the rest of the data */
- } TTROEntry;
-
- typedef struct TTMoveGODEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- OID myCodeOID;
- GODataPtr oldGODataPtr;
- } TTMoveGODEntry;
-
- typedef struct TTMoveSSODEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- OID processOID;
- SSPtr oldSSPtr;
- SSPtr oldReadyQLink;
- SSStatus status;
- int availStack;
- int thisSegmentSize;
- RegisterSave regs;
- Brand resultBrand;
- GenericPtr rPtr;
- GenericPtr invokePtr;
- /* and now the stack itself */
- } TTMoveSSODEntry;
-
-
- typedef struct TTMoveCEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- } TTMoveCEntry;
-
- typedef struct TTFetchGODEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- OID myCodeOID;
- } TTFetchGODEntry;
-
- typedef struct TTCodeAddrEntry {
- ItemHdr hdr;
- ODP oldODP; /* Actually the CodeAddr */
- ODTag dummyTag; /* For TT compatibility only */
- OID theCodeOID; /* OID of code OR NULL for kernel addr */
- Offset theOffset; /* Offset from start of Code OR
- kernel op number */
- } TTCodeAddrEntry;
-
- typedef struct TTReqEntry {
- ItemHdr hdr;
- ODP oldODP; /* Actually the addr of the Req */
- ODTag dummyTag; /* For TT compatibility only */
- /* Then the Req itself */ /* Variable sized */
- } TTReqEntry;
-
- typedef struct TTInvokeReqEntry {
- ItemHdr hdr;
- ODP oldODP; /* actually old Req Ptr */
- OID callerSSOID;
- EmLocation callerLoc;
- short int argumentCount;
- short int resultCount;
- OID processOID;
- OID targetOID;
- EmLocation targetTryAtLoc;
- } TTInvokeReqEntry;
-
- typedef struct TTIncomingIReqEntry {
- ItemHdr hdr;
- ODP oldODP; /* actually old Req Ptr */
- OID callerSSOID;
- EmLocation callerLoc;
- short int argumentCount;
- short int resultCount;
- OID processOID;
- OID targetOID;
- EmLocation targetTryAtLoc;
- } TTIncomingIReqEntry;
-
- typedef struct TTCondEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- } TTCondEntry;
-
- typedef struct TTMoveCondEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- MonitorLockPtr theLock;
- SSPtr theWaiting;
- } TTMoveCondEntry;
-
- #ifdef NOTYET
- typedef struct TTVarEntry {
- ItemHdr hdr;
- ODP oldODP;
- ODTag tag;
- OID ownOID;
- EmLocation ownLoc;
- OID ATOID;
- OID restrictOID;
- OID CodeOID;
- } TTVarEntry;
- #endif NOTYET
-
- typedef struct TTableEntry {
- union {
- TTGODEntry GO;
- TTSSODEntry SS;
- TTCEntry C;
- TTAbConEntry AB;
- TTLOEntry LO;
- TTROEntry RO;
- TTMoveGODEntry MGOD;
- TTMoveSSODEntry MSS;
- TTMoveCEntry MC;
- TTFetchGODEntry FGOD;
- TTCodeAddrEntry CA;
- TTReqEntry REQ;
- TTInvokeReqEntry IR;
- TTIncomingIReqEntry IIR;
- TTCondEntry CD;
- TTMoveCondEntry MCD;
- } TT;
- } TTableEntry, *TTableEntryPtr;
-
- typedef struct TTableItem {
- ItemHdr hdr;
- TTableEntry entry;
- } TTable, *TTablePtr;
-
- typedef struct CodeTransferItem {
- ItemHdr hdr;
- /* Code dot-o file */
- } CodeTransferItem, *CodeTransferItemPtr;
-
- typedef struct ParamItem {
- ItemHdr hdr;
- /* Parameter area */
- } ParamItem, *ParamItemPtr;
-
- typedef struct LocateInfo {
- OID theOID;
- EmLocation theLocation;
- } LocateInfo, *LocateInfoPtr;
-
- typedef struct LocateItem {
- ItemHdr hdr;
- LocateInfo obj[1];
- } LocateItem, *LocateItemPtr;
-
- typedef struct PingReqItem {
- ItemHdr hdr;
- int reqId;
- int pingLNN;
- } PingReqItem, *PingReqItemPtr;
-
- typedef struct PongReqItem {
- ItemHdr hdr;
- int reqId;
- int pongLNN;
- } PongReqItem, *PongReqItemPtr;
-
- typedef struct PingTimingReqItem {
- ItemHdr hdr;
- int reqId;
- int pingLNN;
- } PingTimingReqItem, *PingTimingReqItemPtr;
-
- typedef struct PongTimingReqItem {
- ItemHdr hdr;
- int reqId;
- int pongLNN;
- } PongTimingReqItem, *PongTimingReqItemPtr;
-
- typedef struct MoveItem {
- ItemHdr hdr;
- ODP oldODP;
- } MoveItem, *MoveItemPtr;
-
- typedef struct MoveReplyItem {
- ItemHdr hdr;
- } MoveReplyItem, *MoveReplyItemPtr;
-
- /************************************************************************/
-
- typedef struct EmMsg {
- MessageHeader msgHdr;
- ItemHdr itemHdr;
- char data[MAXMESSAGESIZE];
- } EmMsg, *EmMsgPtr;
-
- /************************************************************************/
- /* Request data structures. */
- /* These structures are used internally in the Emerald kernel for */
- /* storing information about long-lived outstanding actions which */
- /* that require the kernel to give up the CPU during the request. */
- /* Examples include remote invocation, moves, and object location. */
- /* Typically, the request data structures are tied to processes */
- /* and be found through the processes topmost stack segment. */
- /************************************************************************/
-
- typedef enum {
- InvalidRTag,
- InvokeRTag,
- IncomingIRTag,
- LocateRTag,
- MoveRTag,
- StackBreakRTag,
- CompilerLoadRTag,
- CodeLoadRTag,
- CheatingLoadRTag,
- InitiallyRTag,
- ConformRTag,
- ViewRTag,
- IncomingMoveRTag,
- OwnRTag,
- CondWaitRTag,
- MonWaitRTag,
- TimedWaitRTag,
-
- LastRTag /* Must be last RTag */
- } ReqTag;
-
-
- typedef struct ReqHdr {
- ReqTag rTag;
- struct GenericReq *next;
- GenericHandlerPtr callBack;
- int callBackData;
- Map reqBy;
- Map wantList;
- } ReqHdr, *ReqHdrPtr;
-
-
- typedef struct GenericReq {
- ReqHdr hdr;
- /* Request specific data */
- } GenericReq, *GenericReqPtr;
-
- typedef enum {
- IRLocatingTarget,
- IRWaitingForInvokeReply,
- IRLoadingCode,
- IRCodeLoadDone
- } IRStatus;
-
- typedef struct InvokeReq {
- ReqHdr hdr;
- IRStatus status;
- SSPtr requestor; /* the invoker */
- GODP targetGODP; /* the target */
- AbConPtr theAbConPtr; /* the abcon used */
- InvokeReqItem i; /* the invoke data sent */
- /* the following are only used during the processesing of the return */
- CodeAddr returnAddr;
- Map m;
- Map neededMap;
- Set newSet;
- AVariablePtr paramAddr; /* actually result address */
- } InvokeReq, *InvokeReqPtr;
-
- typedef enum {
- IHLoadingCode,
- IHCodeLoadDone,
- IHObjectNonFrozen
- } IHStatus;
-
- typedef struct IncomingIReq {
- ReqHdr hdr;
- IHStatus status;
- InvokeReqItem i;
- SSPtr theProcess;
- GODP targetGODP;
- AbConPtr theAbConPtr;
- MoveMask returnByMoveMask;
- int opNumber;
- Map m;
- Map neededMap;
- Set newSet;
- AVariablePtr paramAddr;
- Set visitorSet; /* contains OIDs of visiting objs */
- } IncomingIReq, *IncomingIReqPtr;
-
- #define MAXNODENUMBER 250
- #define MAXNODENUMBER1 251 /* +1 version */
-
- typedef enum {
- Waiting,
- WaitingForCodeLoad,
- Confirming,
- Shouting,
- Searching
- } LocateStatus;
-
- typedef struct LocateReq {
- ReqHdr hdr;
- LocateStatus status;
- OID theOID;
- EmLocation theLocation;
- unsigned char replyList[MAXNODENUMBER1];
- SSPtr waiting;
- int timerId;
- } LocateReq, *LocateReqPtr;
-
- typedef enum {
- IMLoadingCode,
- IMCodeLoadDone
- } IMStatus;
-
- typedef struct IncomingMoveReq {
- ReqHdr hdr;
- IMStatus status;
- ODP travellerODP;
- EmLocation targetLocation;
- Map m;
- Map neededMap;
- Set newSet;
- } IncomingMoveReq, *IncomingMoveReqPtr;
-
- typedef struct StackBreakReq {
- ReqHdr hdr;
- SSPtr oldSSPtr;
- short int argumentCount;
- short int resultCount;
- } StackBreakReq, *StackBreakReqPtr;
-
- typedef enum {
- Connected,
- Loading,
- Translating
- } CLoadStatus;
-
- typedef struct CompilerLoadReq {
- ReqHdr hdr;
- int sock;
- CLoadStatus status;
- OID createdCTOID;
- GODP createdObj;
- GODP theInStream, theOutStream;
- SSPtr waitingRead, waitingWrite;
- VectorPtr vectorRead, vectorWrite;
- int lengthRead, lengthWrite;
- Boolean hangAround;
- char *MLPInfo;
- } CompilerLoadReq, *CompilerLoadReqPtr;
-
- typedef struct sMLPMap {
- int sock;
- CLoadStatus status;
- OID createdCTOID;
- GODP createdObj;
- GODP theImport, theExport;
- } MLPMap, *MLPMapPtr;
-
- typedef enum {
- DoNotKnow,
- FoundSomewhere,
- LoadRequested,
- Transferred,
- Translated
- } LoadStatus;
-
- typedef struct CodeLoadReq {
- ReqHdr hdr;
- OID theCodeOID;
- LoadStatus status;
- } CodeLoadReq, *CodeLoadReqPtr;
-
- typedef struct CheatingLoadReq {
- ReqHdr hdr;
- OID theObjOID, theCodeOID;
- LoadStatus status;
- } CheatingLoadReq, *CheatingLoadReqPtr;
-
- typedef struct InitiallyReq {
- ReqHdr hdr;
- GODP calleeGODP;
- SSPtr theProcess;
- int opNumber;
- AbConPtr theAbConPtr;
- } InitiallyReq, *InitiallyReqPtr;
-
- typedef struct ConformReq {
- ReqHdr hdr;
- OID oid1, oid2;
- SSPtr waiting;
- } ConformReq, *ConformReqPtr;
-
- typedef struct ViewReq {
- ReqHdr hdr;
- OID restrictOID, newATOID;
- OID ctOID;
- DataAddr dataPtr;
- SSPtr waiting;
- } ViewReq, *ViewReqPtr;
-
- typedef struct OwnReq {
- ReqHdr hdr;
- OID codeOID, ATOID;
- int wanted;
- SSPtr waiting;
- } OwnReq, *OwnReqPtr;
-
- #ifdef NOTUSEDYET
- /*
- * CondWait requests are only used when the process waiting on a condition
- * is to be sent across the net. Waits are normally performed merely by
- * putting a reference to the process into the condition and setting the
- * process state to waiting -- no CondWaitReq is constructed since it is not
- * needed in the local case -- it is optimized away. On the other hand,
- * when the process is to move then the CondWaitReq is constructed so that
- * the necessary status information can be sent across the net and translated
- * appropriately.
- */
-
- typedef struct CondWaitReq {
- ReqHdr hdr;
- ODP condODP;
- } CondWaitReq, *CondWaitReqPtr;
-
- /*
- * MonWait -- the same comments as for CondWait apply here.
- */
-
- typedef struct MonReq {
- ReqHdr hdr;
- ODP monODP;
- } MonReq, *MonReqPtr;
-
- typedef struct TimedWaitReq {
- ReqHdr hdr;
- long remainSec;
- long remainMicroSec;
- } TimedWaitReq, *TimedWaitReqPtr;
- #endif NOTUSEDYET
-
- typedef union GeneralReq {
- GenericReq GReq;
- InvokeReq IReq;
- IncomingIReq IIReq;
- LocateReq LReq;
- IncomingMoveReq IMReq;
- StackBreakReq SBReq;
- CompilerLoadReq CLReq;
- } GeneralReq, *GeneralReqPtr;
-
- extern GenericReqPtr MakeNewRequest();
- extern void FreeRequest();
-
- extern void SetItemHandler();
-
- /* mNewRequest takes the tag stripped of the RTag suffix */
- #ifdef lint
- #define mNewRequest(fKind) 0
- #else
- #define mNewRequest(fKind) ((fKind/**/ReqPtr) \
- MakeNewRequest(fKind/**/RTag, sizeof(fKind/**/Req)))
- #endif lint
-
- extern void DoCallBack();
-