(root)/
gcc-13.2.0/
gcc/
testsuite/
gm2/
projects/
pim/
run/
pass/
tower/
ProcArgs.mod
IMPLEMENTATION MODULE ProcArgs ;

FROM Storage IMPORT ALLOCATE, DEALLOCATE ;
FROM Executive IMPORT SEMAPHORE, InitSemaphore, Wait, Signal ;

TYPE
   ProcessArgs = POINTER TO RECORD
                               argPtr: ADDRESS ;
                               taken,
                               given : SEMAPHORE ;
                            END ;

PROCEDURE InitArgs () : ProcessArgs ;
VAR
   p: ProcessArgs ;
BEGIN
   NEW(p) ;
   WITH p^ DO
      taken := InitSemaphore(1, 'ProcArgs') ;
      given := InitSemaphore(0, 'ProcArgs') ;
      argPtr := NIL
   END ;
   RETURN( p )
END InitArgs ;


PROCEDURE SetArgs (p: ProcessArgs; a: ADDRESS) : ADDRESS ;
BEGIN
   WITH p^ DO
      Wait(taken) ;
      argPtr := a ;
      Signal(given)
   END ;
   RETURN( NIL )
END SetArgs ;


PROCEDURE CollectArgs (p: ProcessArgs) : ADDRESS ;
VAR
   a: ADDRESS ;
BEGIN
   WITH p^ DO
      Wait(given) ;
      a := argPtr ;
      Signal(taken)
   END ;
   RETURN( a )
END CollectArgs ;


PROCEDURE KillArgs (p: ProcessArgs) : ProcessArgs ;
BEGIN
   DISPOSE(p) ;
   RETURN( NIL )
END KillArgs ;


END ProcArgs.