Note! This project has moved to github.com/armmbed/mbed-events

Dependents:   SimpleHTTPExample

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.

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;