return names[MIN(idx, G_N_ELEMENTS(names) - 1)];
}
+static void release_annotation(struct srd_proto_data_annotation *pda)
+{
+ if (!pda)
+ return;
+ if (pda->ann_text)
+ g_strfreev(pda->ann_text);
+ g_free(pda);
+}
+
static int convert_annotation(struct srd_decoder_inst *di, PyObject *obj,
struct srd_proto_data *pdata)
{
return SRD_ERR_PYTHON;
}
+static void release_binary(struct srd_proto_data_binary *pdb)
+{
+ if (!pdb)
+ return;
+ g_free((void *)pdb->data);
+ g_free(pdb);
+}
+
static int convert_binary(struct srd_decoder_inst *di, PyObject *obj,
struct srd_proto_data *pdata)
{
goto err;
}
- pdb = g_malloc(sizeof(struct srd_proto_data_binary));
if (PyBytes_AsStringAndSize(py_tmp, &buf, &size) == -1)
goto err;
PyGILState_Release(gstate);
+ pdb = g_malloc(sizeof(struct srd_proto_data_binary));
pdb->bin_class = bin_class;
pdb->size = size;
- if (!(pdb->data = g_try_malloc(pdb->size)))
+ if (!(pdb->data = g_try_malloc(pdb->size))) {
+ g_free(pdb);
return SRD_ERR_MALLOC;
+ }
memcpy((void *)pdb->data, (const void *)buf, pdb->size);
pdata->data = pdb;
return SRD_ERR_PYTHON;
}
+static void release_meta(GVariant *gvar)
+{
+ if (!gvar)
+ return;
+ g_variant_unref(gvar);
+}
+
static PyObject *Decoder_put(PyObject *self, PyObject *args)
{
GSList *l;
struct srd_pd_callback *cb;
PyGILState_STATE gstate;
+ py_data = NULL;
+
gstate = PyGILState_Ensure();
if (!(di = srd_inst_find_by_obj(NULL, self))) {
Py_BEGIN_ALLOW_THREADS
cb->cb(&pdata, cb->cb_data);
Py_END_ALLOW_THREADS
+ release_annotation(pdata.data);
}
break;
case SRD_OUTPUT_PYTHON:
Py_BEGIN_ALLOW_THREADS
cb->cb(&pdata, cb->cb_data);
Py_END_ALLOW_THREADS
+ release_binary(pdata.data);
}
break;
case SRD_OUTPUT_META:
Py_BEGIN_ALLOW_THREADS
cb->cb(&pdata, cb->cb_data);
Py_END_ALLOW_THREADS
+ release_meta(pdata.data);
}
break;
default:
}
}
- srd_dbg("Instance %s checking registration type %d for %s.",
- di->inst_id, output_type, proto_id);
pdo = NULL;
for (l = di->pd_output; l; l = l->next) {
cmp = l->data;
return SRD_TERM_EITHER_EDGE;
case 'n':
return SRD_TERM_NO_EDGE;
+ default:
+ return -1;
}
return -1;
PyObject *py_pinvalues;
PyGILState_STATE gstate;
- gstate = PyGILState_Ensure();
-
if (!di) {
srd_err("Invalid decoder instance.");
- PyGILState_Release(gstate);
return NULL;
}
+ gstate = PyGILState_Ensure();
+
py_pinvalues = PyTuple_New(di->dec_num_channels);
for (i = 0; i < di->dec_num_channels; i++) {
srd_err("Failed to get the value.");
goto err;
}
- term = g_malloc0(sizeof(struct srd_term));
+ term = g_malloc(sizeof(struct srd_term));
term->type = get_term_type(term_str);
term->channel = PyLong_AsLong(py_key);
g_free(term_str);
srd_err("Failed to get number of samples to skip.");
goto err;
}
- term = g_malloc0(sizeof(struct srd_term));
+ term = g_malloc(sizeof(struct srd_term));
term->type = SRD_TERM_SKIP;
term->num_samples_to_skip = num_samples_to_skip;
term->num_samples_already_skipped = 0;
GSList *term_list;
condition_list_free(di);
- term = g_malloc0(sizeof(*term));
+ term = g_malloc(sizeof(*term));
term->type = SRD_TERM_SKIP;
term->num_samples_to_skip = count;
term->num_samples_already_skipped = 0;
* while the termination request still gets signalled.
*/
found_match = FALSE;
- ret = process_samples_until_condition_match(di, &found_match);
+
+ /* Ignore return value for now, should never be negative. */
+ (void)process_samples_until_condition_match(di, &found_match);
Py_END_ALLOW_THREADS