(task_queue.c) Prevent resource leak
This commit is contained in:
parent
bedd67a8b8
commit
2e42778f1e
|
@ -215,42 +215,46 @@ static bool retro_task_regular_find(retro_task_finder_t func, void *user_data)
|
||||||
|
|
||||||
static void retro_task_regular_retrieve(task_retriever_data_t *data)
|
static void retro_task_regular_retrieve(task_retriever_data_t *data)
|
||||||
{
|
{
|
||||||
retro_task_t *task;
|
retro_task_t *task = NULL;
|
||||||
task_retriever_info_t *info;
|
|
||||||
task_retriever_info_t *tail = NULL;
|
task_retriever_info_t *tail = NULL;
|
||||||
|
|
||||||
/* Parse all running tasks and handle matching handlers */
|
/* Parse all running tasks and handle matching handlers */
|
||||||
for (task = tasks_running.front; task != NULL; task = task->next)
|
for (task = tasks_running.front; task != NULL; task = task->next)
|
||||||
if (task->handler == data->handler)
|
{
|
||||||
|
task_retriever_info_t *info = NULL;
|
||||||
|
if (task->handler != data->handler)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Create new link */
|
||||||
|
info = (task_retriever_info_t*)malloc(sizeof(task_retriever_info_t));
|
||||||
|
info->data = malloc(data->element_size);
|
||||||
|
info->next = NULL;
|
||||||
|
|
||||||
|
/* Call retriever function and fill info-specific data */
|
||||||
|
if (!data->func(task, info->data))
|
||||||
{
|
{
|
||||||
/* Create new link */
|
free(info->data);
|
||||||
info = (task_retriever_info_t*)malloc(sizeof(task_retriever_info_t));
|
free(info);
|
||||||
info->data = malloc(data->element_size);
|
continue;
|
||||||
info->next = NULL;
|
}
|
||||||
|
|
||||||
/* Call retriever function and fill info-specific data */
|
/* Add link to list */
|
||||||
if (!data->func(task, info->data))
|
if (data->list)
|
||||||
|
{
|
||||||
|
if (tail)
|
||||||
{
|
{
|
||||||
free(info->data);
|
tail->next = info;
|
||||||
free(info);
|
tail = tail->next;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add link to list */
|
|
||||||
if (data->list == NULL)
|
|
||||||
{
|
|
||||||
data->list = info;
|
|
||||||
tail = data->list;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (tail)
|
|
||||||
{
|
|
||||||
tail->next = info;
|
|
||||||
tail = tail->next;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data->list = info;
|
||||||
|
tail = data->list;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct retro_task_impl impl_regular = {
|
static struct retro_task_impl impl_regular = {
|
||||||
|
|
Loading…
Reference in New Issue