]> sigrok.org Git - libsigrok.git/commitdiff
scpi: Rephrase buffer resize for free space during SCPI read, add comments
authorGerhard Sittig <redacted>
Sat, 7 Jan 2017 12:08:12 +0000 (13:08 +0100)
committerUwe Hermann <redacted>
Fri, 20 Jan 2017 17:53:43 +0000 (18:53 +0100)
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.

src/scpi/scpi.c

index f87bf9eba239325107a1903eb6d682bd6f282028..8e7e4d74af6702b7b59ba1cd87f163a7468bee3c 100644 (file)
@@ -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.");