BeRTOS
|
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 }