]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/lecroy-xstream/protocol.c
lecroy-xstream: Fix a potential memory leak.
[libsigrok.git] / src / hardware / lecroy-xstream / protocol.c
index 5fa1b44a63d3e64acdf18ef447ec8eeb68b1a08f..8a2129a71bb28ecd3b5291cba8f1a3e8bcdd8897 100644 (file)
@@ -92,11 +92,11 @@ static const char *trigger_sources[] = {
 
 static const uint64_t timebases[][2] = {
        /* picoseconds */
-       { 20, 1000000000000 },
-       { 50, 1000000000000 },
-       { 100, 1000000000000 },
-       { 200, 1000000000000 },
-       { 500, 1000000000000 },
+       { 20, UINT64_C(1000000000000) },
+       { 50, UINT64_C(1000000000000) },
+       { 100, UINT64_C(1000000000000) },
+       { 200, UINT64_C(1000000000000) },
+       { 500, UINT64_C(1000000000000) },
        /* nanoseconds */
        { 1, 1000000000 },
        { 2, 1000000000 },
@@ -665,6 +665,8 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data)
                return SR_ERR;
 
        if (analog.num_samples == 0) {
+               g_free(analog.data);
+
                /* No data available, we have to acquire data first. */
                g_snprintf(command, sizeof(command), "ARM;WAIT;*OPC;C%d:WAVEFORM?", ch->index + 1);
                sr_scpi_send(sdi->conn, command);
@@ -674,8 +676,10 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data)
        } else {
                /* Update sample rate if needed. */
                if (state->sample_rate == 0)
-                       if (lecroy_xstream_update_sample_rate(sdi, analog.num_samples) != SR_OK)
+                       if (lecroy_xstream_update_sample_rate(sdi, analog.num_samples) != SR_OK) {
+                               g_free(analog.data);
                                return SR_ERR;
+                       }
        }
 
        /*
@@ -717,10 +721,16 @@ SR_PRIV int lecroy_xstream_receive_data(int fd, int revents, void *cb_data)
         * number of frames, or continue reception by starting over at
         * the first enabled channel.
         */
-       if (++devc->num_frames == devc->frame_limit) {
+       devc->num_frames++;
+       if (devc->frame_limit && (devc->num_frames == devc->frame_limit)) {
                sr_dev_acquisition_stop(sdi);
        } else {
                devc->current_channel = devc->enabled_channels;
+
+               /* Wait for trigger, then begin fetching data. */
+               g_snprintf(command, sizeof(command), "ARM;WAIT;*OPC");
+               sr_scpi_send(sdi->conn, command);
+
                lecroy_xstream_request_data(sdi);
        }