forked from ShuriZma/suyu
1
0
Fork 0

Merge pull request #1051 from B3n30/UnscheduleEventThreadsafe

Core::CoreTiming: add UnscheduleEventThreadsafe
This commit is contained in:
bunnei 2018-08-15 18:25:30 -04:00 committed by GitHub
commit 1dd27aff47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 1 deletions

View File

@ -56,6 +56,9 @@ static u64 event_fifo_id;
// to the event_queue by the emu thread // to the event_queue by the emu thread
static Common::MPSCQueue<Event, false> ts_queue; 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; constexpr int MAX_SLICE_LENGTH = 20000;
static s64 idled_cycles; 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) { void RemoveEvent(const EventType* event_type) {
auto itr = std::remove_if(event_queue.begin(), event_queue.end(), auto itr = std::remove_if(event_queue.begin(), event_queue.end(),
[&](const Event& e) { return e.type == event_type; }); [&](const Event& e) { return e.type == event_type; });
@ -194,6 +201,9 @@ void MoveEvents() {
void Advance() { void Advance() {
MoveEvents(); MoveEvents();
for (std::pair<const EventType*, u64> ev; unschedule_queue.Pop(ev);) {
UnscheduleEvent(ev.first, ev.second);
}
int cycles_executed = slice_length - downcount; int cycles_executed = slice_length - downcount;
global_timer += cycles_executed; global_timer += cycles_executed;

View File

@ -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 ScheduleEventThreadsafe(s64 cycles_into_future, const EventType* event_type, u64 userdata);
void UnscheduleEvent(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. /// We only permit one event of each type in the queue at a time.
void RemoveEvent(const EventType* event_type); void RemoveEvent(const EventType* event_type);

View File

@ -167,7 +167,7 @@ void Thread::WakeAfterDelay(s64 nanoseconds) {
} }
void Thread::CancelWakeupTimer() { void Thread::CancelWakeupTimer() {
CoreTiming::UnscheduleEvent(ThreadWakeupEventType, callback_handle); CoreTiming::UnscheduleEventThreadsafe(ThreadWakeupEventType, callback_handle);
} }
static boost::optional<s32> GetNextProcessorId(u64 mask) { static boost::optional<s32> GetNextProcessorId(u64 mask) {