fixed Win32 Threaded, by waiting for multiple objects (it was re-using the same task all the time)

Thanks Marten Svanfeldt (Starbreeze Studios) for the fix
This commit is contained in:
ejcoumans
2007-08-12 17:37:36 +00:00
parent ec22825e65
commit f19bc68408
2 changed files with 14 additions and 15 deletions

View File

@@ -56,6 +56,7 @@ DWORD WINAPI Thread_no_1( LPVOID lpParam )
if (userPtr) if (userPtr)
{ {
status->m_userThreadFunc(userPtr,status->m_lsMemory); status->m_userThreadFunc(userPtr,status->m_lsMemory);
status->m_status = 2;
SetEvent(status->m_eventCompletetHandle); SetEvent(status->m_eventCompletetHandle);
} else } else
{ {
@@ -134,24 +135,17 @@ void Win32ThreadSupport::waitForResponse(unsigned int *puiArgument0, unsigned in
btAssert(m_activeSpuStatus.size()); btAssert(m_activeSpuStatus.size());
int last = -1; int last = -1;
//find an active spu/thread
for (int i=0;i<m_activeSpuStatus.size();i++)
{
if (m_activeSpuStatus[i].m_status)
{
last = i;
break;
}
}
#ifndef SINGLE_THREADED #ifndef SINGLE_THREADED
DWORD res = WaitForMultipleObjects(m_completeHandles.size(), &m_completeHandles[0], FALSE, INFINITE);
btAssert(res != WAIT_FAILED);
last = res - WAIT_OBJECT_0;
btSpuStatus& spuStatus = m_activeSpuStatus[last]; btSpuStatus& spuStatus = m_activeSpuStatus[last];
btAssert(spuStatus.m_threadHandle); btAssert(spuStatus.m_threadHandle);
btAssert(spuStatus.m_eventCompletetHandle); btAssert(spuStatus.m_eventCompletetHandle);
WaitForSingleObject(spuStatus.m_eventCompletetHandle, INFINITE); //WaitForSingleObject(spuStatus.m_eventCompletetHandle, INFINITE);
btAssert(spuStatus.m_status > 1);
spuStatus.m_status = 0; spuStatus.m_status = 0;
///need to find an active spu ///need to find an active spu
@@ -176,6 +170,7 @@ void Win32ThreadSupport::startThreads(Win32ThreadConstructionInfo& threadConstru
{ {
m_activeSpuStatus.resize(threadConstructionInfo.m_numThreads); m_activeSpuStatus.resize(threadConstructionInfo.m_numThreads);
m_completeHandles.resize(threadConstructionInfo.m_numThreads);
for (int i=0;i<threadConstructionInfo.m_numThreads;i++) for (int i=0;i<threadConstructionInfo.m_numThreads;i++)
{ {
@@ -198,9 +193,13 @@ void Win32ThreadSupport::startThreads(Win32ThreadConstructionInfo& threadConstru
sprintf(spuStatus.m_eventCompletetHandleName,"eventComplete%s%d",threadConstructionInfo.m_uniqueName,i); sprintf(spuStatus.m_eventCompletetHandleName,"eventComplete%s%d",threadConstructionInfo.m_uniqueName,i);
spuStatus.m_eventCompletetHandle = CreateEvent(0,false,false,spuStatus.m_eventCompletetHandleName); spuStatus.m_eventCompletetHandle = CreateEvent(0,false,false,spuStatus.m_eventCompletetHandleName);
m_completeHandles[i] = spuStatus.m_eventCompletetHandle;
HANDLE handle = CreateThread(lpThreadAttributes,dwStackSize,lpStartAddress,lpParameter, dwCreationFlags,lpThreadId); HANDLE handle = CreateThread(lpThreadAttributes,dwStackSize,lpStartAddress,lpParameter, dwCreationFlags,lpThreadId);
SetThreadPriority(handle,THREAD_PRIORITY_TIME_CRITICAL); SetThreadPriority(handle,THREAD_PRIORITY_HIGHEST);
//SetThreadPriority(handle,THREAD_PRIORITY_TIME_CRITICAL);
//SetThreadAffinityMask(handle, 1<<i);
spuStatus.m_taskId = i; spuStatus.m_taskId = i;
spuStatus.m_commandId = 0; spuStatus.m_commandId = 0;

View File

@@ -59,7 +59,7 @@ class Win32ThreadSupport : public btThreadSupportInterface
{ {
btAlignedObjectArray<btSpuStatus> m_activeSpuStatus; btAlignedObjectArray<btSpuStatus> m_activeSpuStatus;
btAlignedObjectArray<void*> m_completeHandles;
public: public:
///Setup and initialize SPU/CELL/Libspe2 ///Setup and initialize SPU/CELL/Libspe2