RFR 8203369 : Check for both EAGAIN and EWOULDBLOCK error codes
Ivan Gerasimov
ivan.gerasimov at oracle.com
Fri May 25 06:14:43 UTC 2018
Hi David!
>> If gcc, then we already have the same test for both constants in code
>> with no issues.
>> For example, java.base/unix/native/libnet/SocketInputStream.c, in
>> NET_ReadWithTimeout():
>> result = NET_NonBlockingRead(fd, bufP, len);
>> if (result == -1 && ((errno == EAGAIN) || (errno ==
>> EWOULDBLOCK))) {
>>
>>
>> If javac, then, I was thinking about it too, but I don't have a good
>> a universal solution to propose right now.
>
> javac should treat these symbolically rather than based on actual
> value, so I don't see any issue there. It's the C compiler that sees
> the raw value after preprocessing and so sees "duplicate" clauses.
>
If fact, as UnixContant.java is built from the template file
UnixConstants.java.template, which is processed with cpp preprocessor,
javac also sees the raw values.
So if someone decides to write something like
switch (exc.errno()) {
case UnixConstants.EAGAIN:
case UnixConstants.EWOULDBLOCK:
}
then there will be compile time trouble on some platforms and no issues
on the others.
Fortunately, UnixContant class is package private, so it is quite
unlikely to happen.
I was even thinking about proposing a language-level enhancement: If a
switch statement contains duplicate cases *and* these are combined, then
treat them as just one case.
Though the use case it too limited to justify the need :)
With kind regards,
Ivan
More information about the nio-dev
mailing list