From 5db4077e9f5166033637d2af9532ec6144b85646 Mon Sep 17 00:00:00 2001 From: Maxime Devos Date: Thu, 30 Jun 2022 14:21:47 +0000 Subject: [PATCH 1/2] Fix behaviour of 'epoll-wake!' after 'run-fibers'. This avoids the "epoll instance is dead" error noticed in GNUnet-Scheme's test suite, as reported at . A test is added in the next commit. This patch has been applied upstream, but there hasn't been a new release yet at time of writing. * fibers/epoll.scm (epoll-wake!)[dead]: Instead of throwing an error, just return #t. --- fibers/epoll.scm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fibers/epoll.scm b/fibers/epoll.scm index d26db4d..eb63242 100644 --- a/fibers/epoll.scm +++ b/fibers/epoll.scm @@ -1,6 +1,7 @@ ;; epoll ;;;; Copyright (C) 2016 Andy Wingo +;;;; Copyright (C) 2022 Maxime Devos ;;;; ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -135,7 +136,12 @@ epoll wait (if appropriate)." ('waiting (primitive-epoll-wake (fileno (epoll-wake-write-pipe epoll)))) ('not-waiting #t) - ('dead (error "epoll instance is dead")))) + ;; This can happen if a fiber was waiting on a condition and + ;; run-fibers completes before the fiber completes and afterwards + ;; the condition is signalled. In that case, we don't have to + ;; resurrect the fiber or something, we can just do nothing. + ;; (Bug report: https://github.com/wingo/fibers/issues/61) + ('dead #t))) (define (epoll-default-folder fd events seed) (acons fd events seed)) From c01d3853eb56ea4adacc31f51f6e917f8c0abe1c Mon Sep 17 00:00:00 2001 From: Maxime Devos Date: Thu, 30 Jun 2022 14:18:36 +0000 Subject: [PATCH 2/2] Test for issue #61. * tests/conditions.scm: Add a test. --- tests/conditions.scm | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/conditions.scm b/tests/conditions.scm index 505c42a..179605a 100644 --- a/tests/conditions.scm +++ b/tests/conditions.scm @@ -1,6 +1,7 @@ ;; Fibers: cooperative, event-driven user-space threads. ;;;; Copyright (C) 2016 Free Software Foundation, Inc. +;;;; Copyright (C) 2022 Maxime Devos ;;;; ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -21,6 +22,7 @@ #:use-module (fibers) #:use-module (fibers conditions) #:use-module (fibers operations) + #:use-module (fibers scheduler) #:use-module (fibers timers)) (define failed? #f) @@ -78,4 +80,22 @@ (wait cv) #t)) +;; Make a condition, wait for it inside a fiber, let the fiber abruptly +;; terminate and signal the condition afterwards. This tests for the bug +;; noticed at . +(assert-equal #t + (let ((cv (make-condition))) + (run-fibers + (lambda () + (spawn-fiber (lambda () (wait cv))) + (yield-current-task)) ; let the other fiber wait forever + ;; This test relies on not draining -- this is the default, + ;; but let's make this explicit. + #:drain? #false ; + ;; For simplicity, disable concurrency and preemption. + ;; That way, we can use 'yield-current-task' instead of an + ;; arbitrary sleep time. + #:hz 0 #:parallelism 1) + (signal-condition! cv))) + (exit (if failed? 1 0)) ve variable. * gnu/packages/efi.scm (efi_analyzer): Ditto. * gnu/packages/guile.scm (guile-2.2/bug-fix, guile-json): Ditto. * gnu/packages/image.scm (libjpeg): Ditto. * gnu/packages/kde.scm (kdevplatform): Ditto * gnu/packages/linphone.scm (linphoneqt): Ditto. * gnu/packages/maths.scm (blis-sandybridge, blis-haswell, blis-knl): Ditto. * gnu/packages/mpi.scm (hwloc-2.0): Ditto. * gnu/packages/music.scm (python-abjad, zlfo): Ditto. * gnu/packages/perl.scm (perl-base, perl-parent): Ditto. * gnu/packages/tryton.scm (python-trytond): Ditto. * gnu/packages/video.scm (gnome-mpv): Ditto. * tests/graph.scm: Use guile-json-1. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Bruno Victal 2022-10-22Remove now unnecessary uses of (guix grafts)....These modules would use (guix grafts) just to access '%graft?' and related bindings, which are now in (guix store). * gnu/ci.scm, guix/gexp.scm, guix/lint.scm, guix/scripts.scm, guix/scripts/archive.scm, guix/scripts/build.scm, guix/scripts/challenge.scm, guix/scripts/deploy.scm, guix/scripts/environment.scm, guix/scripts/home.scm, guix/scripts/pack.scm, guix/scripts/package.scm, guix/scripts/pull.scm, guix/scripts/size.scm, guix/scripts/system.scm, guix/scripts/weather.scm, tests/builders.scm, tests/channels.scm, tests/cpan.scm, tests/derivations.scm, tests/gexp.scm, tests/graph.scm, tests/guix-daemon.sh, tests/monads.scm, tests/pack.scm, tests/packages.scm, tests/profiles.scm, tests/system.scm: Remove #:use-module (guix grafts). Ludovic Courtès 2022-07-01tests: Adjust 'guix graph' test to latest OCaml changes....* tests/graph.scm ("reverse bag DAG"): Adjust to latest OCaml changes by looking at dune/ocaml-camomile/ocaml-utop. Ludovic Courtès 2022-02-05tests: Assert that cyclic graphs can be produced....* tests/graph.scm ("package DAG, oops it was a cycle"): New test. Liliana Marie Prikler 2021-09-21graph: Add '--max-depth'....* guix/graph.scm (export-graph): Add #:max-depth and honor it, adding 'depths' argument to 'loop'. * guix/scripts/graph.scm (%options, show-help): Add '--max-depth'. (%default-options): Add 'max-depth'. (guix-graph): Pass #:max-depth to 'export-graph'. * tests/graph.scm ("package DAG, limited depth"): New test. * doc/guix.texi (Invoking guix graph): Document it. Ludovic Courtès