diff options
| author | Andy Wingo <wingo@pobox.com> | 2017-02-11 11:32:44 +0100 |
|---|---|---|
| committer | Andy Wingo <wingo@pobox.com> | 2017-02-11 12:17:32 +0100 |
| commit | 1e2bd7c6d67947a277c92eed9ba26a4d75f06cb3 (patch) | |
| tree | 4d57f6681d90fd7068f2cda1d0aae106c43fcff8 /tests | |
| parent | Fix channel CAS logic (diff) | |
| download | guile-fibers-1e2bd7c6d67947a277c92eed9ba26a4d75f06cb3.tar.gz | |
Add condition variable implementation
* fibers/conditions.scm:
* tests/conditions.scm: New files.
* Makefile.am: Add new files.
* fibers.texi (Conditions): New section.
* fibers/timers.scm (sleep-operation): Rename from wait-operation.
* tests/foreign.scm: Adapt to sleep-operation change.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/conditions.scm | 81 | ||||
| -rw-r--r-- | tests/foreign.scm | 2 |
2 files changed, 82 insertions, 1 deletions
diff --git a/tests/conditions.scm b/tests/conditions.scm new file mode 100644 index 0000000..505c42a --- /dev/null +++ b/tests/conditions.scm @@ -0,0 +1,81 @@ +;; Fibers: cooperative, event-driven user-space threads. + +;;;; Copyright (C) 2016 Free Software Foundation, Inc. +;;;; +;;;; This library is free software; you can redistribute it and/or +;;;; modify it under the terms of the GNU Lesser General Public +;;;; License as published by the Free Software Foundation; either +;;;; version 3 of the License, or (at your option) any later version. +;;;; +;;;; This library is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;;; Lesser General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU Lesser General Public +;;;; License along with this library; if not, write to the Free Software +;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +;;;; + +(define-module (tests conditions) + #:use-module (fibers) + #:use-module (fibers conditions) + #:use-module (fibers operations) + #:use-module (fibers timers)) + +(define failed? #f) + +(define-syntax-rule (assert-equal expected actual) + (let ((x expected)) + (format #t "assert ~s equal to ~s: " 'actual x) + (force-output) + (let ((y actual)) + (cond + ((equal? x y) (format #t "ok\n")) + (else + (format #t "no (got ~s)\n" y) + (set! failed? #t)))))) + +(define-syntax-rule (assert-run-fibers-terminates exp) + (begin + (format #t "assert run-fibers on ~s terminates: " 'exp) + (force-output) + (let ((start (get-internal-real-time))) + (call-with-values (lambda () (run-fibers (lambda () exp))) + (lambda vals + (format #t "ok (~a s)\n" (/ (- (get-internal-real-time) start) + 1.0 internal-time-units-per-second)) + (apply values vals)))))) + +(define-syntax-rule (assert-run-fibers-returns (expected ...) exp) + (begin + (call-with-values (lambda () (assert-run-fibers-terminates exp)) + (lambda run-fiber-return-vals + (assert-equal '(expected ...) run-fiber-return-vals))))) + +(define* (with-timeout op #:key (seconds 0.05) (wrap values)) + (choice-operation op + (wrap-operation (sleep-operation seconds) wrap))) + +(define (wait/timeout cv) + (perform-operation + (with-timeout + (wrap-operation (wait-operation cv) + (lambda () #t)) + #:wrap (lambda () #f)))) + +(define cv (make-condition)) +(assert-equal #t (condition? cv)) +(assert-run-fibers-returns (#f) (wait/timeout cv)) +(assert-run-fibers-returns (#f) (wait/timeout cv)) +(assert-equal #t (signal-condition! cv)) +(assert-equal #f (signal-condition! cv)) +(assert-run-fibers-returns (#t) (wait/timeout cv)) +(assert-run-fibers-returns (#t) (wait/timeout cv)) +(assert-run-fibers-returns (#t) + (let ((cv (make-condition))) + (spawn-fiber (lambda () (signal-condition! cv))) + (wait cv) + #t)) + +(exit (if failed? 1 0)) diff --git a/tests/foreign.scm b/tests/foreign.scm index d3470bc..0d81cb5 100644 --- a/tests/foreign.scm +++ b/tests/foreign.scm @@ -64,7 +64,7 @@ (assert-equal #f #f) (assert-terminates #t) (assert-terminates (sleep 1)) -(assert-terminates (perform-operation (wait-operation 1))) +(assert-terminates (perform-operation (sleep-operation 1))) (assert-equal 42 (receive-from-fiber 42)) (assert-equal 42 (send-to-fiber 42)) |
