From 703767c6f3b63e55bc9835b7f3f3041cc65a4242 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Mon, 14 May 2018 07:34:49 -0700 Subject: [PATCH 1/3] BulletInverseDynamics: Fix propagation of user_int and user_ptr when creating MultiBodyTree. The user_ptr and user_int arguments passed to addBody were stored in the cache, but not propagated to the MultiBodyTree when finalizing it. Thanks to Thomas Buschmann for the fix. --- src/BulletInverseDynamics/MultiBodyTree.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/BulletInverseDynamics/MultiBodyTree.cpp b/src/BulletInverseDynamics/MultiBodyTree.cpp index c67588d49..0f6668fdb 100644 --- a/src/BulletInverseDynamics/MultiBodyTree.cpp +++ b/src/BulletInverseDynamics/MultiBodyTree.cpp @@ -331,6 +331,22 @@ int MultiBodyTree::finalize() { rigid_body.m_parent_pos_parent_body_ref = joint.m_parent_pos_parent_child_ref; rigid_body.m_joint_type = joint.m_type; + int user_int; + if (-1 == m_init_cache->getUserInt(index, &user_int)) { + return -1; + } + if (-1 == m_impl->setUserInt(index, user_int)) { + return -1; + } + + void* user_ptr; + if (-1 == m_init_cache->getUserPtr(index, &user_ptr)) { + return -1; + } + if (-1 == m_impl->setUserPtr(index, user_ptr)) { + return -1; + } + // Set joint Jacobians. Note that the dimension is always 3x1 here to avoid variable sized // matrices. switch (rigid_body.m_joint_type) { From d17d496f9734497ca72b8071361d41884fff69c1 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Tue, 15 May 2018 13:24:28 -0700 Subject: [PATCH 2/3] fix potential asan/tsan issue --- examples/SharedMemory/PhysicsServerExample.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/examples/SharedMemory/PhysicsServerExample.cpp b/examples/SharedMemory/PhysicsServerExample.cpp index 6b6597c7d..03a085a34 100644 --- a/examples/SharedMemory/PhysicsServerExample.cpp +++ b/examples/SharedMemory/PhysicsServerExample.cpp @@ -201,7 +201,8 @@ struct MotionArgs { m_vrControllerEvents[i].m_buttons[b]=0; } - + m_vrControllerPos[i].setValue(0,0,0); + m_vrControllerOrn[i].setValue(0,0,0,1); m_isVrControllerPicking[i] = false; m_isVrControllerDragging[i] = false; m_isVrControllerReleasing[i] = false; @@ -1747,6 +1748,8 @@ void PhysicsServerExample::initPhysics() m_threadSupport = createMotionThreadSupport(MAX_MOTION_NUM_THREADS); + m_isConnected = m_physicsServer.connectSharedMemory( m_guiHelper); + for (int i=0;igetNumTasks();i++) { @@ -1765,18 +1768,25 @@ void PhysicsServerExample::initPhysics() m_args[w].m_cs2 = m_threadSupport->createCriticalSection(); m_args[w].m_cs3 = m_threadSupport->createCriticalSection(); m_args[w].m_csGUI = m_threadSupport->createCriticalSection(); - + m_args[w].m_cs->lock(); m_args[w].m_cs->setSharedParam(0,eMotionIsUnInitialized); + m_args[w].m_cs->unlock(); int numMoving = 0; m_args[w].m_positions.resize(numMoving); m_args[w].m_physicsServerPtr = &m_physicsServer; //int index = 0; m_threadSupport->runTask(B3_THREAD_SCHEDULE_TASK, (void*) &this->m_args[w], w); + bool isUninitialized = true; - while (m_args[w].m_cs->getSharedParam(0)==eMotionIsUnInitialized) + while (isUninitialized) { + m_args[w].m_cs->lock(); + isUninitialized = (m_args[w].m_cs->getSharedParam(0)==eMotionIsUnInitialized); + m_args[w].m_cs->unlock(); +#ifdef _WIN32 b3Clock::usleep(1000); +#endif } } @@ -1789,8 +1799,6 @@ void PhysicsServerExample::initPhysics() m_args[0].m_cs2->lock(); - m_isConnected = m_physicsServer.connectSharedMemory( m_guiHelper); - { From 28b86ba0a4bf7cf68f51889b2a74ba0463b57da4 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Wed, 16 May 2018 08:32:21 -0700 Subject: [PATCH 3/3] fix some tsan issues (thread sanitizer) --- examples/MultiThreading/b3PosixThreadSupport.cpp | 3 ++- examples/SharedMemory/PhysicsServerExample.cpp | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/examples/MultiThreading/b3PosixThreadSupport.cpp b/examples/MultiThreading/b3PosixThreadSupport.cpp index dfec90df6..cd5117182 100644 --- a/examples/MultiThreading/b3PosixThreadSupport.cpp +++ b/examples/MultiThreading/b3PosixThreadSupport.cpp @@ -268,7 +268,8 @@ void b3PosixThreadSupport::stopThreads() for(size_t t=0; t < size_t(m_activeThreadStatus.size()); ++t) { b3ThreadStatus& spuStatus = m_activeThreadStatus[t]; - printf("%s: Thread %i used: %ld\n", __FUNCTION__, int(t), spuStatus.threadUsed); + + // printf("%s: Thread %i used: %ld\n", __FUNCTION__, int(t), spuStatus.threadUsed); spuStatus.m_userPtr = 0; checkPThreadFunction(sem_post(spuStatus.startSemaphore)); diff --git a/examples/SharedMemory/PhysicsServerExample.cpp b/examples/SharedMemory/PhysicsServerExample.cpp index 03a085a34..f4bfbe967 100644 --- a/examples/SharedMemory/PhysicsServerExample.cpp +++ b/examples/SharedMemory/PhysicsServerExample.cpp @@ -260,6 +260,8 @@ void MotionThreadFunc(void* userPtr,void* lsMemory) if (init) { + unsigned int cachedSharedParam = eMotionIsInitialized; + args->m_cs->lock(); args->m_cs->setSharedParam(0,eMotionIsInitialized); args->m_cs->unlock(); @@ -269,6 +271,8 @@ void MotionThreadFunc(void* userPtr,void* lsMemory) int numCmdSinceSleep1ms = 0; unsigned long long int prevTime = clock.getTimeMicroseconds(); + + do { { @@ -468,7 +472,11 @@ void MotionThreadFunc(void* userPtr,void* lsMemory) numCmdSinceSleep1ms++; } - } while (args->m_cs->getSharedParam(0)!=eRequestTerminateMotion); + args->m_cs->lock(); + cachedSharedParam = args->m_cs->getSharedParam(0); + args->m_cs->unlock(); + + } while (cachedSharedParam!=eRequestTerminateMotion); } else { args->m_cs->lock(); @@ -1749,7 +1757,7 @@ void PhysicsServerExample::initPhysics() m_isConnected = m_physicsServer.connectSharedMemory( m_guiHelper); - + for (int i=0;igetNumTasks();i++) {