60 lines
1.5 KiB
C
60 lines
1.5 KiB
C
#include "dev_timer.h"
|
|
|
|
int dev_timer_open(
|
|
const timer_filters_t *const in_filters,
|
|
dev_timer_t **const out_dev
|
|
) {
|
|
int res = -ENODEV;
|
|
|
|
*out_dev = malloc(sizeof(dev_timer_t));
|
|
if (*out_dev == NULL) {
|
|
res = -ENOMEM;
|
|
goto dev_timer_open_err;
|
|
}
|
|
|
|
memset(*out_dev, 0, sizeof(dev_timer_t));
|
|
|
|
const int fd = timerfd_create(CLOCK_MONOTONIC, 0);
|
|
if (fd < 0) {
|
|
res = errno < 0 ? errno : -1 * errno;
|
|
if (res == 0) {
|
|
res = fd;
|
|
}
|
|
goto dev_timer_open_err;
|
|
}
|
|
|
|
(*out_dev)->fd = fd;
|
|
(*out_dev)->timer_spec.it_value.tv_sec = in_filters->ticktime_ms / (__time_t)1000;
|
|
(*out_dev)->timer_spec.it_value.tv_nsec = (in_filters->ticktime_ms % (__syscall_slong_t)1000) * (__syscall_slong_t)1000000;
|
|
(*out_dev)->timer_spec.it_interval.tv_sec = in_filters->ticktime_ms / (__time_t)1000;
|
|
(*out_dev)->timer_spec.it_interval.tv_nsec = (in_filters->ticktime_ms % (__syscall_slong_t)1000) * (__syscall_slong_t)1000000;
|
|
|
|
if (timerfd_settime((*out_dev)->fd, 0, &(*out_dev)->timer_spec, NULL) < 0) {
|
|
res = errno < 0 ? errno : -1 * errno;
|
|
if (res == 0) {
|
|
res = -EIO;
|
|
}
|
|
goto dev_timer_open_err;
|
|
}
|
|
|
|
res = 0;
|
|
|
|
dev_timer_open_err:
|
|
if (res != 0) {
|
|
if (fd > 0) {
|
|
close(fd);
|
|
}
|
|
|
|
free(*out_dev);
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
void dev_timer_close(dev_timer_t *const inout_dev) {
|
|
close(inout_dev->fd);
|
|
}
|
|
|
|
int dev_timer_get_fd(const dev_timer_t *const in_dev) {
|
|
return in_dev->fd;
|
|
}
|