} srd_Decoder;
/* This is only used for nicer srd_dbg() output. */
-static const char *output_type_name(unsigned int idx)
+SRD_PRIV const char *output_type_name(unsigned int idx)
{
static const char names[][16] = {
"OUTPUT_ANN",
return;
if (pda->ann_text)
g_strfreev(pda->ann_text);
- g_free(pda);
}
static int convert_annotation(struct srd_decoder_inst *di, PyObject *obj,
goto err;
}
- pda = g_malloc(sizeof(struct srd_proto_data_annotation));
+ pda = pdata->data;
pda->ann_class = ann_class;
pda->ann_text = ann_text;
- pdata->data = pda;
PyGILState_Release(gstate);
if (!pdb)
return;
g_free((void *)pdb->data);
- g_free(pdb);
}
static int convert_binary(struct srd_decoder_inst *di, PyObject *obj,
PyGILState_Release(gstate);
- pdb = g_malloc(sizeof(struct srd_proto_data_binary));
+ pdb = pdata->data;
pdb->bin_class = bin_class;
pdb->size = size;
- if (!(pdb->data = g_try_malloc(pdb->size))) {
- g_free(pdb);
+ if (!(pdb->data = g_try_malloc(pdb->size)))
return SRD_ERR_MALLOC;
- }
memcpy((void *)pdb->data, (const void *)buf, pdb->size);
- pdata->data = pdb;
return SRD_OK;
struct srd_session *sess;
GSList *l;
+ /* Performance shortcut: Handle the most common case first. */
+ sess = sessions->data;
+ di = sess->di_list->data;
+ if (di->py_inst == obj)
+ return di;
+
di = NULL;
for (l = sessions; di == NULL && l != NULL; l = l->next) {
sess = l->data;
struct srd_decoder_inst *di, *next_di;
struct srd_pd_output *pdo;
struct srd_proto_data pdata;
+ struct srd_proto_data_annotation pda;
+ struct srd_proto_data_binary pdb;
uint64_t start_sample, end_sample;
int output_id;
struct srd_pd_callback *cb;
}
pdo = l->data;
- srd_spew("Instance %s put %" PRIu64 "-%" PRIu64 " %s on oid %d.",
- di->inst_id, start_sample, end_sample,
- output_type_name(pdo->output_type), output_id);
+ /* Upon SRD_OUTPUT_PYTHON for stacked PDs, we have a nicer log message later. */
+ if (pdo->output_type != SRD_OUTPUT_PYTHON && di->next_di != NULL) {
+ srd_spew("Instance %s put %" PRIu64 "-%" PRIu64 " %s on "
+ "oid %d (%s).", di->inst_id, start_sample, end_sample,
+ output_type_name(pdo->output_type), output_id,
+ pdo->proto_id);
+ }
pdata.start_sample = start_sample;
pdata.end_sample = end_sample;
case SRD_OUTPUT_ANN:
/* Annotations are only fed to callbacks. */
if ((cb = srd_pd_output_callback_find(di->sess, pdo->output_type))) {
+ pdata.data = &pda;
/* Convert from PyDict to srd_proto_data_annotation. */
if (convert_annotation(di, py_data, &pdata) != SRD_OK) {
/* An error was already logged. */
case SRD_OUTPUT_PYTHON:
for (l = di->next_di; l; l = l->next) {
next_di = l->data;
- srd_spew("Sending %" PRIu64 "-%" PRIu64 " to instance %s",
- start_sample, end_sample, next_di->inst_id);
+ srd_spew("Instance %s put %" PRIu64 "-%" PRIu64 " %s "
+ "on oid %d (%s) to instance %s.", di->inst_id,
+ start_sample,
+ end_sample, output_type_name(pdo->output_type),
+ output_id, pdo->proto_id, next_di->inst_id);
if (!(py_res = PyObject_CallMethod(
next_di->py_inst, "decode", "KKO", start_sample,
end_sample, py_data))) {
break;
case SRD_OUTPUT_BINARY:
if ((cb = srd_pd_output_callback_find(di->sess, pdo->output_type))) {
+ pdata.data = &pdb;
/* Convert from PyDict to srd_proto_data_binary. */
if (convert_binary(di, py_data, &pdata) != SRD_OK) {
/* An error was already logged. */
return py_new_output_id;
}
- srd_dbg("Instance %s creating new output type %d for %s.",
- di->inst_id, output_type, proto_id);
-
pdo = g_malloc(sizeof(struct srd_pd_output));
/* pdo_id is just a simple index, nothing is deleted from this list anyway. */
PyGILState_Release(gstate);
+ srd_dbg("Instance %s creating new output type %s as oid %d (%s).",
+ di->inst_id, output_type_name(output_type), pdo->pdo_id,
+ proto_id);
+
return py_new_output_id;
err:
num_conditions = PyList_Size(py_conditionlist);
if (num_conditions == 0)
goto ret_9999; /* The PD invoked self.wait([]). */
- Py_IncRef(py_conditionlist);
+ Py_INCREF(py_conditionlist);
} else if (PyDict_Check(py_conds)) {
/* 'py_conds' is a dict. */
if (PyDict_Size(py_conds) == 0)
goto ret_9999; /* The PD invoked self.wait({}). */
/* Make a list and put the dict in there for convenience. */
py_conditionlist = PyList_New(1);
- Py_IncRef(py_conds);
+ Py_INCREF(py_conds);
PyList_SetItem(py_conditionlist, 0, py_conds);
num_conditions = 1;
} else {
unsigned int i;
gboolean found_match;
struct srd_decoder_inst *di;
- PyObject *py_pinvalues, *py_matched;
+ PyObject *py_pinvalues, *py_matched, *py_samplenum;
PyGILState_STATE gstate;
if (!self || !args)
/* If there's a match, set self.samplenum etc. and return. */
if (found_match) {
/* Set self.samplenum to the (absolute) sample number that matched. */
- PyObject_SetAttrString(di->py_inst, "samplenum",
- PyLong_FromLong(di->abs_cur_samplenum));
+ py_samplenum = PyLong_FromLong(di->abs_cur_samplenum);
+ PyObject_SetAttrString(di->py_inst, "samplenum", py_samplenum);
+ Py_DECREF(py_samplenum);
if (di->match_array && di->match_array->len > 0) {
py_matched = PyTuple_New(di->match_array->len);
for (i = 0; i < di->match_array->len; i++)
PyTuple_SetItem(py_matched, i, PyBool_FromLong(di->match_array->data[i]));
PyObject_SetAttrString(di->py_inst, "matched", py_matched);
+ Py_DECREF(py_matched);
match_array_free(di);
} else {
PyObject_SetAttrString(di->py_inst, "matched", Py_None);