summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-09-08 16:58:36 +0200
committerAndy Wingo <wingo@pobox.com>2016-09-08 16:58:36 +0200
commit8fbe7f5c53fdd85c4a3a1acf4d70bd38baa860e1 (patch)
tree10b86082cba446ebed7f8c24b0982b2a20c67cb9
parentAdd tests (diff)
downloadguile-fibers-8fbe7f5c53fdd85c4a3a1acf4d70bd38baa860e1.tar.gz
Marginal sleeper list speedup.
* fibers/internal.scm (wake-sleepers, add-sleeper!): Speed up marginally; still quadratic.
-rw-r--r--fibers/internal.scm29
1 files changed, 15 insertions, 14 deletions
diff --git a/fibers/internal.scm b/fibers/internal.scm
index 6df419c..efb8c92 100644
--- a/fibers/internal.scm
+++ b/fibers/internal.scm
@@ -211,14 +211,12 @@
;; that it will will end up first on the runnable list. If one
;; of these fibers has already been resumed (perhaps because the
;; fd is readable or writable), this resume will have no effect.
- (let wake-sleepers ((sleepers (scheduler-sleepers sched)) (wakers '()))
- (if (and (pair? sleepers) (>= now (cdar sleepers)))
- (wake-sleepers (cdr sleepers) (cons (caar sleepers) wakers))
- (begin
- (set-scheduler-sleepers! sched sleepers)
- (for-each (lambda (fiber)
- (resume-fiber fiber (lambda () 0)))
- wakers))))))
+ (let wake-sleepers ((sleepers (scheduler-sleepers sched)))
+ (match sleepers
+ (((fiber . (? (lambda (expiry) (>= now expiry)))) . sleepers)
+ (wake-sleepers sleepers)
+ (resume-fiber fiber (lambda () 0)))
+ (_ (set-scheduler-sleepers! sched sleepers))))))
(define (handle-inbox sched)
(for-each (match-lambda
@@ -369,9 +367,12 @@ from a finalizer thread."
(let ((waketime (+ (get-internal-real-time)
(inexact->exact
(round (* seconds internal-time-units-per-second))))))
- (let lp ((head '()) (tail (scheduler-sleepers sched)))
- (if (and (pair? tail) (> waketime (cdar tail)))
- (lp (cons (car tail) head) (cdr tail))
- (set-scheduler-sleepers!
- sched
- (append-reverse! head (acons fiber waketime tail)))))))
+ (set-scheduler-sleepers!
+ sched
+ (let lp ((sleepers (scheduler-sleepers sched)))
+ (match sleepers
+ (((and sleeper (_ . (? (lambda (expiry) (> waketime expiry)))))
+ . tail)
+ (set-cdr! sleepers (lp tail))
+ sleepers)
+ (_ (acons fiber waketime sleepers)))))))