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
 | 
			
		||||
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) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user