Patch title: Release 92 bulk changes
Abstract:
File: /language/schedule/schedule.pli
Key:
    Removed line
    Added line
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