samer@0: ;;; task related utilities samer@0: (import "samer.tools.*") samer@0: samer@0: samer@0: (define task (macro body `(SilkTask. (lambda () ,@body)))) samer@0: samer@0: ;;; convert a CompoundTask to a Scheme list samer@0: (define (tasks->list tasks) samer@0: (define L ()) samer@0: (define (list-it it) samer@0: (if (.more it) (begin samer@0: (set! L (append L (list (.next it)))) samer@0: (list-it it)))) samer@0: (list-it (.iterator tasks)) samer@0: L samer@0: ) samer@0: samer@0: ;;; create and access main task list samer@0: samer@0: (define _thread null) samer@0: (define _tasklist_stack ()) samer@0: samer@0: (define (start) (exec _thread "start")) samer@0: (define (stop) (exec _thread "stop")) samer@0: (define (thread) _thread) samer@0: samer@0: ;;; creates a task list/thread if none exists, returns a task list samer@0: (define (tasks) samer@0: (if (null? _tasklist_stack) samer@0: (let ((t (CompoundTask.))) samer@0: (set! _thread (RThread. t)) samer@0: (push-tasklist t) samer@0: t samer@0: ) samer@0: (first _tasklist_stack) samer@0: ) samer@0: ) samer@0: samer@0: (define (push-tasklist t) samer@0: (set! _tasklist_stack (cons t _tasklist_stack))) samer@0: samer@0: (define (pop-tasklist) samer@0: (let ((t (first _tasklist_stack))) samer@0: (set! _tasklist_stack (rest _tasklist_stack)) samer@0: t)) samer@0: samer@0: (define with-tasks (macro (tasks . body) samer@0: `(begin samer@0: (push-tasklist ,tasks) samer@0: (tryCatch samer@0: (let ((a (begin . ,body))) (pop-tasklist) a) samer@0: (lambda (ex) (pop-tasklist) (throw ex)))))) samer@0: samer@0: ; add task to current task list samer@0: (define (addtask t) (.addTask (tasks) t) t) samer@0: (define (removetask t) (.removeTask (tasks) t) t) samer@0: (define-method (add (t Task)) (.addTask (tasks) t) t) samer@0: (define-method (addafter (a Task) (t Task)) (.addTaskAfter (tasks) t a) t) samer@0: (define-method (remove (t Task)) (.removeTask (tasks) t) t) samer@0: samer@0: ; add multiple tasks to current task list samer@0: (define (addtasks . t) samer@0: (for-each (lambda (t) (.addTask (tasks) t)) t) samer@0: (tasks) ) samer@0: samer@0: (define-method (pr-tasks) (print (tasks->list (tasks)))) samer@0: (define-method (view-tasks) (view-tasks (tasks))) samer@0: (define-method (view-tasks tasks) (view-list (tasks->list tasks) "Tasks")) samer@0: (define-method (task-ref (n Integer)) (list-ref (tasks->list (tasks)) n)) samer@0: (define-method (task-ref tasks (n Integer)) (list-ref (tasks->list tasks) n)) samer@0: samer@0: (define (switch task) (SwitchTask. task)) samer@0: samer@0: ;;; Create a subrate task and a UI for the subrate factor samer@0: ;;; !! need to dispose of VInteger when task is disposed. samer@0: (define (sub n task) samer@0: (define vn (VInteger. "subfactor" n)) samer@0: (define subt (SubrateTask. n task)) samer@0: (on-change vn (.setFactor subt (.value$ vn))) samer@0: (.value$ vn n) (.changed vn) samer@0: subt samer@0: ) samer@0: samer@0: (define (seq . tasks) samer@0: (define c (CompoundTask.)) samer@0: (for-each (lambda (t) (.addTask c t)) tasks) samer@0: c) samer@0: