return ret;
}
-/* Helper GComparefunc for g_slist_find_custom() in srd_inst_channel_set_all() */
+/* Helper GComparefunc for g_slist_find_custom() in srd_inst_channel_set_all(). */
static gint compare_channel_id(const struct srd_channel *pdch,
const char *channel_id)
{
return SRD_ERR_ARG;
}
- new_channelmap = g_malloc(sizeof(int) * di->dec_num_channels);
+ new_channelmap = g_malloc0(sizeof(int) * di->dec_num_channels);
/*
* For now, map all indexes to channel -1 (can be overridden later).
srd_dbg("Final channel map:");
num_required_channels = g_slist_length(di->decoder->channels);
for (i = 0; i < di->dec_num_channels; i++) {
- GSList *l = g_slist_nth(di->decoder->channels, i);
- if (!l)
- l = g_slist_nth(di->decoder->opt_channels,
+ GSList *ll = g_slist_nth(di->decoder->channels, i);
+ if (!ll)
+ ll = g_slist_nth(di->decoder->opt_channels,
i - num_required_channels);
- pdch = l->data;
+ pdch = ll->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");
pdch = g_slist_nth(di->decoder->channels, i)->data;
srd_err("Required channel '%s' (index %d) was not specified.",
pdch->id, i);
+ g_free(new_channelmap);
return SRD_ERR;
}
srd_dbg("%s: Resetting decoder state.", di->inst_id);
- /*
- * Reset internal state of the decoder.
- */
+ /* Reset internal state of the decoder. */
condition_list_free(di);
match_array_free(di);
di->abs_start_samplenum = 0;
di->inbuflen = inbuflen;
di->got_new_samples = TRUE;
di->handled_all_samples = FALSE;
- di->want_wait_terminate = FALSE;
/* Signal the thread that we have new data. */
g_cond_signal(&di->got_new_samples_cond);
g_cond_wait(&di->handled_all_samples_cond, &di->data_mutex);
g_mutex_unlock(&di->data_mutex);
+ if (di->want_wait_terminate)
+ return SRD_ERR_TERM_REQ;
+
return SRD_OK;
}
* calls like they would for newly constructed decoder stacks.
*
* @param di The decoder instance to call. Must not be NULL.
+ *
* @return SRD_OK upon success, a (negative) error code otherwise.
+ *
* @private
*/
SRD_PRIV int srd_inst_terminate_reset(struct srd_decoder_inst *di)
}
PyGILState_Release(gstate);
- /*
- * Pass the "restart" request to all stacked decoders.
- */
+ /* Pass the "restart" request to all stacked decoders. */
for (l = di->next_di; l; l = l->next) {
ret = srd_inst_terminate_reset(l->data);
if (ret != SRD_OK)
struct srd_pd_output *pdo;
PyGILState_STATE gstate;
- srd_dbg("Freeing instance %s", di->inst_id);
+ srd_dbg("Freeing instance %s.", di->inst_id);
srd_inst_join_decode_thread(di);