62 lines
1.6 KiB
Plaintext
62 lines
1.6 KiB
Plaintext
INSTALL @lib$+"TIMERLIB"
|
|
DIM tID%(6)
|
|
|
|
REM Two workers may be concurrent
|
|
DIM Semaphore%(2)
|
|
|
|
tID%(6) = FN_ontimer(11, PROCtimer6, 1)
|
|
tID%(5) = FN_ontimer(10, PROCtimer5, 1)
|
|
tID%(4) = FN_ontimer(11, PROCtimer4, 1)
|
|
tID%(3) = FN_ontimer(10, PROCtimer3, 1)
|
|
tID%(2) = FN_ontimer(11, PROCtimer2, 1)
|
|
tID%(1) = FN_ontimer(10, PROCtimer1, 1)
|
|
|
|
ON CLOSE PROCcleanup : QUIT
|
|
ON ERROR PRINT REPORT$ : PROCcleanup : END
|
|
|
|
sc% = 0
|
|
REPEAT
|
|
oldsc% = sc%
|
|
sc% = -SUM(Semaphore%())
|
|
IF sc%<>oldsc% PRINT "Semaphore count now ";sc%
|
|
WAIT 0
|
|
UNTIL FALSE
|
|
|
|
DEF PROCtimer1 : PROCtask(1) : ENDPROC
|
|
DEF PROCtimer2 : PROCtask(2) : ENDPROC
|
|
DEF PROCtimer3 : PROCtask(3) : ENDPROC
|
|
DEF PROCtimer4 : PROCtask(4) : ENDPROC
|
|
DEF PROCtimer5 : PROCtask(5) : ENDPROC
|
|
DEF PROCtimer6 : PROCtask(6) : ENDPROC
|
|
|
|
DEF PROCtask(n%)
|
|
LOCAL i%, temp%
|
|
PRIVATE delay%(), sem%()
|
|
DIM delay%(6), sem%(6)
|
|
IF delay%(n%) THEN
|
|
delay%(n%) -= 1
|
|
IF delay%(n%) = 0 THEN
|
|
SWAP Semaphore%(sem%(n%)),temp%
|
|
delay%(n%) = -1
|
|
PRINT "Task " ; n% " released semaphore"
|
|
ENDIF
|
|
ENDPROC
|
|
ENDIF
|
|
FOR i% = 1 TO DIM(Semaphore%(),1)
|
|
temp% = TRUE
|
|
SWAP Semaphore%(i%),temp%
|
|
IF NOT temp% EXIT FOR
|
|
NEXT
|
|
IF temp% THEN ENDPROC : REM Waiting to acquire semaphore
|
|
sem%(n%) = i%
|
|
delay%(n%) = 200
|
|
PRINT "Task "; n% " acquired semaphore"
|
|
ENDPROC
|
|
|
|
DEF PROCcleanup
|
|
LOCAL i%
|
|
FOR i% = 1 TO 6
|
|
PROC_killtimer(tID%(i%))
|
|
NEXT
|
|
ENDPROC
|