TTD_QUEUE_TYPE_RESULT,
} ttd_queue_type_e;
+typedef void (*ttd_queue_item_free_func)(void *item);
+
int ttd_queue_fini(void);
int ttd_queue_init(void);
-int ttd_queue_push(ttd_queue_type_e type, void *data);
-int ttd_queue_pop(ttd_queue_type_e type, void **data);
+int ttd_queue_push(
+ ttd_queue_type_e type, void *item, ttd_queue_item_free_func free_fn);
+void *ttd_queue_pop(ttd_queue_type_e type);
void *ttd_queue_timeout_pop(ttd_queue_type_e type, unsigned int timeout);
#endif /* __TT_DAEMON_QUEUE_H__ */
#ifndef __TT_DAEMON_TASK_H__
#define __TT_DAEMON_TASK_H__
+#define TTD_TASK_PRIORITY_LOW 50
+#define TTD_TASK_PRIORITY_NORMAL 100
+#define TTD_TASK_PRIORITY_HIGH 150
+
typedef struct __ttd_task ttd_task;
typedef int (*ttd_task_func)(void *task_data);
+typedef void (*ttd_task_data_free_func)(void *task_data);
typedef void (*ttd_task_complete_func)(int result, void *user_data);
-ttd_task *ttd_task_new(int priority, ttd_task_func task_fn, void *task_data);
+ttd_task *ttd_task_new(int priority, ttd_task_func task_fn, void *task_data,
+ ttd_task_data_free_func data_free_fn);
int ttd_task_set_complete_func(ttd_task *task, ttd_task_complete_func complete_fn, void *user_data);
int ttd_task_run(ttd_task *task);
int ttd_task_sort_func(const void *a, const void *b, void *user_data);
#include "ttd-log.h"
#include "ttd-queue.h"
+typedef struct _queue_item_s {
+ void *item;
+ ttd_queue_item_free_func free_fn;
+} queue_item_s;
+
static GAsyncQueue *queue_cmd = NULL;
static GAsyncQueue *queue_res = NULL;
-static void _cmd_queue_item_free(gpointer data)
+static void __queue_item_free(gpointer data)
{
- /* TODO */
- free(data);
-}
+ queue_item_s *queue_item = data;
+ if (!queue_item)
+ return;
-static void _res_queue_item_free(gpointer data)
-{
- /* TODO */
- free(data);
+ if (queue_item->free_fn)
+ queue_item->free_fn(queue_item->item);
+ else
+ g_free(queue_item->item);
+
+ g_free(data);
}
int ttd_queue_init(void)
{
- queue_cmd = g_async_queue_new_full(_cmd_queue_item_free);
- queue_res = g_async_queue_new_full(_res_queue_item_free);
+ queue_cmd = g_async_queue_new_full(__queue_item_free);
+ queue_res = g_async_queue_new_full(__queue_item_free);
if (!(queue_cmd && queue_res)) {
_E("failed to create queue - cmd[%p], res[%p]", queue_cmd, queue_res);
return 0;
}
-int ttd_queue_push(ttd_queue_type_e type, void *data)
+int ttd_queue_push(ttd_queue_type_e type, void *item,
+ ttd_queue_item_free_func free_fn)
{
GAsyncQueue *queue = NULL;
+ queue_item_s *queue_item = NULL;
- if (data == NULL) {
- _E("data is NULL");
+ if (item == NULL) {
+ _E("item is NULL");
return -1;
}
break;
}
- _V("pushing data[%p] to queue[type - %d]", data, type);
- g_async_queue_push(queue, data);
+ queue_item = g_malloc(sizeof(queue_item_s));
+ retvm_if(!queue_item, -1, "failed to malloc for push item");
+ queue_item->item = item;
+ queue_item->free_fn = free_fn;
+
+ _V("pushing item[%p] to queue[type - %d]", queue_item->item, type);
+ g_async_queue_push(queue, queue_item);
return 0;
}
return queue;
}
-int ttd_queue_pop(ttd_queue_type_e type, void **data)
+void *ttd_queue_pop(ttd_queue_type_e type)
{
GAsyncQueue *queue = NULL;
+ queue_item_s *queue_item = NULL;
void *item = NULL;
- retvm_if(!data, -1, "data is NULL");
-
queue = __get_queue(type);
- retv_if(!queue, -1);
+ retv_if(!queue, NULL);
- item = g_async_queue_pop(queue);
- *data = item;
+ queue_item = g_async_queue_pop(queue);
+ if (queue_item) {
+ item = queue_item->item;
+ g_free(queue_item);
- return 0;
+ _V("poping item[%p] from queue[type - %d]", item, type);
+ }
+ return item;
}
void *ttd_queue_timeout_pop(ttd_queue_type_e type, unsigned int timeout_msec)
{
GAsyncQueue *queue = NULL;
+ queue_item_s *queue_item = NULL;
void *item = NULL;
queue = __get_queue(type);
retv_if(!queue, NULL);
- item = g_async_queue_timeout_pop(queue, (guint64)timeout_msec*1000);
-
+ queue_item = g_async_queue_timeout_pop(queue, (guint64)timeout_msec*1000);
+ if (queue_item) {
+ item = queue_item->item;
+ g_free(queue_item);
+ _V("poping item[%p] from queue[type - %d]", item, type);
+ }
return item;
}
int priority;
ttd_task_func task_func;
void *task_data;
+ ttd_task_data_free_func data_free_func;
ttd_task_complete_func complete_func;
void *user_data;
};
-ttd_task *ttd_task_new(int priority, ttd_task_func task_func, void *task_data)
+ttd_task *ttd_task_new(int priority, ttd_task_func task_func, void *task_data,
+ ttd_task_data_free_func data_free_fn)
{
ttd_task *task = NULL;
task->priority = priority;
task->task_func = task_func;
task->task_data = task_data;
+ task->data_free_func = data_free_fn;
}
return task;
}
/* TODO : call it in mainloop or in thread????? */
task->complete_func(ret, task->user_data);
}
+
+ if (task->data_free_func)
+ task->data_free_func(task->task_data);
+ else
+ g_free(task->task_data);
+
return 0;
}