Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 Oct 2016 17:29:41 +0200
From:      Willem Jan Withagen <wjw@digiware.nl>
To:        Eric Badger <badger@FreeBSD.org>, freebsd-hackers@freebsd.org
Subject:   Re: Kqueue and threading
Message-ID:  <c0e8b588-bb6a-010e-99cf-02fb3a8253f4@digiware.nl>
In-Reply-To: <4209b8d4-6674-a51d-dceb-81c3ecd179c2@FreeBSD.org>
References:  <111e0c35-7a4b-b6c7-ef1d-1a0d85112e61@digiware.nl> <4209b8d4-6674-a51d-dceb-81c3ecd179c2@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 3-10-2016 19:48, Eric Badger wrote:
> 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).

Yup, I know what the man page writes. :) But now the trick question
is: how does the C++ worker/thread library function....

Some of the code actually does: std:move on a lambda-function, which
should instantiate a complete fresh environment. And that would
certainly qualify for expected closure of the kq descriptors.
OTOH it keeps regular file descriptors available in the thread.

I guess I'll have to start testing with a few simple C++ programs to
get things clear.

--WjW





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?c0e8b588-bb6a-010e-99cf-02fb3a8253f4>