From: Gerhard Sittig Date: Sat, 7 Jan 2017 12:08:12 +0000 (+0100) Subject: scpi: Rephrase buffer resize for free space during SCPI read, add comments X-Git-Tag: libsigrok-0.5.0~141 X-Git-Url: https://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=ad21865fa7bb8bc429615235e90e012541d2b606 scpi: Rephrase buffer resize for free space during SCPI read, add comments Routine sr_scpi_get_data() checks for free space in the receive buffer, and resizes the buffer when free space drops below a threshold. The previous logic assumed that the resize and the read logic would interact in some specific way to achieve the desired operation. Adjust the buffer resize such that more free space is pre-allocated, yet the payload size of the buffer is not affected. This eliminates the dependency of the optional resize logic from subsequent activity for reception of data that is non-optional. Add comments while we are here, outline the steps taken in the sr_scpi_get_data() routine. --- diff --git a/src/scpi/scpi.c b/src/scpi/scpi.c index f87bf9eb..8e7e4d74 100644 --- a/src/scpi/scpi.c +++ b/src/scpi/scpi.c @@ -422,26 +422,31 @@ SR_PRIV int sr_scpi_get_data(struct sr_scpi_dev_inst *scpi, unsigned int offset; int space; + /* Optionally send caller provided command. */ if (command) { if (sr_scpi_send(scpi, command) != SR_OK) return SR_ERR; } + /* Initiate SCPI read operation. */ if (sr_scpi_read_begin(scpi) != SR_OK) return SR_ERR; + /* Keep reading until completion or until timeout. */ laststart = g_get_monotonic_time(); response = *scpi_response; - offset = response->len; while (!sr_scpi_read_complete(scpi)) { + /* Resize the buffer when free space drops below a threshold. */ space = response->allocated_len - response->len; if (space < 128) { g_string_set_size(response, response->len + 1024); + g_string_set_size(response, offset); space = response->allocated_len - response->len; } + /* Read another chunk of the response. */ len = sr_scpi_read_data(scpi, &response->str[offset], space); if (len < 0) { sr_err("Incompletely read SCPI response."); @@ -451,6 +456,7 @@ SR_PRIV int sr_scpi_get_data(struct sr_scpi_dev_inst *scpi, } offset += len; g_string_set_size(response, offset); + /* Quit reading after a period of time without receive data. */ elapsed_ms = (g_get_monotonic_time() - laststart) / 1000; if (elapsed_ms >= scpi->read_timeout_ms) { sr_err("Timed out waiting for SCPI response.");