tizen 2.3 release
[framework/system/deviced.git] / src / logd_grabber / timer.c
1 #include <sys/timerfd.h>
2 #include <time.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <stdint.h>
7 #include <string.h>
8 #include <errno.h>
9
10 #include "core/log.h"
11 #include "timer.h"
12
13 int update_timer_exp(struct timer *tm, int timeout)
14 {
15         struct timespec now;
16         struct itimerspec new_value;
17
18         clock_gettime(CLOCK_REALTIME, &now);
19         new_value.it_value.tv_sec = now.tv_sec + timeout;
20         new_value.it_value.tv_nsec = now.tv_nsec;
21
22         new_value.it_interval.tv_sec = timeout;
23         new_value.it_interval.tv_nsec = 0;
24
25         if (timerfd_settime(tm->fd, TFD_TIMER_ABSTIME, &new_value, NULL) == -1) {
26                 _E("timerfd_settime: %s", strerror(errno));
27                 return -errno;
28         }
29
30         return 0;
31 }
32
33 struct timer* create_timer(int timeout, void(*cb)(void*), void *user_data)
34 {
35         int ret;
36         struct timer *tm;
37
38         tm = malloc(sizeof(struct timer));
39         if (!tm) {
40                 _E("malloc failed");
41                 return NULL;
42         }
43
44         tm->cb = cb;
45         tm->user_data = user_data;
46         tm->fd = timerfd_create(CLOCK_REALTIME, 0);
47         if (tm->fd == -1) {
48                 _E("timerfd_create failed: %s", strerror(errno));
49                 free(tm);
50                 return NULL;
51         }
52
53         tm->timeout = timeout;
54
55         ret = update_timer_exp(tm, timeout);
56         if (ret < 0) {
57                 close(tm->fd);
58                 free(tm);
59                 _E("update_timer_exp failed");
60                 return NULL;
61         }
62
63         return tm;
64 }
65
66 void process_timer(struct timer *tm)
67 {
68         int s;
69         uint64_t exp;
70
71         if (!tm)
72                 return;
73         s = read(tm->fd, &exp, sizeof(uint64_t));
74         tm->cb(tm->user_data);
75 }
76
77 void delete_timer(struct timer *tm)
78 {
79         if (!tm)
80                 return;
81
82         close(tm->fd);
83         free(tm);
84 }