|
|
module "/pliant/install/ring3.pli"
gvar Sem sem gvar (Index DateTime DelayedAction) actions gvar DateTime sleep_until := undefined gvar Sem exe_sem
function execute1 a f arg Address a ; arg Function f indirect
function run_batch_actions p arg Address p sem request while { var Pointer:DelayedAction a :> actions first ; exists:a and pliant_execution_phase<=execution_phase_run } var DateTime now := datetime var DateTime dt := actions key a var CBool doit := dt:seconds-now:seconds<5 if doit var DelayedAction action := a actions remove a else dt seconds := now:seconds+5 sleep_until := dt sem release sleep dt:seconds-now:seconds if doit exe_sem request execute1 action:parameter action:function exe_sem release sem request if sleep_until<>dt sem release return sleep_until := undefined sem release function record_batch_action dt da arg DateTime dt ; arg DelayedAction da sem request actions insert dt da if sleep_until=undefined or sleep_until>dt var DelayedAction a a function :> the_function run_batch_actions Address run_thread a sleep_until := datetime sem release
meta schedule e if e:size<>2 or not (e:0 cast DateTime) return var Link:List expressions :> new List var Link:List byaddress :> new List expressions append (addressof e:1) var Pointer:Module module :> e module var Address mark := module mark module define "pliant shared" addressof:byaddress module define "share" addressof:(the_meta 'pliant share arguments') var List functions ; var Link:Type type e freeze expressions byaddress functions type module rewind mark void ? e suckup e:0 e add (instruction (the_function record_batch_action DateTime DelayedAction) e:0:result e:1:result) e set_void_result
export schedule
|
|