home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1993-01-19 | 1.9 KB | 89 lines |
- IMPLEMENTATION MODULE PortSig;
-
- (*%T _OS2*)
- FROM IODLL IMPORT Input,Output;
- (*%E*)
- (*%F _OS2*)
- FROM SYSTEM IMPORT In,Out;
- (*%E*)
- FROM Storage IMPORT ALLOCATE,DEALLOCATE;
- IMPORT Str;
-
-
- (*%T _OS2*)
- CONST In ::= Input;
- Out ::= Output;
- (*%E*)
-
-
- TYPE SigPORT = SET OF PortFLAG;
-
- PortSIGNAL = POINTER TO PortSignalREC;
- PortSignalREC = RECORD
- adr : CARDINAL;
- flag : PortFLAG;
- END;
-
- PROCEDURE SignalInit( portadr : CARDINAL; owner : PortFLAG) : PortSIGNAL;
- VAR sig : PortSIGNAL;
- BEGIN
- ALLOCATE( sig, SIZE( sig^));
- sig^.adr := portadr;
- sig^.flag := owner;
- RETURN sig;
- END SignalInit;
-
- PROCEDURE SignalReceived( sig : PortSIGNAL) : BOOLEAN;
- BEGIN
- IF sig^.adr = 0 THEN
- RETURN TRUE;
- ELSE
- RETURN sig^.flag IN SigPORT( In( sig^.adr));
- END;
- END SignalReceived;
-
- PROCEDURE ClearOwnSignal( sig : PortSIGNAL);
- VAR val : SigPORT;
- BEGIN
- val := SigPORT( In( sig^.adr));
- EXCL( val, sig^.flag);
- Out( sig^.adr, SHORTCARD( val));
- END ClearOwnSignal;
-
- PROCEDURE WaitForSignalAndClear( sig : PortSIGNAL);
- BEGIN
- IF sig^.adr # 0 THEN
- REPEAT
- UNTIL SignalReceived( sig);
- ClearOwnSignal( sig);
- END;
- END WaitForSignalAndClear;
-
- PROCEDURE SendSignalTo( sig : PortSIGNAL; process : PortFLAG);
- VAR val : SigPORT;
- BEGIN
- val := SigPORT( In( sig^.adr));
- INCL( val, process);
- Out( sig^.adr, SHORTCARD( val));
- END SendSignalTo;
-
- PROCEDURE SignalIsSet( sig : PortSIGNAL; process : PortFLAG) : BOOLEAN;
- BEGIN
- IF sig^.adr = 0 THEN
- RETURN TRUE;
- ELSE
- RETURN process IN SigPORT( In( sig^.adr));
- END;
- END SignalIsSet;
-
- PROCEDURE SignalDone( VAR sig : PortSIGNAL);
- BEGIN
- IF sig # NIL THEN
- DEALLOCATE( sig, SIZE( sig^));
- sig := NIL;
- END;
- END SignalDone;
-
-
- END PortSig.