[PATCH 12/14] Cleanup: consistenty check return value of iostream functions

Jef Driesen jef at libdivecomputer.org
Wed Jan 3 07:34:15 PST 2018


On 29-12-17 01:35, Dirk Hohndel wrote:
> --- a/src/oceanic_vtpro.c
> +++ b/src/oceanic_vtpro.c
> @@ -269,9 +269,13 @@ oceanic_vtpro_calibrate (oceanic_vtpro_device_t 
> *device)
>   	// device needs approximately 6 seconds to respond.
>   	unsigned char answer[2] = {0};
>   	unsigned char command[2] = {0x18, 0x00};
> -	dc_iostream_set_timeout (device->iostream, 9000);
> -	dc_status_t rc = oceanic_vtpro_transfer (device, command, sizeof 
> (command), answer, sizeof (answer));
> -	dc_iostream_set_timeout (device->iostream, 3000);
> +	dc_status_t rc = dc_iostream_set_timeout (device->iostream, 9000);
> +	if (rc != DC_STATUS_SUCCESS)
> +		return rc;
> +	rc = oceanic_vtpro_transfer (device, command, sizeof (command), 
> answer, sizeof (answer));
> +	if (rc != DC_STATUS_SUCCESS)
> +		return rc;
> +	rc = dc_iostream_set_timeout (device->iostream, 3000);
>   	if (rc != DC_STATUS_SUCCESS)
>   		return rc;

This fix changes the behavior slightly, but that's no longer an issue 
now.

The original intention was that the timeout is always restored, even if 
an error occurred. In the past this was important because the function 
was exposed in the public api and the connection could be re-used after 
a failed call. Nowadays, this is no longer the case,  because it's only 
called internally, and at that point any error is fatal (e.g. no handle 
is returned to the caller, and thus re-using it is simply not possible).

Jef


More information about the devel mailing list