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
|