BeRTOS
observer.c
Go to the documentation of this file.
00001 
00038 #include "observer.h"
00039 #include <cpu/irq.h>  // IRQ_DISABLE/IRQ_ENABLE
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      * Run over list with protection against other
00070      * threads, but re-enable irqs in callbacks.
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 }