[haiku-development] Re: Plan for NetServices Kit (v2)

  • From: Niels Sascha Reedijk <niels.reedijk@xxxxxxxxx>
  • To: Haiku Development <haiku-development@xxxxxxxxxxxxx>
  • Date: Wed, 1 Sep 2021 07:12:58 +0100

Hi,

On Mon, Aug 30, 2021 at 5:39 PM X512 <dmarc-noreply@xxxxxxxxxxxxx> wrote:

It would be nice to design fully asynchronous networking API with
non-blocking syscalls like in libuv.

https://github.com/libuv/libuv

I have not fully read through the docs for libuv here, but I get the
feeling that this is actually slightly lower level (middleware).

The BHttpSession handler is designed to work asynchronously from the
calling thread. That means that you call
BHttpSession::AddRequest(std::move(request)), the method returns almost
instantly and the actual running of the request is done on another thread.

Internally, the design is to use two threads. The control thread has the
job of actually connecting sockets, serializing input data (if applicable)
and moving requests to the data thread. The data thread executes the socket
writes and reads. Because the sockets are non-blocking, the thread will do
work if there will be non-blocking reads and writes to the sockets.

There are still choke-points though. For the control thread, the main choke
point is the DNS resolution and the socket connection, which are not
non-blocking (yet). This may be solvable. In the data thread, the choke
point may be the number of requests it can handle in a single thread (the
plan is to do some limiting to the max number of connections and the max
connections per server) and the risk that writing the data to certain
outputs will be too slow (let's say there is a BFile* output that writes to
a floppy disk).

I am not convinced yet that these problems should be solved right now.

Regards,

N>

Other related posts: