Note! This project has moved to github.com/armmbed/mbed-events
This repository has been superceded
This project has moved to mbed-events
Composable event loops combine the cheap synchronicity of event loops with the composability of preempted threads.
Two modular event queue classes are provided:
- EventLoop - for loops coupled with a c++ managed thread
- EventQueue - for manually managed event queues
The Event class takes advantage of the extensibility of FuncPtr to allow an event to be passed through APIs as a normal function.
More information on composable event loops.
Diff: EventQueue.cpp
- Revision:
- 1:2202c19570e5
- Parent:
- 0:b1b901ae3696
- Child:
- 2:11cda6bead99
--- a/EventQueue.cpp Wed Apr 20 11:43:51 2016 -0500 +++ b/EventQueue.cpp Wed Apr 20 12:40:18 2016 -0500 @@ -4,11 +4,11 @@ static void wakeup() {} -void EventQueue::dispatch(unsigned milli) { +void EventQueue::dispatch(int ms) { mbed::Timer timer; mbed::Timeout timeout; timer.start(); - timeout.attach_us(wakeup, milli * 1000); + timeout.attach_us(wakeup, ms * 1000); while (true) { while (_queue) { @@ -16,7 +16,7 @@ _queue = _queue->next; } - if ((unsigned)timer.read_ms() > milli) { + if (ms >= 0 && timer.read_ms() >= ms) { break; } @@ -26,7 +26,7 @@ void EventQueue::event_register(struct event *event) { __disable_irq(); - for (struct event **p = &_queue;; p = &(*p)->next) { + for (struct event *volatile *p = &_queue;; p = &(*p)->next) { if (!*p) { event->next = 0; *p = event; @@ -40,7 +40,7 @@ void EventQueue::event_unregister(struct event *event) { __disable_irq(); - for (struct event **p = &_queue; *p; p = &(*p)->next) { + for (struct event *volatile *p = &_queue; *p; p = &(*p)->next) { if (*p == event) { *p = event->next; break;