Core::CoreTiming: add UnscheduleEventThreadsafe
This commit is contained in:
		| @@ -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; | ||||||
|   | |||||||
| @@ -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); | ||||||
|   | |||||||
| @@ -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) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user