4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the License);
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
22 #include "device-notifier.h"
25 #include <journal/system.h>
27 #define LATE_INIT_WAIT_TIME 12
28 #define DEFAULT_LATE_INIT_VALUE ((Ecore_Timer *)0x0DEF0DEF)
30 struct device_notifier {
31 enum device_notifier_type status;
32 int (*func)(void *data);
35 static dd_list *device_notifier_list;
36 static Ecore_Timer *late_init_timer = DEFAULT_LATE_INIT_VALUE;
38 #define FIND_NOTIFIER(a, b, d, e, f) \
39 DD_LIST_FOREACH(a, b, d) \
40 if (e == d->e && f == (d->f))
42 int register_notifier(enum device_notifier_type status, int (*func)(void *data))
45 struct device_notifier *data, *notifier;
47 _I("%d, %x", status, func);
50 _E("invalid func address!");
54 FIND_NOTIFIER(device_notifier_list, n, notifier, status, func) {
55 _E("function is already registered! [%d, %x]",
60 notifier = malloc(sizeof(struct device_notifier));
62 _E("Fail to malloc for notifier!");
66 notifier->status = status;
67 notifier->func = func;
69 DD_LIST_APPEND(device_notifier_list, notifier);
74 int unregister_notifier(enum device_notifier_type status, int (*func)(void *data))
77 struct device_notifier *notifier;
80 _E("invalid func address!");
84 FIND_NOTIFIER(device_notifier_list, n, notifier, status, func) {
85 _I("[%d, %x]", status, func);
86 DD_LIST_REMOVE(device_notifier_list, notifier);
93 void device_notify(enum device_notifier_type status, void *data)
96 struct device_notifier *notifier;
99 DD_LIST_FOREACH_SAFE(device_notifier_list, n, next, notifier) {
100 if (status == notifier->status) {
101 if (notifier->func) {
102 notifier->func(data);
109 static void late_init_stop(void)
111 if (late_init_timer == NULL ||
112 late_init_timer == DEFAULT_LATE_INIT_VALUE)
114 ecore_timer_del(late_init_timer);
115 late_init_timer = NULL;
118 static int booting_done(void *data)
125 journal_system_booting_done();
127 if (late_init_timer == NULL)
134 static Eina_Bool late_init_timer_cb(void *data)
139 done = booting_done(NULL);
142 _I("late booting done");
143 device_notify(DEVICE_NOTIFIER_BOOTING_DONE, (void *)TRUE);
147 static void device_notifier_init(void *data)
151 ret = check_systemd_active();
153 _I("restart booting done");
156 register_notifier(DEVICE_NOTIFIER_BOOTING_DONE, booting_done);
157 late_init_timer = ecore_timer_add(LATE_INIT_WAIT_TIME,
158 late_init_timer_cb, NULL);
159 if (!late_init_timer)
160 late_init_timer = DEFAULT_LATE_INIT_VALUE;
163 static void device_notifier_exit(void *data)
166 struct device_notifier *notifier;
168 DD_LIST_FOREACH(device_notifier_list, n, notifier)
169 DD_LIST_REMOVE(device_notifier_list, notifier);
173 static const struct device_ops notifier_device_ops = {
174 .priority = DEVICE_PRIORITY_NORMAL,
176 .init = device_notifier_init,
177 .exit = device_notifier_exit,
180 DEVICE_OPS_REGISTER(¬ifier_device_ops)