summaryrefslogtreecommitdiff
path: root/type_decoder.c
diff options
context:
space:
mode:
authorUwe Hermann <uwe@hermann-uwe.de>2018-05-19 02:37:14 +0200
committerUwe Hermann <uwe@hermann-uwe.de>2018-05-19 02:37:14 +0200
commitc94631f1e2758eda026404ead64a1efddb2cfc09 (patch)
treee46b511090d86b7675f67db2e3a72e2185ca8ec8 /type_decoder.c
parentee63c5dd93c4dfb1d2b19377eba96f96afac02a3 (diff)
downloadlibsigrokdecode-c94631f1e2758eda026404ead64a1efddb2cfc09.tar.gz
libsigrokdecode-c94631f1e2758eda026404ead64a1efddb2cfc09.zip
Decoder_put(): Avoid a g_malloc()/g_free() pair per binary out.
Diffstat (limited to 'type_decoder.c')
-rw-r--r--type_decoder.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/type_decoder.c b/type_decoder.c
index 19cce0c..6692c3d 100644
--- a/type_decoder.c
+++ b/type_decoder.c
@@ -128,7 +128,6 @@ 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,
@@ -192,15 +191,12 @@ 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;
@@ -324,6 +320,7 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args)
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;
@@ -405,6 +402,7 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args)
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. */