Merge pull request #9066 from deepikabhavnani/equeue_chain_fixed

Equeue chaining bug fixes
pull/9225/head
Martin Kojtal 2019-01-02 09:16:19 +00:00 committed by GitHub
commit ad76c94369
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 20 additions and 10 deletions

View File

@ -60,7 +60,7 @@ void EventQueue::background(Callback<void(int)> update)
{ {
} }
void EventQueue::chain(EventQueue *target) int EventQueue::chain(EventQueue *target)
{ {
} }

View File

@ -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)
{ {
} }

View File

@ -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);
} }
} }
} }

View File

@ -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);

View File

@ -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;
} }

View File

@ -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