mirror of https://github.com/RPCS3/rpcs3.git
parent
7fca980887
commit
1c4ae999d6
|
@ -0,0 +1,75 @@
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include "Utilities/SSemaphore.h"
|
||||||
|
|
||||||
|
bool SSemaphore::wait(u64 timeout)
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(m_cv_mutex);
|
||||||
|
|
||||||
|
u64 counter = 0;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (Emu.IsStopped())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (timeout && counter >= timeout)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
m_cond.wait_for(lock, std::chrono::milliseconds(1));
|
||||||
|
counter++;
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
if (m_count)
|
||||||
|
{
|
||||||
|
m_count--;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SSemaphore::try_wait()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
|
||||||
|
if (m_count)
|
||||||
|
{
|
||||||
|
m_count--;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSemaphore::post(u32 value)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
|
||||||
|
if (m_count >= m_max)
|
||||||
|
{
|
||||||
|
value = 0;
|
||||||
|
}
|
||||||
|
else if (value > (m_max - m_count))
|
||||||
|
{
|
||||||
|
value = m_max - m_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (value)
|
||||||
|
{
|
||||||
|
m_count++;
|
||||||
|
value--;
|
||||||
|
m_cond.notify_one();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SSemaphore::post_and_wait()
|
||||||
|
{
|
||||||
|
if (try_wait()) return false;
|
||||||
|
|
||||||
|
post();
|
||||||
|
wait();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
class SSemaphore
|
||||||
|
{
|
||||||
|
const u32 m_max;
|
||||||
|
u32 m_count;
|
||||||
|
std::mutex m_mutex, m_cv_mutex;
|
||||||
|
std::condition_variable m_cond;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SSemaphore(u32 value, u32 max = 1)
|
||||||
|
: m_max(max > 0 ? max : 0xffffffff)
|
||||||
|
, m_count(value > m_max ? m_max : value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SSemaphore()
|
||||||
|
: m_max(0xffffffff)
|
||||||
|
, m_count(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~SSemaphore()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wait(u64 timeout = 0);
|
||||||
|
|
||||||
|
bool try_wait();
|
||||||
|
|
||||||
|
void post(u32 value = 1);
|
||||||
|
|
||||||
|
bool post_and_wait();
|
||||||
|
};
|
|
@ -6,6 +6,7 @@
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
#include <Utilities/SSemaphore.h>
|
||||||
|
|
||||||
class ThreadExec;
|
class ThreadExec;
|
||||||
|
|
||||||
|
@ -138,16 +139,6 @@ public:
|
||||||
bool IsBusy() const { return m_busy; }
|
bool IsBusy() const { return m_busy; }
|
||||||
};
|
};
|
||||||
|
|
||||||
static __forceinline bool SemaphorePostAndWait(rSemaphore& sem)
|
|
||||||
{
|
|
||||||
if(sem.TryWait() != rSEMA_BUSY) return false;
|
|
||||||
|
|
||||||
sem.Post();
|
|
||||||
sem.Wait();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
class StepThread : public ThreadBase
|
class StepThread : public ThreadBase
|
||||||
{
|
{
|
||||||
|
|
|
@ -32,8 +32,8 @@ public:
|
||||||
switch(m_type)
|
switch(m_type)
|
||||||
{
|
{
|
||||||
case GS_LOCK_NOT_WAIT: m_renderer.m_cs_main.Enter(); break;
|
case GS_LOCK_NOT_WAIT: m_renderer.m_cs_main.Enter(); break;
|
||||||
case GS_LOCK_WAIT_FLUSH: m_renderer.m_sem_flush.Wait(); break;
|
case GS_LOCK_WAIT_FLUSH: m_renderer.m_sem_flush.wait(); break;
|
||||||
case GS_LOCK_WAIT_FLIP: m_renderer.m_sem_flip.Wait(); break;
|
case GS_LOCK_WAIT_FLIP: m_renderer.m_sem_flip.wait(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,8 +42,8 @@ public:
|
||||||
switch(m_type)
|
switch(m_type)
|
||||||
{
|
{
|
||||||
case GS_LOCK_NOT_WAIT: m_renderer.m_cs_main.Leave(); break;
|
case GS_LOCK_NOT_WAIT: m_renderer.m_cs_main.Leave(); break;
|
||||||
case GS_LOCK_WAIT_FLUSH: m_renderer.m_sem_flush.Post(); break;
|
case GS_LOCK_WAIT_FLUSH: m_renderer.m_sem_flush.post(); break;
|
||||||
case GS_LOCK_WAIT_FLIP: m_renderer.m_sem_flip.Post(); break;
|
case GS_LOCK_WAIT_FLIP: m_renderer.m_sem_flip.post(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1891,9 +1891,9 @@ void RSXThread::Task()
|
||||||
if(put == get)
|
if(put == get)
|
||||||
{
|
{
|
||||||
if(m_flip_status == 0)
|
if(m_flip_status == 0)
|
||||||
SemaphorePostAndWait(m_sem_flip);
|
m_sem_flip.post_and_wait();
|
||||||
|
|
||||||
SemaphorePostAndWait(m_sem_flush);
|
m_sem_flush.post_and_wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
Sleep(1);
|
Sleep(1);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include <stack>
|
#include <stack>
|
||||||
#include <set> // For tracking a list of used gcm commands
|
#include <set> // For tracking a list of used gcm commands
|
||||||
|
#include "Utilities/SSemaphore.h"
|
||||||
|
|
||||||
enum Method
|
enum Method
|
||||||
{
|
{
|
||||||
|
@ -146,8 +147,8 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
rCriticalSection m_cs_main;
|
rCriticalSection m_cs_main;
|
||||||
rSemaphore m_sem_flush;
|
SSemaphore m_sem_flush;
|
||||||
rSemaphore m_sem_flip;
|
SSemaphore m_sem_flip;
|
||||||
Callback m_flip_handler;
|
Callback m_flip_handler;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\Utilities\SMutex.cpp" />
|
<ClCompile Include="..\Utilities\SMutex.cpp" />
|
||||||
|
<ClCompile Include="..\Utilities\SSemaphore.cpp" />
|
||||||
<ClCompile Include="..\Utilities\StrFmt.cpp" />
|
<ClCompile Include="..\Utilities\StrFmt.cpp" />
|
||||||
<ClCompile Include="..\Utilities\Thread.cpp" />
|
<ClCompile Include="..\Utilities\Thread.cpp" />
|
||||||
<ClCompile Include="Crypto\aes.cpp" />
|
<ClCompile Include="Crypto\aes.cpp" />
|
||||||
|
@ -220,6 +221,7 @@
|
||||||
<ClInclude Include="..\Utilities\simpleini\SimpleIni.h" />
|
<ClInclude Include="..\Utilities\simpleini\SimpleIni.h" />
|
||||||
<ClInclude Include="..\Utilities\SMutex.h" />
|
<ClInclude Include="..\Utilities\SMutex.h" />
|
||||||
<ClInclude Include="..\Utilities\SQueue.h" />
|
<ClInclude Include="..\Utilities\SQueue.h" />
|
||||||
|
<ClInclude Include="..\Utilities\SSemaphore.h" />
|
||||||
<ClInclude Include="..\Utilities\StrFmt.h" />
|
<ClInclude Include="..\Utilities\StrFmt.h" />
|
||||||
<ClInclude Include="..\Utilities\Thread.h" />
|
<ClInclude Include="..\Utilities\Thread.h" />
|
||||||
<ClInclude Include="..\Utilities\Timer.h" />
|
<ClInclude Include="..\Utilities\Timer.h" />
|
||||||
|
|
|
@ -575,6 +575,9 @@
|
||||||
<ClCompile Include="Emu\Io\XInput\XInputPadHandler.cpp">
|
<ClCompile Include="Emu\Io\XInput\XInputPadHandler.cpp">
|
||||||
<Filter>Emu\Io\XInput</Filter>
|
<Filter>Emu\Io\XInput</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\Utilities\SSemaphore.cpp">
|
||||||
|
<Filter>Utilities</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Crypto\aes.h">
|
<ClInclude Include="Crypto\aes.h">
|
||||||
|
@ -1042,5 +1045,8 @@
|
||||||
<ClInclude Include="Emu\event.h">
|
<ClInclude Include="Emu\event.h">
|
||||||
<Filter>Emu\SysCalls</Filter>
|
<Filter>Emu\SysCalls</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\Utilities\SSemaphore.h">
|
||||||
|
<Filter>Utilities</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
Loading…
Reference in New Issue