82103bcff5e280da88e24035fcabac73a1a5cb87
[apps/native/tizen-things-daemon.git] / daemon / src / ttd-task.c
1 /*
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Flora License, Version 1.1 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://floralicense.org/license/
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <glib.h>
18 #include "ttd-log.h"
19 #include "ttd-task.h"
20
21 struct __ttd_task {
22         int priority;
23         ttd_task_func task_func;
24         char *task_id;
25         void *task_data;
26         ttd_task_data_free_func data_free_func;
27         ttd_task_complete_func complete_func;
28         void *user_data;
29 };
30
31 ttd_task *ttd_task_new(int priority, ttd_task_func task_func, void *task_data,
32         ttd_task_data_free_func data_free_fn)
33 {
34         ttd_task *task = NULL;
35
36         task = g_malloc0(sizeof(struct __ttd_task));
37         if (task) {
38                 task->priority = priority;
39                 task->task_func = task_func;
40                 task->task_data = task_data;
41                 task->data_free_func = data_free_fn;
42         }
43         return task;
44 }
45
46 int ttd_task_set_task_id(ttd_task *task, const char *id)
47 {
48         if (!task)
49                 return -1;
50
51         if (task->task_id)
52                 g_free(task->task_id);
53
54         task->task_id = g_strdup(id);
55
56         return 0;
57 }
58
59 const char *ttd_task_get_task_id(ttd_task *task)
60 {
61         if (!task)
62                 return NULL;
63
64         return (const char *)task->task_id;
65 }
66
67 int ttd_task_set_complete_func(ttd_task *task, ttd_task_complete_func complete_func, void *user_data)
68 {
69         if (!task)
70                 return -1;
71
72         task->complete_func = complete_func;
73         task->user_data = user_data;
74
75         return 0;
76 }
77
78 int ttd_task_sort_func(const void *a, const void *b, void *user_data)
79 {
80         const ttd_task *task_a = a;
81         const ttd_task *task_b = b;
82
83         if (!task_a || !task_b)
84                 return 0;
85
86         return (task_a->priority - task_b->priority);
87 }
88
89 int ttd_task_run(ttd_task *task)
90 {
91         int ret = 0;
92
93         retvm_if(!task, -1, "task is NULL");
94         retvm_if(!task->task_func, -1, "task_func is NULL");
95
96         if (task->task_id)
97                 _D("task [%s] is running", task->task_id);
98
99         ret = task->task_func(task->task_data);
100
101         if (task->complete_func) {
102                 /* TODO : call it in mainloop or in thread????? */
103                 task->complete_func(ret, task->user_data);
104         }
105
106         if (task->data_free_func)
107                 task->data_free_func(task->task_data);
108         else
109                 g_free(task->task_data);
110
111         return 0;
112 }
113
114 void ttd_task_free(ttd_task *task)
115 {
116         if (!task)
117                 return;
118
119         if (task->task_id) {
120                 _V("task [%s] is freed", task->task_id)
121                 g_free(task->task_id);
122         }
123         g_free(task);
124 }