Browse Source
Merge pull request #1051 from B3n30/UnscheduleEventThreadsafe
Core::CoreTiming: add UnscheduleEventThreadsafe
pull/15/merge
bunnei
7 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
12 additions and
1 deletions
-
src/core/core_timing.cpp
-
src/core/core_timing.h
-
src/core/hle/kernel/thread.cpp
|
|
|
@ -56,6 +56,9 @@ static u64 event_fifo_id; |
|
|
|
// to the event_queue by the emu thread
|
|
|
|
static Common::MPSCQueue<Event, false> ts_queue; |
|
|
|
|
|
|
|
// the queue for unscheduling the events from other threads threadsafe
|
|
|
|
static Common::MPSCQueue<std::pair<const EventType*, u64>, false> unschedule_queue; |
|
|
|
|
|
|
|
constexpr int MAX_SLICE_LENGTH = 20000; |
|
|
|
|
|
|
|
static s64 idled_cycles; |
|
|
|
@ -158,6 +161,10 @@ void UnscheduleEvent(const EventType* event_type, u64 userdata) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void UnscheduleEventThreadsafe(const EventType* event_type, u64 userdata) { |
|
|
|
unschedule_queue.Push(std::make_pair(event_type, userdata)); |
|
|
|
} |
|
|
|
|
|
|
|
void RemoveEvent(const EventType* event_type) { |
|
|
|
auto itr = std::remove_if(event_queue.begin(), event_queue.end(), |
|
|
|
[&](const Event& e) { return e.type == event_type; }); |
|
|
|
@ -194,6 +201,9 @@ void MoveEvents() { |
|
|
|
|
|
|
|
void Advance() { |
|
|
|
MoveEvents(); |
|
|
|
for (std::pair<const EventType*, u64> ev; unschedule_queue.Pop(ev);) { |
|
|
|
UnscheduleEvent(ev.first, ev.second); |
|
|
|
} |
|
|
|
|
|
|
|
int cycles_executed = slice_length - downcount; |
|
|
|
global_timer += cycles_executed; |
|
|
|
|
|
|
|
@ -65,6 +65,7 @@ void ScheduleEvent(s64 cycles_into_future, const EventType* event_type, u64 user |
|
|
|
void ScheduleEventThreadsafe(s64 cycles_into_future, const EventType* event_type, u64 userdata); |
|
|
|
|
|
|
|
void UnscheduleEvent(const EventType* event_type, u64 userdata); |
|
|
|
void UnscheduleEventThreadsafe(const EventType* event_type, u64 userdata); |
|
|
|
|
|
|
|
/// We only permit one event of each type in the queue at a time. |
|
|
|
void RemoveEvent(const EventType* event_type); |
|
|
|
|
|
|
|
@ -167,7 +167,7 @@ void Thread::WakeAfterDelay(s64 nanoseconds) { |
|
|
|
} |
|
|
|
|
|
|
|
void Thread::CancelWakeupTimer() { |
|
|
|
CoreTiming::UnscheduleEvent(ThreadWakeupEventType, callback_handle); |
|
|
|
CoreTiming::UnscheduleEventThreadsafe(ThreadWakeupEventType, callback_handle); |
|
|
|
} |
|
|
|
|
|
|
|
static boost::optional<s32> GetNextProcessorId(u64 mask) { |
|
|
|
|