Skip to content

Commit ad76c94

Browse files
authored
Merge pull request #9066 from deepikabhavnani/equeue_chain_fixed
Equeue chaining bug fixes
2 parents ffccac4 + 14606b5 commit ad76c94

File tree

6 files changed

+20
-10
lines changed

6 files changed

+20
-10
lines changed

UNITTESTS/stubs/EventQueue_stub.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void EventQueue::background(Callback<void(int)> update)
6060
{
6161
}
6262

63-
void EventQueue::chain(EventQueue *target)
63+
int EventQueue::chain(EventQueue *target)
6464
{
6565
}
6666

UNITTESTS/stubs/equeue_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ void equeue_background(equeue_t *queue,
103103

104104
}
105105

106-
void equeue_chain(equeue_t *queue, equeue_t *target)
106+
int equeue_chain(equeue_t *queue, equeue_t *target)
107107
{
108108

109109
}

events/EventQueue.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ void EventQueue::background(Callback<void(int)> update)
7171
}
7272
}
7373

74-
void EventQueue::chain(EventQueue *target)
74+
int EventQueue::chain(EventQueue *target)
7575
{
7676
if (target) {
77-
equeue_chain(&_equeue, &target->_equeue);
77+
return equeue_chain(&_equeue, &target->_equeue);
7878
} else {
79-
equeue_chain(&_equeue, 0);
79+
return equeue_chain(&_equeue, 0);
8080
}
8181
}
8282
}

events/EventQueue.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,11 @@ class EventQueue : private mbed::NonCopyable<EventQueue> {
181181
*
182182
* @param target Queue that will dispatch this queue's events as a
183183
* part of its dispatch loop
184+
*
185+
* @return Zero on success and negative error code value if chaining fails
186+
*
184187
*/
185-
void chain(EventQueue *target);
188+
int chain(EventQueue *target);
186189

187190

188191

events/equeue/equeue.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -603,23 +603,27 @@ static void equeue_chain_update(void *p, int ms)
603603
if (ms >= 0) {
604604
c->id = equeue_call_in(c->target, ms, equeue_chain_dispatch, c->q);
605605
} else {
606-
equeue_dealloc(c->target, c);
606+
equeue_dealloc(c->q, c);
607607
}
608608
}
609609

610-
void equeue_chain(equeue_t *q, equeue_t *target)
610+
int equeue_chain(equeue_t *q, equeue_t *target)
611611
{
612612
if (!target) {
613613
equeue_background(q, 0, 0);
614-
return;
614+
return 0;
615615
}
616616

617617
struct equeue_chain_context *c = equeue_alloc(q,
618618
sizeof(struct equeue_chain_context));
619+
if (!c) {
620+
return -1;
621+
}
619622

620623
c->q = q;
621624
c->target = target;
622625
c->id = 0;
623626

624627
equeue_background(q, equeue_chain_update, c);
628+
return 0;
625629
}

events/equeue/equeue.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,10 @@ void equeue_background(equeue_t *queue,
220220
//
221221
// The equeue_chain function allows multiple equeues to be composed, sharing
222222
// the context of a dispatch loop while still being managed independently.
223-
void equeue_chain(equeue_t *queue, equeue_t *target);
223+
//
224+
// If the event queue chaining fails, equeue_chain returns a negative,
225+
// platform-specific error code.
226+
int equeue_chain(equeue_t *queue, equeue_t *target);
224227

225228

226229
#ifdef __cplusplus

0 commit comments

Comments
 (0)