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:
- 20:2f9d9c53a5af
- Parent:
- 17:6d564266850e
--- a/EventQueue.cpp Mon Apr 18 12:59:37 2016 -0500 +++ b/EventQueue.cpp Mon Apr 18 13:22:21 2016 -0500 @@ -17,18 +17,26 @@ // Event queue definitions -EventQueue::EventQueue(unsigned event_count, unsigned event_context) { +EventQueue::EventQueue(unsigned event_count, + unsigned event_context, + unsigned char *event_pointer) { _event_context = sizeof(FuncPtr<void()>) + event_context; unsigned event_size = sizeof(struct event) + _event_context; - _mem = malloc(event_count * event_size); - _free = (struct event*)_mem; - if (_mem) { + if (!event_pointer) { + _mem = malloc(event_count * event_size); + _free = (struct event*)_mem; + } else { + _mem = 0; + _free = (struct event*)event_pointer; + } + + if (_free) { for (unsigned i = 0; i < event_count-1; i++) { - ((struct event*)((char*)_mem + i*event_size))->next = - (struct event*)((char*)_mem + (i+1)*event_size); + ((struct event*)((char*)_free + i*event_size))->next = + (struct event*)((char*)_free + (i+1)*event_size); } - ((struct event*)((char*)_mem + (event_count-1)*event_size))->next = 0; + ((struct event*)((char*)_free + (event_count-1)*event_size))->next = 0; } _queue = 0;