gint64 val_int;
int ret;
const char *val_str;
+ PyGILState_STATE gstate;
if (!di) {
srd_err("Invalid decoder instance.");
return SRD_ERR_ARG;
}
+ gstate = PyGILState_Ensure();
+
if (!PyObject_HasAttrString(di->decoder->py_dec, "options")) {
/* Decoder has no options. */
+ PyGILState_Release(gstate);
if (g_hash_table_size(options) == 0) {
/* No options provided. */
return SRD_OK;
srd_exception_catch("Stray exception in srd_inst_option_set()");
ret = SRD_ERR_PYTHON;
}
+ PyGILState_Release(gstate);
return ret;
}
}
pdch = sl->data;
new_channelmap[pdch->order] = new_channelnum;
- srd_dbg("Setting channel mapping: %s (index %d) = channel %d.",
+ srd_dbg("Setting channel mapping: %s (PD ch idx %d) = input data ch idx %d.",
pdch->id, pdch->order, new_channelnum);
}
srd_dbg("Final channel map:");
num_required_channels = g_slist_length(di->decoder->channels);
for (i = 0; i < di->dec_num_channels; i++) {
- srd_dbg(" - index %d = channel %d (%s)", i, new_channelmap[i],
+ GSList *l = g_slist_nth(di->decoder->channels, i);
+ if (!l)
+ l = g_slist_nth(di->decoder->opt_channels,
+ i - num_required_channels);
+ pdch = l->data;
+ srd_dbg(" - PD ch idx %d (%s) = input data ch idx %d (%s)", i,
+ pdch->id, new_channelmap[i],
(i < num_required_channels) ? "required" : "optional");
}
struct srd_decoder *dec;
struct srd_decoder_inst *di;
char *inst_id;
+ PyGILState_STATE gstate;
i = 1;
srd_dbg("Creating new %s instance.", decoder_id);
memset(di->old_pins_array->data, SRD_INITIAL_PIN_SAME_AS_SAMPLE0,
di->dec_num_channels);
+ gstate = PyGILState_Ensure();
+
/* Create a new instance of this decoder class. */
if (!(di->py_inst = PyObject_CallObject(dec->py_dec, NULL))) {
if (PyErr_Occurred())
srd_exception_catch("Failed to create %s instance",
decoder_id);
+ PyGILState_Release(gstate);
g_free(di->dec_channelmap);
g_free(di);
return NULL;
}
+ PyGILState_Release(gstate);
+
if (options && srd_inst_option_set(di, options) != SRD_OK) {
g_free(di->dec_channelmap);
g_free(di);
struct srd_decoder_inst *di_bottom,
struct srd_decoder_inst *di_top)
{
-
if (session_is_valid(sess) != SRD_OK) {
srd_err("Invalid session.");
return SRD_ERR_ARG;
GSList *l;
struct srd_decoder_inst *next_di;
int ret;
+ PyGILState_STATE gstate;
srd_dbg("Calling start() method on protocol decoder instance %s.",
di->inst_id);
+ gstate = PyGILState_Ensure();
+
/* Run self.start(). */
if (!(py_res = PyObject_CallMethod(di->py_inst, "start", NULL))) {
srd_exception_catch("Protocol decoder instance %s",
di->inst_id);
+ PyGILState_Release(gstate);
return SRD_ERR_PYTHON;
}
Py_DecRef(py_res);
/* Set self.matched to None. */
PyObject_SetAttrString(di->py_inst, "matched", Py_None);
+ PyGILState_Release(gstate);
+
/* Start all the PDs stacked on top of this one. */
for (l = di->next_di; l; l = l->next) {
next_di = l->data;
static gboolean find_match(struct srd_decoder_inst *di)
{
- static uint64_t s = 0;
uint64_t i, j, num_samples_to_process;
GSList *l, *cond;
const uint8_t *sample_pos;
if (di->abs_cur_samplenum == 0)
update_old_pins_array_initial_pins(di);
- for (i = 0, s = 0; i < num_samples_to_process; i++, s++, (di->abs_cur_samplenum)++) {
+ for (i = 0; i < num_samples_to_process; i++, (di->abs_cur_samplenum)++) {
sample_pos = di->inbuf + ((di->abs_cur_samplenum - di->abs_start_samplenum) * di->data_unitsize);
PyObject *py_res;
struct srd_decoder_inst *di;
int wanted_term;
+ PyGILState_STATE gstate;
if (!data)
return NULL;
srd_dbg("%s: Starting thread routine for decoder.", di->inst_id);
+ gstate = PyGILState_Ensure();
+
/*
* Call self.decode(). Only returns if the PD throws an exception.
* "Regular" termination of the decode() method is not expected.
*/
srd_dbg("%s: Thread done (!res, want_term).", di->inst_id);
PyErr_Clear();
+ PyGILState_Release(gstate);
return NULL;
}
if (!py_res) {
srd_dbg("%s: decode() terminated unrequested.", di->inst_id);
srd_exception_catch("Protocol decoder instance %s: ", di->inst_id);
srd_dbg("%s: Thread done (!res, !want_term).", di->inst_id);
+ PyGILState_Release(gstate);
return NULL;
}
Py_DecRef(py_res);
PyErr_Clear();
+ PyGILState_Release(gstate);
+
srd_dbg("%s: Thread done (with res).", di->inst_id);
return NULL;
{
GSList *l;
struct srd_pd_output *pdo;
+ PyGILState_STATE gstate;
srd_dbg("Freeing instance %s", di->inst_id);
srd_inst_join_decode_thread(di);
+
srd_inst_reset_state(di);
+ gstate = PyGILState_Ensure();
Py_DecRef(di->py_inst);
+ PyGILState_Release(gstate);
+
g_free(di->inst_id);
g_free(di->dec_channelmap);
g_free(di->channel_samples);