X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=instance.c;h=1753912147a5fc6d2942a1015b11cee3c1856e86;hb=c22cbd433a6637466d5e142e900a117048024728;hp=1352975b81f7c9ea84347db80f17d8a928c6abcd;hpb=4564e8e53af85e696a58e43677bae87470c52771;p=libsigrokdecode.git diff --git a/instance.c b/instance.c index 1352975..1753912 100644 --- a/instance.c +++ b/instance.c @@ -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);