Mares Smart Dive Computer + Bluelink pro

Jef Driesen jef at libdivecomputer.org
Thu Sep 27 06:26:55 PDT 2018


On 2018-09-26 19:40, Linus Torvalds wrote:
> Jef, what are the semantics for
> 
>         ret = dc_iostream_read(iostream, buf, sizeof(buf), NULL);
> 
> meant to be when there is only a partial read? Right now it returns
> DC_STATUS_SUCCESS and garbage in the end of "buf". Which really does
> seem wrong. The caller has no way to know that it got a just a partial
> reply..

The semantics depends on the transport type, and not whether the actual 
parameter is NULL or not:

For a stream based transport (e.g. serial, irda and rfcomm), the 
implementation should *always* try to read the requested size. Thus if 
the operation is successful (DC_STATUS_SUCCESS), the value of the actual 
parameter is guaranteed to be equal to the requested size, and hence you 
don't really need it. But if the operation fails for some reason, for 
example due to a timeout or some other I/O error, then an error should 
be returned. However, a failure does not necessary mean nothing got 
transferred at all. Therefore, the actual value should contain the 
number of bytes that were transferred successfully. This allows the 
caller to resume the operation after a partially failed transfer. (Note 
that most dive computer backends treat all errors as fatal errors, and 
in that case passing NULL is fine.)

The main reason why the iostream code always passes a non NULL pointer 
to the underlying implementation is because it needs the size for the 
logging.

For a packet based transport (e.g. ble and usbhid), the implementation 
should return a packet and indicate the size of that packet in the 
actual parameter. Thus the actual parameter is mandatory, and passing in 
a NULL pointer is indeed a very bad idea here.

Jef


More information about the subsurface mailing list