Linux build fix.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5725 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
ayuanx 2010-06-16 14:22:17 +00:00
parent 762ce28977
commit 221e722284
3 changed files with 24 additions and 29 deletions

View File

@ -254,6 +254,11 @@ namespace Common
Sleep(ms); Sleep(ms);
} }
void SwitchCurrentThread()
{
SwitchToThread();
}
typedef struct tagTHREADNAME_INFO typedef struct tagTHREADNAME_INFO
{ {
DWORD dwType; // must be 0x1000 DWORD dwType; // must be 0x1000
@ -423,6 +428,10 @@ namespace Common
usleep(1000 * ms); usleep(1000 * ms);
} }
void SwitchCurrentThread()
{
usleep(1000 * 1);
}
void SetCurrentThreadName(const TCHAR* szThreadName) void SetCurrentThreadName(const TCHAR* szThreadName)
{ {

View File

@ -205,6 +205,7 @@ namespace Common
void InitThreading(); void InitThreading();
void SleepCurrentThread(int ms); void SleepCurrentThread(int ms);
void SwitchCurrentThread(); // On Linux, this is equal to sleep 1ms
// YieldCPU: This function is only effective on HyperThreading CPU // YieldCPU: This function is only effective on HyperThreading CPU
// Use this function during a spin-wait to make the current thread // Use this function during a spin-wait to make the current thread

View File

@ -596,28 +596,14 @@ void STACKALIGN GatherPipeBursted()
if (g_VideoInitialize.bOnThread) if (g_VideoInitialize.bOnThread)
{ {
// The interrupt latency in Dolphin is much longer than Hardware, so we must be more vigilant on Watermark // A little trick to prevent FIFO from overflown in dual core mode (n < 100 to avoid dead lock)
if (!m_CPStatusReg.OverflowHiWatermark && fifo.CPReadWriteDistance >= HiWatermark_Tighter) for (int cnt = 0; fifo.CPReadWriteDistance > fifo.CPEnd - fifo.CPBase && cnt < 100; cnt++)
{ Common::SwitchCurrentThread();
m_CPStatusReg.OverflowHiWatermark = true;
if (m_CPCtrlReg.FifoOverflowIntEnable)
UpdateInterrupts();
}
// A little trick to prevent FIFO from overflown in dual core mode
// Unfortunately we cannot do the same for single core
int cnt = 0;
while (fifo.CPReadWriteDistance > fifo.CPEnd - fifo.CPBase)
{
// Avoid deadlock
if (cnt >= 100)
break;
cnt++;
SwitchToThread();
}
} }
else else
{ {
CatchUpGPU(); CatchUpGPU();
}
// The interrupt latency in Dolphin is much longer than Hardware, so we must be more vigilant on Watermark // The interrupt latency in Dolphin is much longer than Hardware, so we must be more vigilant on Watermark
if (!m_CPStatusReg.OverflowHiWatermark && fifo.CPReadWriteDistance >= HiWatermark_Tighter) if (!m_CPStatusReg.OverflowHiWatermark && fifo.CPReadWriteDistance >= HiWatermark_Tighter)
@ -626,7 +612,6 @@ void STACKALIGN GatherPipeBursted()
if (m_CPCtrlReg.FifoOverflowIntEnable) if (m_CPCtrlReg.FifoOverflowIntEnable)
UpdateInterrupts(); UpdateInterrupts();
} }
}
_assert_msg_(COMMANDPROCESSOR, fifo.CPReadWriteDistance <= fifo.CPEnd - fifo.CPBase, _assert_msg_(COMMANDPROCESSOR, fifo.CPReadWriteDistance <= fifo.CPEnd - fifo.CPBase,
"FIFO is overflown by GatherPipe !\nCPU thread is too fast, lower the HiWatermark may help."); "FIFO is overflown by GatherPipe !\nCPU thread is too fast, lower the HiWatermark may help.");