]> sigrok.org Git - libsigrokdecode.git/blobdiff - instance.c
instance.c: Add a debug message for thread creation.
[libsigrokdecode.git] / instance.c
index 1352975b81f7c9ea84347db80f17d8a928c6abcd..1753912147a5fc6d2942a1015b11cee3c1856e86 100644 (file)
@@ -622,8 +622,8 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di)
        /* Set self.samplenum to 0. */
        PyObject_SetAttrString(di->py_inst, "samplenum", PyLong_FromLong(0));
 
-       /* Set self.matches to None. */
-       PyObject_SetAttrString(di->py_inst, "matches", Py_None);
+       /* Set self.matched to None. */
+       PyObject_SetAttrString(di->py_inst, "matched", Py_None);
 
        /* Start all the PDs stacked on top of this one. */
        for (l = di->next_di; l; l = l->next) {
@@ -948,28 +948,28 @@ static gpointer di_thread(gpointer data)
  * sample numbers within the chunk specified by 'inbuf' and 'inbuflen'.
  *
  * Correct example (4096 samples total, 4 chunks @ 1024 samples each):
- *   srd_inst_decode(di, 0,    1023, inbuf, 1024, 1);
- *   srd_inst_decode(di, 1024, 2047, inbuf, 1024, 1);
- *   srd_inst_decode(di, 2048, 3071, inbuf, 1024, 1);
- *   srd_inst_decode(di, 3072, 4095, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 0,    1024, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 1024, 2048, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 2048, 3072, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 3072, 4096, inbuf, 1024, 1);
  *
  * The chunk size ('inbuflen') can be arbitrary and can differ between calls.
  *
  * Correct example (4096 samples total, 7 chunks @ various samples each):
- *   srd_inst_decode(di, 0,    1023, inbuf, 1024, 1);
- *   srd_inst_decode(di, 1024, 1123, inbuf,  100, 1);
- *   srd_inst_decode(di, 1124, 1423, inbuf,  300, 1);
- *   srd_inst_decode(di, 1424, 1642, inbuf,  219, 1);
- *   srd_inst_decode(di, 1643, 2047, inbuf,  405, 1);
- *   srd_inst_decode(di, 2048, 3071, inbuf, 1024, 1);
- *   srd_inst_decode(di, 3072, 4095, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 0,    1024, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 1024, 1124, inbuf,  100, 1);
+ *   srd_inst_decode(di, 1124, 1424, inbuf,  300, 1);
+ *   srd_inst_decode(di, 1424, 1643, inbuf,  219, 1);
+ *   srd_inst_decode(di, 1643, 2048, inbuf,  405, 1);
+ *   srd_inst_decode(di, 2048, 3072, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 3072, 4096, inbuf, 1024, 1);
  *
  * INCORRECT example (4096 samples total, 4 chunks @ 1024 samples each, but
  * the start- and end-samplenumbers are not absolute):
- *   srd_inst_decode(di, 0,    1023, inbuf, 1024, 1);
- *   srd_inst_decode(di, 0,    1023, inbuf, 1024, 1);
- *   srd_inst_decode(di, 0,    1023, inbuf, 1024, 1);
- *   srd_inst_decode(di, 0,    1023, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 0,    1024, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 0,    1024, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 0,    1024, inbuf, 1024, 1);
+ *   srd_inst_decode(di, 0,    1024, inbuf, 1024, 1);
  *
  * @param di The decoder instance to call. Must not be NULL.
  * @param abs_start_samplenum The absolute starting sample number for the
@@ -1010,6 +1010,14 @@ SRD_PRIV int srd_inst_decode(struct srd_decoder_inst *di,
                return SRD_ERR_ARG;
        }
 
+       if (abs_start_samplenum != di->abs_cur_samplenum ||
+           abs_end_samplenum < abs_start_samplenum) {
+               srd_dbg("Incorrect sample numbers: start=%" PRIu64 ", cur=%"
+                       PRIu64 ", end=%" PRIu64 ".", abs_start_samplenum,
+                       di->abs_cur_samplenum, abs_end_samplenum);
+               return SRD_ERR_ARG;
+       }
+
        di->data_unitsize = unitsize;
 
        srd_dbg("Decoding: abs start sample %" PRIu64 ", abs end sample %"
@@ -1042,12 +1050,16 @@ SRD_PRIV int srd_inst_decode(struct srd_decoder_inst *di,
                                        di->inst_id);
                        return SRD_ERR_PYTHON;
                }
+               di->abs_cur_samplenum = abs_end_samplenum;
                Py_DecRef(py_res);
        } else {
                /* If this is the first call, start the worker thread. */
-               if (!di->thread_handle)
-                       di->thread_handle = g_thread_new("di_thread",
+               if (!di->thread_handle) {
+                       srd_dbg("No worker thread for this decoder stack "
+                               "exists yet, creating one: %s.", di->inst_id);
+                       di->thread_handle = g_thread_new(di->inst_id,
                                                         di_thread, di);
+               }
 
                /* Push the new sample chunk to the worker thread. */
                g_mutex_lock(&di->data_mutex);