Hi,
I encountered this while looking into the daemonize action of shepherd.
On freebsd if a program calls fork after a run-fibers results in lots of
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
messages and fibers/guile utilizing 100% of the cpu.
A minimal example is
(use-modules (fibers)
(fibers conditions))
(run-fibers
(lambda ()
(if (zero? (primitive-fork))
;; wait forever
(wait (make-condition))
(primitive-exit 0)))
#:parallelism 1
#:hz 0)
% uname
FreeBSD
% guile3 example.scm
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
[....]
The manual page for kevent/kqueue says
> The kqueue() system call creates a new kernel event queue and returns a descriptor.
> The queue is not inherited by a child created with fork(2).
which might be the cause. However I am not sure if this a problem in libevent or how fibers uses libevent
FreeBSD 14.3
libevent 2.1.12 (from ports)
guile 3.0.10 (from ports, recompiled with additional ac_cv_func_posix_spawn_file_actions_addclosefrom_np=no)
fibers 4d37f56ef38f653841d151104262928b3a935396
Hi,
I encountered this while looking into the `daemonize` action of shepherd.
On freebsd if a program calls `fork` after a `run-fibers` results in lots of
```text
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
```
messages and fibers/guile utilizing 100% of the cpu.
A minimal example is
```scm
(use-modules (fibers)
(fibers conditions))
(run-fibers
(lambda ()
(if (zero? (primitive-fork))
;; wait forever
(wait (make-condition))
(primitive-exit 0)))
#:parallelism 1
#:hz 0)
```
```sh
% uname
FreeBSD
% guile3 example.scm
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
[warn] kevent: Bad file descriptor
[....]
```
The manual page for kevent/kqueue says
```
> The kqueue() system call creates a new kernel event queue and returns a descriptor.
> The queue is not inherited by a child created with fork(2).
```
which might be the cause. However I am not sure if this a problem in libevent or how fibers uses libevent
```
FreeBSD 14.3
libevent 2.1.12 (from ports)
guile 3.0.10 (from ports, recompiled with additional ac_cv_func_posix_spawn_file_actions_addclosefrom_np=no)
fibers 4d37f56ef38f653841d151104262928b3a935396
```