> as there are more cases where GNUTLS_E_AGAIN doesn't directly map to EAGAIN 
> errno.

Studying the current GNUTLS source, it looks like the added case is for exactly 
short writes,
which errno_to_gerr() supports.  The other place is for short read, but since 
the pull
callback is wrapped into the "while (left > 0)" loop (gnutls_stream_read), it 
is a legitimate
case, which also maps correctly.  I still can't understand why the similar loop 
"while (left > 0)"
was dropped off gnutls_io_write_flush (formerly part of 
gnutls_io_write_buffered) between 2.x and 3.x.

Anyhow, I'm going to modify our push callback behavior to do a tight loop 
around the former
push callback.  Doing so I notice that reading and writing are no longer 
symmetrical:
the pull callback does not require the looping on short reads as it will be 
done by GNUTLS,
and the push callback requires the looping because GNUTLS now bails out on 
short writes.

So for the sake of performance, the push callback should not return prematurely 
in order to
save on a long chain of returns with the only purpose to be followed by just a 
repeat of
gnutls_record_send(), which thus, can be avoided altogether...

Anton Lavrentiev
Contractor NIH/NLM/NCBI


_______________________________________________
Gnutls-help mailing list
[email protected]
http://lists.gnupg.org/mailman/listinfo/gnutls-help

Reply via email to