#pragma once #include #include #include #include "Cafe/OS/libs/coreinit/coreinit_Thread.h" template class PPCConcurrentQueue { public: PPCConcurrentQueue() = default; PPCConcurrentQueue(const PPCConcurrentQueue&) = delete; PPCConcurrentQueue& operator=(const PPCConcurrentQueue&) = delete; void push(const T& item, OSThread_t* thread) { //if(thread == nullptr) // thread = coreinitThread_getCurrentThread(ppcInterpreterCurrentInstance); //OSThread_t* currentThread = coreinit::OSGetCurrentThread(); //cemu_assert_debug(thread == nullptr || currentThread == thread); // forceLogDebug_printf("push suspend count: %d", _swapEndianU32(thread->suspend) - m_suspendCount); //__OSLockScheduler(); __OSLockScheduler(); m_queue.push(item); coreinit::__OSResumeThreadInternal(thread, 1); __OSUnlockScheduler(); //__OSUnlockScheduler(); //m_prevSuspendCount = _swapEndianU32(thread->suspend) - m_suspendCount; //coreinit_resumeThread(thread, _swapEndianU32(thread->suspend)); } T pop(OSThread_t* thread = nullptr) { //if (thread == nullptr) // thread = coreinitThread_getCurrentThread(ppcInterpreterCurrentInstance); OSThread_t* currentThread = coreinit::OSGetCurrentThread(); cemu_assert_debug(thread == nullptr || currentThread == thread); //thread = coreinitThread_getCurrentThread(ppcInterpreterCurrentInstance); // forceLogDebug_printf("pop suspend count: %d", _swapEndianU32(thread->suspend) + m_suspendCount); __OSLockScheduler(); if (m_queue.empty()) coreinit::__OSSuspendThreadInternal(thread); auto val = m_queue.front(); m_queue.pop(); __OSUnlockScheduler(); //coreinit_suspendThread(thread, m_suspendCount + m_prevSuspendCount); //m_prevSuspendCount = 0; //PPCCore_switchToScheduler(); return val; } private: //const int m_suspendCount = 8000; std::queue m_queue; //std::atomic m_prevSuspendCount; };