summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-09-09 23:43:41 +0200
committerAndy Wingo <wingo@pobox.com>2016-09-09 23:44:45 +0200
commit21e91f8f1a5d78efd781cb27db1e591b274a8596 (patch)
tree15997f91454de883c2cd7b647f24dfa04c3bec33
parentUse Ian Price's priority search queues (diff)
downloadguile-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.scm3
-rw-r--r--tests/basic.scm22
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