mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	* dispatch defer events in pa_mainloop_dispatch() and not already in pa_mainloop_prepare()
* fix the "timeout" parameter of pa_mainloop_prepare() * remove pa_mainloop_deferred_pending() and update the simple API accordingly git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@690 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
		
							parent
							
								
									853caf1274
								
							
						
					
					
						commit
						bf88854e60
					
				
					 3 changed files with 81 additions and 86 deletions
				
			
		| 
						 | 
					@ -624,65 +624,77 @@ static void clear_wakeup(pa_mainloop *m) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pa_mainloop_prepare(pa_mainloop *m, int timeout) {
 | 
					int pa_mainloop_prepare(pa_mainloop *m, int timeout) {
 | 
				
			||||||
    int dispatched = 0;
 | 
					    assert(m);
 | 
				
			||||||
 | 
					    assert(m->state == STATE_PASSIVE);
 | 
				
			||||||
    assert(m && (m->state == STATE_PASSIVE));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    clear_wakeup(m);
 | 
					    clear_wakeup(m);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    scan_dead(m);
 | 
					    scan_dead(m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (m->quit)
 | 
					    if (m->quit)
 | 
				
			||||||
        goto quit;
 | 
					        goto quit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dispatched += dispatch_defer(m);
 | 
					    if (!m->deferred_pending) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (m->quit)
 | 
					 | 
				
			||||||
        goto quit;
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        if (m->rebuild_pollfds)
 | 
					        if (m->rebuild_pollfds)
 | 
				
			||||||
            rebuild_pollfds(m);
 | 
					            rebuild_pollfds(m);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        m->prepared_timeout = calc_next_timeout(m);
 | 
					        m->prepared_timeout = calc_next_timeout(m);
 | 
				
			||||||
    if ((timeout >= 0) && (m->prepared_timeout > timeout))
 | 
					        if (timeout >= 0 && (timeout < m->prepared_timeout || m->prepared_timeout < 0))
 | 
				
			||||||
            m->prepared_timeout = timeout;
 | 
					            m->prepared_timeout = timeout;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    m->state = STATE_PREPARED;
 | 
					    m->state = STATE_PREPARED;
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
    return dispatched;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
quit:
 | 
					quit:
 | 
				
			||||||
 | 
					 | 
				
			||||||
    m->state = STATE_QUIT;
 | 
					    m->state = STATE_QUIT;
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    return -2;
 | 
					    return -2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pa_mainloop_poll(pa_mainloop *m) {
 | 
					int pa_mainloop_poll(pa_mainloop *m) {
 | 
				
			||||||
    int r;
 | 
					    int r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(m && (m->state == STATE_PREPARED));
 | 
					    assert(m);
 | 
				
			||||||
 | 
					    assert(m->state == STATE_PREPARED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (m->quit)
 | 
				
			||||||
 | 
					        goto quit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    m->state = STATE_POLLING;
 | 
					    m->state = STATE_POLLING;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (m->deferred_pending)
 | 
				
			||||||
 | 
					        r = 0;
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
        r = poll(m->pollfds, m->n_pollfds, m->prepared_timeout);
 | 
					        r = poll(m->pollfds, m->n_pollfds, m->prepared_timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((r < 0) && (errno == EINTR))
 | 
					        if (r < 0) {
 | 
				
			||||||
 | 
					            if (errno == EINTR)
 | 
				
			||||||
                r = 0;
 | 
					                r = 0;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (r < 0)
 | 
					 | 
				
			||||||
        m->state = STATE_PASSIVE;
 | 
					 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
        m->state = STATE_POLLED;
 | 
					                pa_log(__FILE__": poll(): %s", strerror(errno));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m->state = r < 0 ? STATE_PASSIVE : STATE_POLLED;
 | 
				
			||||||
    return r;
 | 
					    return r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					quit:
 | 
				
			||||||
 | 
					    m->state = STATE_QUIT;
 | 
				
			||||||
 | 
					    return -2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pa_mainloop_dispatch(pa_mainloop *m) {
 | 
					int pa_mainloop_dispatch(pa_mainloop *m) {
 | 
				
			||||||
    int dispatched = 0;
 | 
					    int dispatched = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(m && (m->state == STATE_POLLED));
 | 
					    assert(m);
 | 
				
			||||||
 | 
					    assert(m->state == STATE_POLLED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (m->quit)
 | 
				
			||||||
 | 
					        goto quit;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (m->deferred_pending)
 | 
				
			||||||
 | 
					        dispatched += dispatch_defer(m);
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
        dispatched += dispatch_timeout(m);
 | 
					        dispatched += dispatch_timeout(m);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (m->quit)
 | 
					        if (m->quit)
 | 
				
			||||||
| 
						 | 
					@ -690,6 +702,8 @@ int pa_mainloop_dispatch(pa_mainloop *m) {
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        dispatched += dispatch_pollfds(m);
 | 
					        dispatched += dispatch_pollfds(m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    if (m->quit)
 | 
					    if (m->quit)
 | 
				
			||||||
        goto quit;
 | 
					        goto quit;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
| 
						 | 
					@ -698,9 +712,7 @@ int pa_mainloop_dispatch(pa_mainloop *m) {
 | 
				
			||||||
    return dispatched;
 | 
					    return dispatched;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
quit:
 | 
					quit:
 | 
				
			||||||
 | 
					 | 
				
			||||||
    m->state = STATE_QUIT;
 | 
					    m->state = STATE_QUIT;
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    return -2;
 | 
					    return -2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -710,39 +722,30 @@ int pa_mainloop_get_retval(pa_mainloop *m) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval) {
 | 
					int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval) {
 | 
				
			||||||
    int r, dispatched = 0;
 | 
					    int r;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert(m);
 | 
					    assert(m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    r = pa_mainloop_prepare(m, block ? -1 : 0);
 | 
					    if ((r = pa_mainloop_prepare(m, block ? -1 : 0)) < 0)
 | 
				
			||||||
    if (r < 0) {
 | 
					        goto quit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((r = pa_mainloop_poll(m)) < 0)
 | 
				
			||||||
 | 
					        goto quit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((r = pa_mainloop_dispatch(m)) < 0)
 | 
				
			||||||
 | 
					        goto quit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					quit:
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    if ((r == -2) && retval)
 | 
					    if ((r == -2) && retval)
 | 
				
			||||||
        *retval = pa_mainloop_get_retval(m);
 | 
					        *retval = pa_mainloop_get_retval(m);
 | 
				
			||||||
    return r;
 | 
					    return r;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dispatched += r;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    r = pa_mainloop_poll(m);
 | 
					 | 
				
			||||||
    if (r < 0) {
 | 
					 | 
				
			||||||
        pa_log(__FILE__": poll(): %s", strerror(errno));
 | 
					 | 
				
			||||||
        return r;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    r = pa_mainloop_dispatch(m);
 | 
					 | 
				
			||||||
    if (r < 0) {
 | 
					 | 
				
			||||||
        if ((r == -2) && retval)
 | 
					 | 
				
			||||||
            *retval = pa_mainloop_get_retval(m);
 | 
					 | 
				
			||||||
        return r;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dispatched += r;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return dispatched;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pa_mainloop_run(pa_mainloop *m, int *retval) {
 | 
					int pa_mainloop_run(pa_mainloop *m, int *retval) {
 | 
				
			||||||
    int r;
 | 
					    int r;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    while ((r = pa_mainloop_iterate(m, 1, retval)) >= 0);
 | 
					    while ((r = pa_mainloop_iterate(m, 1, retval)) >= 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (r == -2)
 | 
					    if (r == -2)
 | 
				
			||||||
| 
						 | 
					@ -764,12 +767,6 @@ pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m) {
 | 
				
			||||||
    return &m->api;
 | 
					    return &m->api;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int pa_mainloop_deferred_pending(pa_mainloop *m) {
 | 
					 | 
				
			||||||
    assert(m);
 | 
					 | 
				
			||||||
    return m->deferred_pending > 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if 0
 | 
					#if 0
 | 
				
			||||||
void pa_mainloop_dump(pa_mainloop *m) {
 | 
					void pa_mainloop_dump(pa_mainloop *m) {
 | 
				
			||||||
    assert(m);
 | 
					    assert(m);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,12 +107,9 @@ int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval);
 | 
				
			||||||
/** Run unlimited iterations of the main loop object until the main loop's quit() routine is called. */
 | 
					/** Run unlimited iterations of the main loop object until the main loop's quit() routine is called. */
 | 
				
			||||||
int pa_mainloop_run(pa_mainloop *m, int *retval);
 | 
					int pa_mainloop_run(pa_mainloop *m, int *retval);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Return the abstract main loop abstraction layer vtable for this main loop. This calls pa_mainloop_iterate() iteratively.*/
 | 
					/** Return the abstract main loop abstraction layer vtable for this main loop. */
 | 
				
			||||||
pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m);
 | 
					pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Return non-zero when there are any deferred events pending. \since 0.5 */
 | 
					 | 
				
			||||||
int pa_mainloop_deferred_pending(pa_mainloop *m);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/** Shutdown the main loop */
 | 
					/** Shutdown the main loop */
 | 
				
			||||||
void pa_mainloop_quit(pa_mainloop *m, int r);
 | 
					void pa_mainloop_quit(pa_mainloop *m, int r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -92,9 +92,7 @@ static int iterate(pa_simple *p, int block, int *rerror) {
 | 
				
			||||||
    if (check_error(p, rerror) < 0)
 | 
					    if (check_error(p, rerror) < 0)
 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!block && !pa_context_is_pending(p->context))
 | 
					    if (block || pa_context_is_pending(p->context)) {
 | 
				
			||||||
        return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        do {
 | 
					        do {
 | 
				
			||||||
            if (pa_mainloop_iterate(p->mainloop, 1, NULL) < 0) {
 | 
					            if (pa_mainloop_iterate(p->mainloop, 1, NULL) < 0) {
 | 
				
			||||||
                if (rerror)
 | 
					                if (rerror)
 | 
				
			||||||
| 
						 | 
					@ -104,18 +102,21 @@ static int iterate(pa_simple *p, int block, int *rerror) {
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            if (check_error(p, rerror) < 0)
 | 
					            if (check_error(p, rerror) < 0)
 | 
				
			||||||
                return -1;
 | 
					                return -1;
 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        } while (pa_context_is_pending(p->context));
 | 
					        } while (pa_context_is_pending(p->context));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (;;) {
 | 
				
			||||||
 | 
					        int r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while (pa_mainloop_deferred_pending(p->mainloop)) {
 | 
					        if ((r = pa_mainloop_iterate(p->mainloop, 0, NULL)) < 0) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (pa_mainloop_iterate(p->mainloop, 0, NULL) < 0) {
 | 
					 | 
				
			||||||
            if (rerror)
 | 
					            if (rerror)
 | 
				
			||||||
                *rerror = PA_ERR_INTERNAL;
 | 
					                *rerror = PA_ERR_INTERNAL;
 | 
				
			||||||
            return -1;
 | 
					            return -1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (r == 0)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (check_error(p, rerror) < 0)
 | 
					        if (check_error(p, rerror) < 0)
 | 
				
			||||||
            return -1;
 | 
					            return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue