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