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