Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions core/hostevents_sdl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ void EventManager::set_keyboard_locale(uint32_t keyboard_id) {

void EventManager::poll_events() {
SDL_Event event;
bool host_input = false; // set when an input event is delivered to the guest

while (SDL_PollEvent(&event)) {
events_captured++;
Expand Down Expand Up @@ -189,6 +190,7 @@ void EventManager::poll_events() {
key_ups++;
}

host_input = true;
this->_keyboard_signal.emit(ke);
ke.key = AdbKey_Delete;
this->_keyboard_signal.emit(ke);
Expand All @@ -210,6 +212,7 @@ void EventManager::poll_events() {
ke.flags = event.key.keysym.mod & KMOD_CAPS ?
KEYBOARD_EVENT_DOWN : KEYBOARD_EVENT_UP;
}
host_input = true;
this->_keyboard_signal.emit(ke);
} else {
LOG_F(WARNING, "Unknown key %x pressed", event.key.keysym.sym);
Expand All @@ -224,6 +227,7 @@ void EventManager::poll_events() {
me.xabs = event.motion.x;
me.yabs = event.motion.y;
me.flags = MOUSE_EVENT_MOTION;
host_input = true;
this->_mouse_signal.emit(me);
}
break;
Expand All @@ -241,6 +245,7 @@ void EventManager::poll_events() {
me.xabs = event.button.x;
me.yabs = event.button.y;
me.flags = MOUSE_EVENT_BUTTON;
host_input = true;
this->_mouse_signal.emit(me);
}
break;
Expand All @@ -258,6 +263,7 @@ void EventManager::poll_events() {
me.xabs = event.button.x;
me.yabs = event.button.y;
me.flags = MOUSE_EVENT_BUTTON;
host_input = true;
this->_mouse_signal.emit(me);
}
break;
Expand All @@ -281,6 +287,7 @@ void EventManager::poll_events() {
}
ge.gamepad_id = event.cbutton.which;
ge.flags = GAMEPAD_EVENT_DOWN;
host_input = true;
this->_gamepad_signal.emit(ge);
}
break;
Expand All @@ -304,6 +311,7 @@ void EventManager::poll_events() {
}
ge.gamepad_id = event.cbutton.which;
ge.flags = GAMEPAD_EVENT_UP;
host_input = true;
this->_gamepad_signal.emit(ge);
}
break;
Expand All @@ -315,6 +323,9 @@ void EventManager::poll_events() {

// perform post-processing
this->_post_signal.emit();

if (host_input)
mark_host_input();
}

void EventManager::post_keyboard_state_events() {
Expand Down
9 changes: 9 additions & 0 deletions core/timermanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,15 @@ uint64_t TimerManager::process_timers()
return cur_timer->timeout_ns - time_now;
}

uint64_t TimerManager::get_next_timeout_ns()
{
std::lock_guard<std::recursive_mutex> lk(this->timer_queue.get_mtx());
if (this->timer_queue.empty()) {
return 0ULL;
}
return this->timer_queue.top()->timeout_ns;
}

void TimerManager::cancel_all_timers()
{
std::shared_ptr<TimerInfo> cur_timer;
Expand Down
4 changes: 4 additions & 0 deletions core/timermanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,10 @@ class TimerManager {

uint64_t process_timers();

// peek at the next timer's expiry (in guest time) without firing it;
// returns 0 if there are no pending timers
uint64_t get_next_timeout_ns();

private:
static TimerManager* timer_manager;
TimerManager(){} // private constructor to implement a singleton
Expand Down
15 changes: 15 additions & 0 deletions cpu/ppc/ppcemu.h
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,11 @@ enum Exc_Cause : uint32_t {

extern unsigned exec_flags;

// Counter of guest accesses to memory-mapped devices, incremented by
// mmu_read_vmem/mmu_write_vmem. Used by ppcexec.cpp to detect when the
// guest is idling (spinning without touching any device).
extern uint64_t g_mmio_access_count;

extern jmp_buf exc_env;

enum Po_Cause : int {
Expand Down Expand Up @@ -728,6 +733,16 @@ extern int get_icnt_factor();
/* toggle_g_realtime */
extern bool toggle_g_realtime();

/* set_g_idle_cpu_save */
extern void set_g_idle_cpu_save(bool enabled);

/* mark_host_input: the host event poller calls this for every input event */
extern void mark_host_input();

/* realtime timer thread */
extern void start_realtime_timer_thread();
extern void stop_realtime_timer_thread();

/* force_cycle_counter_reload */
static void force_cycle_counter_reload();

Expand Down
Loading
Loading