Hi Community
my client found interesting behaviour on OpenThreads under 64bit OpenSuSE
linux. It seam none of the calls like setSchedulePolicy,
setProcessorAffinity and setSechedulePriority of OpenThreads::Thread are
working. After running a code, they all return 0 (success) but after
inspecting the threads in some tools, they show they are not set as
expected.
So I gave it a try on Ubuntu 64bit. On my linux box none werle working -
all returned -1 (failure). Attached is simple code from Rui's book that
ilustrate the problem.
Any help is appreciated ! Also, the OSG version tested is 3.3.1
Nick
/* -*-c++-*- Copyright (C) 2010 Wang Rui <wangray84 at gmail dot com>
* OpenSceneGraph Beginners Guide
* Using a separate thread for supplying data to a node in the main process
*/
#include <osg/Geode>
#include <osgDB/ReadFile>
#include <osgText/Text>
#include <osgViewer/Viewer>
#include <iostream>
class DataReceiverThread : public OpenThreads::Thread
{
public:
DataReceiverThread()
: OpenThreads::Thread()
{
int status = setProcessorAffinity(0);
printf("setProcessorAffinity status: %d\n", status);
}
virtual int cancel()
{
_done = true;
while( isRunning() ) YieldCurrentThread();
return 0;
}
virtual void run()
{
_done = false;
_dirty = true;
do
{
YieldCurrentThread();
char ch;
std::cin.get(ch);
printf("[%c][%d] ", ch, ch);
switch (ch)
{
case 0: break; // We donĄŻt want ĄŽ\0ĄŻ to be added
case 9: _done = true; break; // Tab = 9
default: addToContent(ch); break;
}
} while( !_done );
}
void addToContent( int ch )
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
_content += ch;
_dirty = true;
}
bool getContent( std::string& str )
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
if ( _dirty )
{
str += _content;
_dirty = false;
return true;
}
return false;
}
protected:
OpenThreads::Mutex _mutex;
std::string _content;
bool _done;
bool _dirty;
};
class UpdateTextCallback : public osg::Drawable::UpdateCallback
{
public:
UpdateTextCallback(DataReceiverThread* rcvrthrd) : rcvrthread(rcvrthrd)
{}
virtual void update( osg::NodeVisitor* nv, osg::Drawable* drawable )
{
osgText::Text* text = static_cast<osgText::Text*>( drawable );
if ( text )
{
std::string str("# ");
// if ( DataReceiverThread::instance()->getContent(str) )
if ( rcvrthread->getContent(str) )
text->setText( str );
}
}
DataReceiverThread* rcvrthread;
};
int main( int argc, char** argv )
{
int status;
osg::ref_ptr<osgText::Text> text = new osgText::Text;
text->setFont( "fonts/arial.ttf" );
text->setAxisAlignment( osgText::TextBase::SCREEN );
text->setDataVariance( osg::Object::DYNAMIC );
text->setInitialBound( osg::BoundingBox(osg::Vec3(), osg::Vec3(400.0f, 20.0f, 20.0f)) );
DataReceiverThread* rcvrthread = new DataReceiverThread;
rcvrthread->Init();
text->setUpdateCallback( new UpdateTextCallback(rcvrthread));
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable( text.get() );
geode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
osgViewer::Viewer viewer;
viewer.setSceneData( geode.get() );
viewer.setUpViewInWindow( 50, 50, 640, 480 );
//status = rcvrthread->setProcessorAffinity(0);
//printf("setProcessorAffinity status: %d\n", status);
status = rcvrthread->setSchedulePolicy(OpenThreads::Thread::THREAD_SCHEDULE_ROUND_ROBIN);
printf("setSchedulePolicy status: %d\n", status);
if(!status)
printf("getSchedulePolicy: %d\n",rcvrthread->getSchedulePolicy());
status = rcvrthread->setSchedulePriority(OpenThreads::Thread::THREAD_PRIORITY_HIGH);
printf("setSchedulePriority status: %d\n", status);
if(!status)
printf("getSchedulePriority: %d\n",rcvrthread->getSchedulePriority());
rcvrthread->startThread();
viewer.run();
rcvrthread->cancel();
return 0;
}
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org