observer.c
Go to the documentation of this file.00001
00039 #include "observer.h"
00040 #include <cpu/irq.h>
00041
00042
00043 void observer_SetEvent(Observer *observer, void (*event)(int event_id, void *param))
00044 {
00045 observer->event = event;
00046 }
00047
00048 void observer_InitSubject(Subject *subject)
00049 {
00050 LIST_INIT(&subject->observers);
00051 }
00052
00053 void observer_Subscribe(Subject *subject, Observer *observer)
00054 {
00055 ATOMIC(ADDHEAD(&subject->observers, &observer->link));
00056 }
00057
00058 void observer_Unsubscribe(UNUSED_ARG(Subject *,subject), Observer *observer)
00059 {
00060 ATOMIC(REMOVE(&observer->link));
00061 }
00062
00063 void observer_notify(Subject *subject, int event_id, void *param)
00064 {
00065 Observer *observer;
00066 cpu_flags_t irqstate;
00067 IRQ_SAVE_DISABLE(irqstate);
00068
00069
00070
00071
00072
00073 FOREACH_NODE(observer, &subject->observers)
00074 {
00075 IRQ_RESTORE(irqstate);
00076 observer->event(event_id, param);
00077 IRQ_SAVE_DISABLE(irqstate);
00078 }
00079
00080 IRQ_RESTORE(irqstate);
00081 }