observer.c

Go to the documentation of this file.
00001 
00039 #include "observer.h"
00040 #include <cpu/irq.h>  // IRQ_DISABLE/IRQ_ENABLE
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     cpuflags_t irqstate;
00067     IRQ_SAVE_DISABLE(irqstate);
00068 
00069     /*
00070      * Run over list with protection against other
00071      * threads, but re-enable irqs in callbacks.
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 }