[osg-users] OpenThreads, scheduling, etc ... policies

Robert Osfield robert.osfield at gmail.com
Mon May 4 07:43:01 PDT 2015


Hi Curtis,

There has to be a historical reason for need for the #ifndef __linux__
around the thread scheduling assignment.  As I'm not the author of
this block of code I can only check the code and svn log's.  I'm
currently working on a complex bug fix on another area of the OSG so
can't dive into a new area of code right now.

Given there has to be a reason for the special handling under Linux we
can't just remove the block and hope for the best.  It may be possible
to specialize the #ifndef to allow certain combinations for linux to
work, but we'd need to track down which combinations we might expect
to work and which ones might not so we can determine the right type of
checks to apply.  This is why the history is important.  I'm guessing
there older versions of Linux didn't fully implement pthreads/pthread
extensions.  I have to defer to others in this department though, as I
don't have experience with all variants of pthreads on linux though
time.

Robert.

On 4 May 2015 at 15:26, Curtis Rubel <crubel at compro.net> wrote:
> Robert,
>
> When I mentioned crippled, I did not mean that as a bad or derogatory
> comment.  Maybe saying something like intentionally disabled would have
> been a better choice of words, my apologies if my wording offended anyone in any way.
>
> Basic threading is working fine under Linux.  If the user however wants to
> take advantage of all of the available threading policies and priorities now available to them they cannot.  I think that this is just possibly just due to this section of Openthreads not being updated when these features were fully implemented and properly working on the linux platform.
>
> Here is a code excerpt of the SetThreadSchedulingParams
> function call within OpenThreads/phhreads/PThread.cpp
>
>
> Code:
>
>     //--------------------------------------------------------------------------
>     // Set thread scheduling parameters.  Unfortunately on Linux, there's no
>     // good way to set this, as pthread_setschedparam is mostly a no-op.
>     //
>     static int SetThreadSchedulingParams(Thread *thread)
>     {
>
>         int status = 0;
>
> #ifdef ALLOW_PRIORITY_SCHEDULING // [
>
>         if(sysconf(_POSIX_THREAD_PRIORITY_SCHEDULING))
>         {
>
>             int th_policy;
>             int max_priority, nominal_priority, min_priority;
>             sched_param th_param;
>             pthread_getschedparam(thread->getProcessId(),
>                       &th_policy, &th_param);
>
> #ifndef __linux__
>
>             switch(thread->getSchedulePolicy())
>             {
>
>                 case Thread::THREAD_SCHEDULE_FIFO:
>                 th_policy = SCHED_FIFO;
>                 break;
>
>                 case Thread::THREAD_SCHEDULE_ROUND_ROBIN:
>                 th_policy = SCHED_RR;
>                 break;
>
>                 case Thread::THREAD_SCHEDULE_TIME_SHARE:
>                 th_policy = SCHED_OTHER;
>                 break;
>
>                 default:
> #ifdef __sgi
>                 th_policy = SCHED_RR;
> #else
>                 th_policy = SCHED_FIFO;
> #endif
>                 break;
>             };
>
> #else
>             th_policy = SCHED_OTHER;  // Must protect linux from realtime.
> #endif
>
> #ifdef __linux__
>
>             max_priority = 0;
>             min_priority = 20;
>             nominal_priority = (max_priority + min_priority)/2;
>
> #else
>
>             max_priority = sched_get_priority_max(th_policy);
>             min_priority = sched_get_priority_min(th_policy);
>             nominal_priority = (max_priority + min_priority)/2;
>
> #endif
>
>             switch(thread->getSchedulePriority())
>             {
>
>                 case Thread::THREAD_PRIORITY_MAX:
>                     th_param.sched_priority = max_priority;
>                     break;
>
>                 case Thread::THREAD_PRIORITY_HIGH:
>                     th_param.sched_priority = (max_priority + nominal_priority)/2;
>                     break;
>
>                 case Thread::THREAD_PRIORITY_NOMINAL:
>                     th_param.sched_priority = nominal_priority;
>                     break;
>
>                 case Thread::THREAD_PRIORITY_LOW:
>                     th_param.sched_priority = (min_priority + nominal_priority)/2;
>                     break;
>
>                 case Thread::THREAD_PRIORITY_MIN:
>                     th_param.sched_priority = min_priority;
>                     break;
>
>                 default:
>                     th_param.sched_priority = max_priority;
>                     break;
>
>             }
>
>             status = pthread_setschedparam(thread->getProcessId(),
>                            th_policy,
>                            &th_param);
>
>
>             if(getenv("OUTPUT_THREADLIB_SCHEDULING_INFO") != 0)
>             PrintThreadSchedulingInfo(thread);
>
>         }
>
> #endif // ] ALLOW_PRIORITY_SCHEDULING
>
>     return status;
>     };
>
>
>
>
>
> You can see in this excerpt that on Linux platforms the code to allow you to select any of the available threading policies is allowed on all platforms but linux.  Linux is hard-coded to set the SCHED_OTHER policy.
>
> The other sections of the code excerpt limit the range of priorities allowed to between 0 and 20, when linux currently has a range of 0 - 99, 99 being the highest priority allowed.  The associated calls to sched_get_priority_max and sched_get_priority_min are not allowed on the linux platform.
>
> I will be happy to provide you with a sample application if you still would like to have one, but I think the ifndef's in the code will let you see what I am referring too.
>
> Again I apologize if I offended anyone, that was not my intention.
>
> ...
>
> Thank you!
>
> Cheers,
> Curtis
> Code:
>
>
>
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=63627#63627
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org



More information about the osg-users mailing list