diff options
| author | Andy Wingo <wingo@pobox.com> | 2016-09-09 23:43:41 +0200 |
|---|---|---|
| committer | Andy Wingo <wingo@pobox.com> | 2016-09-09 23:44:45 +0200 |
| commit | 21e91f8f1a5d78efd781cb27db1e591b274a8596 (patch) | |
| tree | 15997f91454de883c2cd7b647f24dfa04c3bec33 | |
| parent | Use Ian Price's priority search queues (diff) | |
| download | guile-fibers-21e91f8f1a5d78efd781cb27db1e591b274a8596.tar.gz | |
Better fiber run order
* fibers/internal.scm (schedule-runnables-for-next-turn): Reverse
runnables queue so that fibers are run in the next turn in the order
that they were added in the previous turn.
* tests/basic.scm (run-order): Add run order and sleep wakeup order
tests.
| -rw-r--r-- | fibers/internal.scm | 3 | ||||
| -rw-r--r-- | tests/basic.scm | 22 |
2 files changed, 25 insertions, 0 deletions
diff --git a/fibers/internal.scm b/fibers/internal.scm index 4e41324..2fe7673 100644 --- a/fibers/internal.scm +++ b/fibers/internal.scm @@ -243,6 +243,9 @@ ;; their corresponding fibers. Also schedule any sleepers that have ;; timed out, and process the inbox that receives ;; requests-to-schedule from remote threads. + ;; + ;; FIXME: use a deque instead + (set-scheduler-runnables! sched (reverse (scheduler-runnables sched))) (unless (zero? (scheduler-active-fd-count sched)) (atomic-box-set! (scheduler-inbox-state sched) 'needs-wake) (epoll (scheduler-epfd sched) diff --git a/tests/basic.scm b/tests/basic.scm index 31d392e..44ff032 100644 --- a/tests/basic.scm +++ b/tests/basic.scm @@ -94,6 +94,28 @@ (assert-run-fibers-terminates (spawn-fiber-chain 500000)) (assert-run-fibers-terminates (spawn-fiber-chain 5000000)) +(let ((run-order 0)) + (define (test-run-order count) + (for-each (lambda (n) + (spawn-fiber + (lambda () + (unless (eqv? run-order n) + (error "bad run order" run-order n)) + (set! run-order (1+ n))))) + (iota count))) + (assert-run-fibers-terminates (test-run-order 10))) + +(let ((run-order 0)) + (define (test-wakeup-order count) + (for-each (lambda (n) + (spawn-fiber + (lambda () + (unless (eqv? run-order n) + (error "bad run order" run-order n)) + (set! run-order (1+ n))))) + (iota count))) + (assert-run-fibers-terminates (test-wakeup-order 10))) + ;; sleep wakeup order ;; fib using channels |
