static void button_queue_wait(struct queue_event *evp, int timeout)
{
    /* Loop once after wait time if boosted in order to unboost and wait the
       full remaining time */
    do
    {
        int ticks = timeout;

        if (ticks == 0) /* TIMEOUT_NOBLOCK */
            ;
        else if (ticks > 0)
        {
            if (button_boosted && ticks > BUTTON_UNBOOST_TMO)
                ticks = BUTTON_UNBOOST_TMO;

            timeout -= ticks;
        }
        else            /* TIMEOUT_BLOCK (ticks < 0) */
        {
            if (button_boosted)
                ticks = BUTTON_UNBOOST_TMO;
        }

        queue_wait_w_tmo(&button_queue, evp, ticks);
        if (evp->id != SYS_TIMEOUT)
        {
            /* GUI boost build gets immediate kick, otherwise at least 3
               messages had to be there */
        #ifndef HAVE_GUI_BOOST
            if (queue_count(&button_queue) >= 2)
        #endif
                button_boost(true);

            break; 
        }

        if (button_boosted && TIME_AFTER(current_tick, button_unboost_tick))
            button_boost(false);
    }
    while (timeout);
}
Exemple #2
0
long button_get(bool block)
{
    struct queue_event ev;
    int pending_count = queue_count(&button_queue);

#ifdef HAVE_ADJUSTABLE_CPU_FREQ
    /* Control the CPU boost trying to keep queue empty. */
    if (pending_count == 0)
        button_boost(false);
    else if (pending_count > 2)
        button_boost(true);
#endif
    
    if ( block || pending_count )
    {
        queue_wait(&button_queue, &ev);
        
        button_data = ev.data;
        return ev.id;
    }
    
    return BUTTON_NONE;
}
Exemple #3
0
long button_get_w_tmo(int ticks)
{
    struct queue_event ev;
    
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
    /* Be sure to keep boosted state. */
    if (!queue_empty(&button_queue))
        return button_get(true);
    
    button_boost(false);
#endif
    
    queue_wait_w_tmo(&button_queue, &ev, ticks);
    if (ev.id == SYS_TIMEOUT)
        ev.id = BUTTON_NONE;
    else
        button_data = ev.data;
    return ev.id;
}