new object $scheduler: $utilities; var $root inited = 1; var $scheduler suspended_tasks = #[]; public method $scheduler.suspend() { arg @objs; objs += [user()]; suspended_tasks = dict_add(suspended_tasks, task_id(), objs); return (> suspend() <); }; public method $scheduler.resume() { arg task_id, @return_value; var objs; if ((objs = (| suspended_tasks[task_id] |))) { if (!(sender() in objs)) throw(~perm, sender() + " may not resume task " + task_id); suspended_tasks = dict_del(suspended_tasks, task_id); } return (> resume(task_id, @return_value) <); }; public method $scheduler.cancel() { arg task_id; var objs; if ((objs = (| suspended_tasks[task_id] |))) { if (!(sender() in objs)) throw(~perm, sender() + " may not cancel task " + task_id); suspended_tasks = dict_del(suspended_tasks, task_id); } return (> cancel(task_id) <); }; public method $scheduler.task_info() { arg @args; return (> task_info(@args) <); };