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) {
 | 
			
		||||
        equeue_chain(&_equeue, &target->_equeue);
 | 
			
		||||
        return equeue_chain(&_equeue, &target->_equeue);
 | 
			
		||||
    } 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
 | 
			
		||||
     *                  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) {
 | 
			
		||||
        c->id = equeue_call_in(c->target, ms, equeue_chain_dispatch, c->q);
 | 
			
		||||
    } 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) {
 | 
			
		||||
        equeue_background(q, 0, 0);
 | 
			
		||||
        return;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    struct equeue_chain_context *c = equeue_alloc(q,
 | 
			
		||||
                                                  sizeof(struct equeue_chain_context));
 | 
			
		||||
    if (!c) {
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    c->q = q;
 | 
			
		||||
    c->target = target;
 | 
			
		||||
    c->id = 0;
 | 
			
		||||
 | 
			
		||||
    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 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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue