; .EnTete "Le-Lisp (c) version 15.2" " " "Les se'quenceurs de base"
; .EnPied "schedule.ll" "O-%" " "
; .Annexe O "Les se'quenceurs de base"
; .nr % 1
;
; .Centre "*****************************************************************"
; .Centre " Ce fichier est en lecture seule hors du projet ALE de l'INRIA. "
; .Centre " Il est maintenu par ILOG SA, 2 Avenue Gallie'ni, 94250 Gentilly "
; .Centre " (c) Le-Lisp est une marque de'pose'e de l'INRIA "
; .Centre "*****************************************************************"
; .Centre "$Header: schedule.ll,v 4.1 88/01/13 12:23:35 kuczynsk Rel $"
(unless (>= (version) 15.2)
(error 'load 'erricf 'schedule))
(defvar #:sys-package:colon 'schedule)
; .Section "Initialisation des ITs horloge"
(defvar #:system:clock-tick 0.05)
(de clock ()
(when (debug) (princn #/.))
(suspend))
(dmd clockstart ()
`(clockalarm #:system:clock-tick))
(dmd clockstop ()
`(clockalarm 0.))
; .Section "Les se'quenceurs de base"
(defvar :ll)
(df parallel :ll
; e'value les expressions de :l en paralle`le.
; retourne () quand toutes les expressions ont e'te' e'value'es.
(without-interrupts
(let ((:l (append :ll ()))) ; e'vite les modifs physiques du corps.
(while :l
(schedule (lambda (:v)
(newr :l (list 'resume (kwote :v))))
(let ((:e (nextl :l)))
; ce LET doit e↑tre dans la porte'e du
; bloc d'activation schedule!
(clockstart)
(with-interrupts (eval :e))
(clockstop)))))))
(df parallelvalues :ll
; e'value les expressions de :l en paralle`le.
; retourne la liste des expressions e'value'es dans l'ordre de :l
(without-interrupts
(let ((:ltask ()) ; les ta↑ches en suspend
(:l :ll) ; les choses a faires
(:r (makelist (length :ll) ())) ; liste des valeurs de retour
(:i -1)) ; le compteur de slots
(while (or :l :ltask)
(schedule (lambda (:v) (newr :ltask :v))
(clockstart)
(ifn :l
(resume (nextl :ltask))
(let ((:e (nextl :l)))
; ce LET doit e↑tre dans la porte'e du
; bloc d'activation schedule!
(incr :i)
(rplaca (nthcdr :i :r)
(with-interrupts (eval :e)))))
(clockstop)))
:r)))
(df tryinparallel :ll
; e'value les expressions de :l en paralle`le.
; retourne la premie`re valeur calcule'e et arre↑te toutes
; les autres ta↑ches en suspend.
(without-interrupts
(let ((:ltask ())
(:l :ll))
(tag :return-value
(while (or :l :ltask)
(schedule (lambda (:v) (newr :ltask :v))
(clockstart)
(let ((:e (nextl :l)))
; ce LET doit e↑tre dans la porte'e du
; bloc d'activation schedule!
(if :e
(exit :return-value
(prog1
(with-interrupts
(eval :e))
(clockstop))))
(resume (nextl :ltask)))))))))
(dmd progn-no-suspend :body
; e'value les expressions de :l en se'quence et sans e↑tre suspendu!
`(schedule resume ,@:body))
(dmd letparallel (:lvar . :body)
; LET dans lequel les valeurs des variables sont e'value'es
; en paralle`ele : la liaison s'effectaunt e'galement en paralle`le.
`(letvq ,(mapcar 'car :lvar)
(parallelvalues ,@(mapcar 'cadr :lvar))
,@:body))