mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #9066 from deepikabhavnani/equeue_chain_fixed
Equeue chaining bug fixespull/9225/head
commit
ad76c94369
|
@ -60,7 +60,7 @@ void EventQueue::background(Callback<void(int)> update)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventQueue::chain(EventQueue *target)
|
int EventQueue::chain(EventQueue *target)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ void equeue_background(equeue_t *queue,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void equeue_chain(equeue_t *queue, equeue_t *target)
|
int equeue_chain(equeue_t *queue, equeue_t *target)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,12 +71,12 @@ void EventQueue::background(Callback<void(int)> update)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventQueue::chain(EventQueue *target)
|
int EventQueue::chain(EventQueue *target)
|
||||||
{
|
{
|
||||||
if (target) {
|
if (target) {
|
||||||
equeue_chain(&_equeue, &target->_equeue);
|
return equeue_chain(&_equeue, &target->_equeue);
|
||||||
} else {
|
} else {
|
||||||
equeue_chain(&_equeue, 0);
|
return equeue_chain(&_equeue, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,8 +181,11 @@ public:
|
||||||
*
|
*
|
||||||
* @param target Queue that will dispatch this queue's events as a
|
* @param target Queue that will dispatch this queue's events as a
|
||||||
* part of its dispatch loop
|
* part of its dispatch loop
|
||||||
|
*
|
||||||
|
* @return Zero on success and negative error code value if chaining fails
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
void chain(EventQueue *target);
|
int chain(EventQueue *target);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -603,23 +603,27 @@ static void equeue_chain_update(void *p, int ms)
|
||||||
if (ms >= 0) {
|
if (ms >= 0) {
|
||||||
c->id = equeue_call_in(c->target, ms, equeue_chain_dispatch, c->q);
|
c->id = equeue_call_in(c->target, ms, equeue_chain_dispatch, c->q);
|
||||||
} else {
|
} else {
|
||||||
equeue_dealloc(c->target, c);
|
equeue_dealloc(c->q, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void equeue_chain(equeue_t *q, equeue_t *target)
|
int equeue_chain(equeue_t *q, equeue_t *target)
|
||||||
{
|
{
|
||||||
if (!target) {
|
if (!target) {
|
||||||
equeue_background(q, 0, 0);
|
equeue_background(q, 0, 0);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct equeue_chain_context *c = equeue_alloc(q,
|
struct equeue_chain_context *c = equeue_alloc(q,
|
||||||
sizeof(struct equeue_chain_context));
|
sizeof(struct equeue_chain_context));
|
||||||
|
if (!c) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
c->q = q;
|
c->q = q;
|
||||||
c->target = target;
|
c->target = target;
|
||||||
c->id = 0;
|
c->id = 0;
|
||||||
|
|
||||||
equeue_background(q, equeue_chain_update, c);
|
equeue_background(q, equeue_chain_update, c);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,7 +220,10 @@ void equeue_background(equeue_t *queue,
|
||||||
//
|
//
|
||||||
// The equeue_chain function allows multiple equeues to be composed, sharing
|
// The equeue_chain function allows multiple equeues to be composed, sharing
|
||||||
// the context of a dispatch loop while still being managed independently.
|
// the context of a dispatch loop while still being managed independently.
|
||||||
void equeue_chain(equeue_t *queue, equeue_t *target);
|
//
|
||||||
|
// If the event queue chaining fails, equeue_chain returns a negative,
|
||||||
|
// platform-specific error code.
|
||||||
|
int equeue_chain(equeue_t *queue, equeue_t *target);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
Loading…
Reference in New Issue