diff --git a/CMakeLists.txt b/CMakeLists.txt index a8838cebc..9cd0b9183 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,8 +12,11 @@ IF (NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE "Release") ENDIF (NOT CMAKE_BUILD_TYPE) +SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG") - +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG=3") +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG=4") +MESSAGE("CMAKE_CXX_FLAGS_DEBUG="+${CMAKE_CXX_FLAGS_DEBUG}) OPTION(USE_DOUBLE_PRECISION "Use double precision" OFF) OPTION(USE_GRAPHICAL_BENCHMARK "Use Graphical Benchmark" ON) OPTION(USE_MULTITHREADED_BENCHMARK "Use Multithreaded Benchmark" OFF) diff --git a/Demos/ThreadingDemo/main.cpp b/Demos/ThreadingDemo/main.cpp index 90ccb908a..e5168a76c 100644 --- a/Demos/ThreadingDemo/main.cpp +++ b/Demos/ThreadingDemo/main.cpp @@ -67,6 +67,8 @@ struct SampleThreadLocalStorage void SampleThreadFunc(void* userPtr,void* lsMemory) { + printf("thread started\n"); + SampleThreadLocalStorage* localStorage = (SampleThreadLocalStorage*) lsMemory; SampleArgs* args = (SampleArgs*) userPtr; @@ -138,10 +140,11 @@ int main(int argc,char** argv) for (i=0;iwaitForResponse(&arg0,&arg1); + printf("finished waiting for response: %d %d\n", arg0,arg1); } } else { -#if 0 +#if _WIN32 int numActiveThreads = numThreads; while (numActiveThreads) { @@ -155,10 +158,15 @@ int main(int argc,char** argv) printf("polling\n"); } }; +#else + btAssert(0); + printf("non-blocking wait is not supported on this platform\n"); + exit(0); #endif } - threadSupport->stopSPU(); +printf("stopping threads\n"); + delete threadSupport; printf("Press ENTER to quit\n"); getchar(); diff --git a/src/BulletMultiThreaded/PosixThreadSupport.cpp b/src/BulletMultiThreaded/PosixThreadSupport.cpp index b41bac6a8..5fc73c85e 100644 --- a/src/BulletMultiThreaded/PosixThreadSupport.cpp +++ b/src/BulletMultiThreaded/PosixThreadSupport.cpp @@ -48,7 +48,7 @@ PosixThreadSupport::~PosixThreadSupport() #endif // this semaphore will signal, if and how many threads are finished with their work -static sem_t* mainSemaphore; +static sem_t* mainSemaphore=0; static sem_t* createSem(const char* baseName) { @@ -58,9 +58,10 @@ static sem_t* createSem(const char* baseName) char name[32]; snprintf(name, 32, "/%s-%d-%4.4d", baseName, getpid(), semCount++); sem_t* tempSem = sem_open(name, O_CREAT, 0600, 0); + if (tempSem != reinterpret_cast(SEM_FAILED)) { - //printf("Created \"%s\" Semaphore %x\n", name, tempSem); +// printf("Created \"%s\" Semaphore %p\n", name, tempSem); } else { @@ -199,7 +200,8 @@ void PosixThreadSupport::startThreads(ThreadConstructionInfo& threadConstruction m_activeSpuStatus.resize(threadConstructionInfo.m_numThreads); mainSemaphore = createSem("main"); - + //checkPThreadFunction(sem_wait(mainSemaphore)); + for (int i=0;i < threadConstructionInfo.m_numThreads;i++) { printf("starting thread %d\n",i); @@ -233,15 +235,23 @@ void PosixThreadSupport::startSPU() ///tell the task scheduler we are done with the SPU tasks void PosixThreadSupport::stopSPU() { - for(size_t t=0; t < size_t(m_activeSpuStatus.size()); ++t) { + for(size_t t=0; t < size_t(m_activeSpuStatus.size()); ++t) + { btSpuStatus& spuStatus = m_activeSpuStatus[t]; printf("%s: Thread %i used: %ld\n", __FUNCTION__, int(t), spuStatus.threadUsed); - - destroySem(spuStatus.startSemaphore); - checkPThreadFunction(pthread_cancel(spuStatus.thread)); - } - destroySem(mainSemaphore); + spuStatus.m_userPtr = 0; + checkPThreadFunction(sem_post(spuStatus.startSemaphore)); + checkPThreadFunction(sem_wait(mainSemaphore)); + + printf("destroy semaphore\n"); + destroySem(spuStatus.startSemaphore); + printf("semaphore destroyed\n"); + checkPThreadFunction(pthread_cancel(spuStatus.thread)); + } + printf("destroy main semaphore\n"); + destroySem(mainSemaphore); + printf("main semaphore destroyed\n"); m_activeSpuStatus.clear(); }