KQueue and Fibers

rashir rashir at rashir.com
Sat Apr 10 09:52:28 UTC 2021


On Friday, 9 April 2021 at 18:37:43 UTC, Jacob Carlborg wrote:
> On 2021-04-09 11:00, rashir wrote:
>> Goodmorning everyone,
>> I'm trying to understand both Kqueue and Fiber's operation on 
>> Mac. Why don't I get the correct data as long as I read from 
>> the socket?
>> It seems to be reading too early, but Kquue tells me that the 
>> socket is readable.
>> 
>> ```D
>>         const bytesRead = recv(fd, b.ptr, readableAmount < 
>> b.length ? readableAmount : b.length, 0);
>>         writeln("read bytesRead: ", bytesRead, 
>> "readableAmount:",
>>                 readableAmount, " errno:", errno);
>>         assert(bytesRead != EAGAIN && bytesRead != 
>> EWOULDBLOCK);
>> ```
>
> `recv` returns the number of bytes received or `-1` if an error 
> occurred. `EAGAIN` and `EWOULDBLOCK` are error codes. You 
> should not compare the value returned by `recv` with error 
> codes. The error code will be placed in `errno`.
>
>> ```D
>>         assert(eventList[0].filter & EVFILT_READ);
>> ```
>
> The `filter` field of an event is not a flag/bit field. It's 
> just a plain value, you should use `==` to check if it's a read 
> event.
>
> I'm not sure if fixing these things will solve your issue. But 
> at least some problems I noticed.

Thank you

Correcting the asserts I managed to understand the problem.

A EV_ONESHOT was missing in the first EVFILT_WRITE, so I was 
receiving a notification of Write, interpreting it as a 
notification of Read.

Cheers


More information about the Digitalmars-d-learn mailing list