annotate src/scheme/task.scm @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
rev   line source
samer@0 1 ;;; task related utilities
samer@0 2 (import "samer.tools.*")
samer@0 3
samer@0 4
samer@0 5 (define task (macro body `(SilkTask. (lambda () ,@body))))
samer@0 6
samer@0 7 ;;; convert a CompoundTask to a Scheme list
samer@0 8 (define (tasks->list tasks)
samer@0 9 (define L ())
samer@0 10 (define (list-it it)
samer@0 11 (if (.more it) (begin
samer@0 12 (set! L (append L (list (.next it))))
samer@0 13 (list-it it))))
samer@0 14 (list-it (.iterator tasks))
samer@0 15 L
samer@0 16 )
samer@0 17
samer@0 18 ;;; create and access main task list
samer@0 19
samer@0 20 (define _thread null)
samer@0 21 (define _tasklist_stack ())
samer@0 22
samer@0 23 (define (start) (exec _thread "start"))
samer@0 24 (define (stop) (exec _thread "stop"))
samer@0 25 (define (thread) _thread)
samer@0 26
samer@0 27 ;;; creates a task list/thread if none exists, returns a task list
samer@0 28 (define (tasks)
samer@0 29 (if (null? _tasklist_stack)
samer@0 30 (let ((t (CompoundTask.)))
samer@0 31 (set! _thread (RThread. t))
samer@0 32 (push-tasklist t)
samer@0 33 t
samer@0 34 )
samer@0 35 (first _tasklist_stack)
samer@0 36 )
samer@0 37 )
samer@0 38
samer@0 39 (define (push-tasklist t)
samer@0 40 (set! _tasklist_stack (cons t _tasklist_stack)))
samer@0 41
samer@0 42 (define (pop-tasklist)
samer@0 43 (let ((t (first _tasklist_stack)))
samer@0 44 (set! _tasklist_stack (rest _tasklist_stack))
samer@0 45 t))
samer@0 46
samer@0 47 (define with-tasks (macro (tasks . body)
samer@0 48 `(begin
samer@0 49 (push-tasklist ,tasks)
samer@0 50 (tryCatch
samer@0 51 (let ((a (begin . ,body))) (pop-tasklist) a)
samer@0 52 (lambda (ex) (pop-tasklist) (throw ex))))))
samer@0 53
samer@0 54 ; add task to current task list
samer@0 55 (define (addtask t) (.addTask (tasks) t) t)
samer@0 56 (define (removetask t) (.removeTask (tasks) t) t)
samer@0 57 (define-method (add (t Task)) (.addTask (tasks) t) t)
samer@0 58 (define-method (addafter (a Task) (t Task)) (.addTaskAfter (tasks) t a) t)
samer@0 59 (define-method (remove (t Task)) (.removeTask (tasks) t) t)
samer@0 60
samer@0 61 ; add multiple tasks to current task list
samer@0 62 (define (addtasks . t)
samer@0 63 (for-each (lambda (t) (.addTask (tasks) t)) t)
samer@0 64 (tasks) )
samer@0 65
samer@0 66 (define-method (pr-tasks) (print (tasks->list (tasks))))
samer@0 67 (define-method (view-tasks) (view-tasks (tasks)))
samer@0 68 (define-method (view-tasks tasks) (view-list (tasks->list tasks) "Tasks"))
samer@0 69 (define-method (task-ref (n Integer)) (list-ref (tasks->list (tasks)) n))
samer@0 70 (define-method (task-ref tasks (n Integer)) (list-ref (tasks->list tasks) n))
samer@0 71
samer@0 72 (define (switch task) (SwitchTask. task))
samer@0 73
samer@0 74 ;;; Create a subrate task and a UI for the subrate factor
samer@0 75 ;;; !! need to dispose of VInteger when task is disposed.
samer@0 76 (define (sub n task)
samer@0 77 (define vn (VInteger. "subfactor" n))
samer@0 78 (define subt (SubrateTask. n task))
samer@0 79 (on-change vn (.setFactor subt (.value$ vn)))
samer@0 80 (.value$ vn n) (.changed vn)
samer@0 81 subt
samer@0 82 )
samer@0 83
samer@0 84 (define (seq . tasks)
samer@0 85 (define c (CompoundTask.))
samer@0 86 (for-each (lambda (t) (.addTask c t)) tasks)
samer@0 87 c)
samer@0 88