1#include <mem/alloc.h>
2#include <mem/nofail.h>
3#include <stdarg.h>
4#include <string.h>
5#include <time/clock_evdev.h>
6
7#include "internal.h"
8
9struct clock_evdev_group *clock_evdev_group_create(const char *name, ...) {
10 struct clock_evdev_group *cedg = vnew(cedg, ALLOC_ZERO);
11
12 if (!cedg)
13 return NULL;
14
15 list_head_init(h: &cedg->clock_evdevs);
16 va_list args;
17 va_start(args, name);
18 int ret = ERR_GUARD(vasprintf(&cedg->name, name, args), ERR_NO_MEM);
19 va_end(args);
20
21 if (ret == ERR_NO_MEM) {
22 vfree(cedg);
23 return NULL;
24 }
25
26 return cedg;
27}
28
29struct clock_evdev *clock_evdev_create(const char *name, ...) {
30 struct clock_evdev *ced = vnew(ced, ALLOC_ZERO);
31 if (!ced)
32 return NULL;
33
34 cpu_mask_init(m: &ced->cpu_mask, nbits: global.core_count);
35
36 va_list args;
37 va_start(args, name);
38 int ret = ERR_GUARD(vasprintf(&ced->name, name, args), ERR_NO_MEM);
39 va_end(args);
40
41 if (ret == ERR_NO_MEM) {
42 vfree(ced);
43 return NULL;
44 }
45
46 return ced;
47}
48
49void clock_evdev_register(struct clock_evdev *ced) {
50 enforce(!ced->in_global_list, DUPLICATE);
51 ced->in_global_list = true;
52 locked_list_add(ll: &clock_global.clock_evdevs, lh: &ced->list_internal);
53}
54
55void clock_evdev_group_register(struct clock_evdev_group *cedg) {
56 locked_list_add(ll: &clock_global.clock_evdev_groups, lh: &cedg->list_internal);
57}
58
59void clock_evdev_group_unregister(struct clock_evdev_group *cedg) {
60 locked_list_del(ll: &clock_global.clock_evdev_groups, lh: &cedg->list_internal);
61}
62
63struct clock_evdev_group *clock_evdev_group_search_for(const char *name) {
64 enum irql irql = locked_list_lock(ll: &clock_global.clock_evdev_groups);
65
66 struct clock_evdev_group *group = NULL;
67 list_for_each_entry(group, &clock_global.clock_evdev_groups.list,
68 list_internal) {
69 if (strcmp(str1: group->name, str2: name) == 0)
70 goto out;
71 }
72
73out:
74 locked_list_unlock(ll: &clock_global.clock_evdev_groups, irql);
75 return group;
76}
77