<div dir="ltr">Hi,<div><br></div><div>I have come across a problem when performing multi-threaded rendering.</div><div><br></div><div>The application setup is as follows: 4 windows with 4 independent OpenGL contexts, with 4 associated GraphicsWindowEmbedded. There are 4 threads, invoking Viewer->frame().</div>
<div><br></div><div>After some time, 3 out of 4 threads are blocked, using gdb, I get the deadlock locations:</div><div><br></div><div>2 threads are in this:</div><div><br></div><div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#0</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">    </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x90c5a4ee in semaphore_wait_signal_trap</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#1</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x90c61fc5 in pthread_mutex_lock</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#2</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00299ffc in std::_Rb_tree<unsigned int, std::pair<unsigned int const, ContextData>, std::_Select1st<std::pair<unsigned int const, ContextData> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, ContextData> > >::insert_unique</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#3</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00295b18 in osg::GraphicsContext::getCompileContext</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#4</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x0051ed05 in osgViewer::Renderer::cull_draw</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#5</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00297350 in osg::GraphicsContext::runOperations</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#6</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00521d20 in osgViewer::ViewerBase::renderingTraversals</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#7</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00003b91 in -[OSGView drawRect:] at OSGView.mm:367</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#8</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00003d7d in -[OSGView displayFrame:] at OSGView.mm:400</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#9</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00003007 in MEDisplayLinkCallback at OSGView.mm:102</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#10</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">      </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x955a8013 in CVDisplayLink::performIO</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#11</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">      </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x955a863f in CVDisplayLink::runIOThread</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#12</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">      </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x90c8b6f5 in _pthread_start</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#13</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">      </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x90c8b5b2 in thread_start</span></div>
<div><br></div></div><div><br></div><div>Another one in this:</div><div><br></div><div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#0</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">  </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x90c5a4ee in semaphore_wait_signal_trap</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#1</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x90c61fc5 in pthread_mutex_lock</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#2</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00299ffc in std::_Rb_tree<unsigned int, std::pair<unsigned int const, ContextData>, std::_Select1st<std::pair<unsigned int const, ContextData> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, ContextData> > >::insert_unique</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#3</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00295b18 in osg::GraphicsContext::getCompileContext</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#4</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00060060 in osgDB::DatabasePager::requiresExternalCompileGLObjects</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#5</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x0051ef88 in osgViewer::Renderer::cull_draw</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#6</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00297350 in osg::GraphicsContext::runOperations</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#7</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00521d20 in osgViewer::ViewerBase::renderingTraversals</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#8</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00003b91 in -[OSGView drawRect:] at OSGView.mm:367</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#9</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">       </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00003d7d in -[OSGView displayFrame:] at OSGView.mm:400</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#10</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">      </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x00003007 in MEDisplayLinkCallback at OSGView.mm:102</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#11</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">      </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x955a8013 in CVDisplayLink::performIO</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#12</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">      </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x955a863f in CVDisplayLink::runIOThread</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#13</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">      </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x90c8b6f5 in _pthread_start</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">#14</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="font-family: 'courier new', monospace;">      </span></span><span class="Apple-style-span" style="font-family: 'courier new', monospace;">0x90c8b5b2 in thread_start</span></div>
<div><br></div><div>Seems to be in there:</div><div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">GraphicsContext* GraphicsContext::getCompileContext(unsigned int contextID)</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">{</span></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">    // osg::notify(osg::NOTICE)<<"GraphicsContext::getCompileContext "<<contextID<<std::endl;</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(s_contextIDMapMutex);</span></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">    ContextIDMap::iterator itr = s_contextIDMap.find(contextID);</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">    if (itr != s_contextIDMap.end()) return itr->second._compileContext.get();</span></div><div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">    else return 0;</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new', monospace;">}</span></div></div><div><br></div><div><br></div><div>I did not configure any thread specific flags in OSG (perhaps I should have done that?), I am not familiar with how OSG handles threading.</div>
<div>I also cannot instrument OSG to debug this as I am using precompiled binaries (OSX frameworks), OSG 2.2.0-10.5SDK.</div><div><br></div><div>I can workaround this by making all rendering mutually exclusive, but this is obviously not what I want.</div>
<div><br></div><div>Any advice would be greatly appreciated. Thanks,</div><div><br></div><div>Raphael</div><div><br></div><div><br></div></div></div>