Kqueue and threading
Eric Badger
badger at FreeBSD.org
Mon Oct 3 17:50:18 UTC 2016
On 10/01/2016 13:02, Willem Jan Withagen wrote:
> Hi,
>
> Ceph uses a lot of threading, and for any part of it communication it
> uses epoll(), which FreeBSD does not use. For that there was already a
> EvenKqueue implementation.
>
> But I think I'm now running into:
> 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). However, if rfork(2) is called without the
> RFFDG flag, then the descriptor table is shared, which will allow
> sharing of the kqueue between two processes.
>
> Kqueue descriptors are created and events are added, but then the
> process starts other threads and expects the kqueue-id to be valid there.
>
> However adding more events returns an error, also waiting on the ID for
> events to happen returns an error (descriptor invalid)
>
> Threading is done with 2 different constructions:
> std::thread
> and creating Workers
>
> Would any of these qualify with the quoted warning? and invalidate the
> descriptor table?
>
> If not, how can I (easily) debug the reason why my descriptors go invalid?
>
Sharing a kqueue between threads of a process works. Are the workers
created using rfork without RFFDG as suggested in the manpage? I've
never had reason to do this, but a quick test seems to indicate that it
works as advertised. A normal fork closes the kqueue file descriptor. If
you suspect that's what's happening, you might run "procstat -f {worker
pid}" to see if file descriptors with a "k" (kqueue) in the "T" (type)
column appear (if not, they were presumably closed on the fork).
Eric
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 632 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20161003/528e7d50/attachment.sig>
More information about the freebsd-hackers
mailing list