#include <glib.h>
struct resourced_notifier {
- enum notifier_type status;
+// enum notifier_type status;
int (*func)(void *data);
};
-static GSList *resourced_notifier_list;
+static GSList *resourced_notifier_list[RESOURCED_NOTIFIER_MAX];
-#define FIND_NOTIFIER(a, b, d, e, f) \
+#define FIND_NOTIFIER(a, b, d, f) \
gslist_for_each(a, b, d) \
- if (e == d->e && f == (d->f))
+ if (f == (d->f))
int register_notifier(enum notifier_type status, int (*func)(void *data))
{
GSList *n;
struct resourced_notifier *notifier;
- _D("%d, %p", status, func);
if (!func) {
_E("invalid func address!");
return -EINVAL;
}
- FIND_NOTIFIER(resourced_notifier_list, n, notifier, status, func) {
+ if(status >= RESOURCED_NOTIFIER_MAX ||
+ status < RESOURCED_NOTIFIER_APP_LAUNCH) {
+ _E("invalid status!");
+ return -EINVAL;
+ }
+
+ FIND_NOTIFIER(resourced_notifier_list[status], n, notifier, func) {
_E("function is already registered! [%d, %p]",
status, func);
return -EINVAL;
return -ENOMEM;
}
- notifier->status = status;
+// notifier->status = status;
notifier->func = func;
- resourced_notifier_list = g_slist_append(resourced_notifier_list, notifier);
+ resourced_notifier_list[status] = g_slist_append(resourced_notifier_list[status], notifier);
+ _D("[status: %d] %p is registered", status, func);
return 0;
}
return -EINVAL;
}
- FIND_NOTIFIER(resourced_notifier_list, n, notifier, status, func) {
+ if(status >= RESOURCED_NOTIFIER_MAX ||
+ status < RESOURCED_NOTIFIER_APP_LAUNCH) {
+ _E("invalid status!");
+ return -EINVAL;
+ }
+
+ FIND_NOTIFIER(resourced_notifier_list[status], n, notifier, func) {
_I("[%d, %p]", status, func);
- resourced_notifier_list = g_slist_remove(resourced_notifier_list, notifier);
+ resourced_notifier_list[status] = g_slist_remove(resourced_notifier_list[status], notifier);
free(notifier);
+ return 0;
}
- return 0;
+ _E("[%d, %p] is not registered!", status, func);
+ return -EINVAL;
}
void resourced_notify(enum notifier_type status, void *data)
GSList *iter;
struct resourced_notifier *notifier;
- gslist_for_each_item(iter, resourced_notifier_list) {
+ gslist_for_each_item(iter, resourced_notifier_list[status]) {
notifier = (struct resourced_notifier *)iter->data;
- if (status == notifier->status) {
+// if (status == notifier->status) {
if (notifier->func)
notifier->func(data);
- }
+// }
}
}
{
GSList *iter;
/* Deinitialize in reverse order */
- GSList *reverse_list = g_slist_reverse(resourced_notifier_list);
struct resourced_notifier *notifier;
- gslist_for_each_item(iter, reverse_list) {
- notifier = (struct resourced_notifier *)iter->data;
- resourced_notifier_list = g_slist_remove(resourced_notifier_list, notifier);
- free(notifier);
+ for(int status = RESOURCED_NOTIFIER_APP_LAUNCH;
+ status < RESOURCED_NOTIFIER_MAX; status++) {
+ GSList *reverse_list = g_slist_reverse(resourced_notifier_list[status]);
+ gslist_for_each_item(iter, reverse_list) {
+ notifier = (struct resourced_notifier *)iter->data;
+ resourced_notifier_list[status] =
+ g_slist_remove(resourced_notifier_list[status], notifier);
+ free(notifier);
+ }
}
+
return RESOURCED_ERROR_NONE;
}