From 047bdc9200fc63264f8b9a39f2ffa2f0031e816b Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Tue, 18 Sep 2012 13:43:02 +0200 Subject: [PATCH 1/2] libCom/osi: (posix) keep scheduling policy by thread, to support SCHED_RR --- src/libCom/osi/os/Linux/osdThread.h | 1 + src/libCom/osi/os/posix/osdThread.c | 3 ++- src/libCom/osi/os/posix/osdThread.h | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libCom/osi/os/Linux/osdThread.h b/src/libCom/osi/os/Linux/osdThread.h index 859749837..5cc26d722 100644 --- a/src/libCom/osi/os/Linux/osdThread.h +++ b/src/libCom/osi/os/Linux/osdThread.h @@ -26,6 +26,7 @@ typedef struct epicsThreadOSD { pid_t lwpId; pthread_attr_t attr; struct sched_param schedParam; + int schedPolicy; EPICSTHREADFUNC createFunc; void *createArg; epicsEventId suspendEvent; diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index 92bc572f0..ba5a1269c 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -129,6 +129,7 @@ static void setSchedulingPolicy(epicsThreadOSD *pthreadInfo,int policy) &pthreadInfo->attr,&pthreadInfo->schedParam); checkStatusOnce(status,"pthread_attr_getschedparam"); pthreadInfo->schedParam.sched_priority = getOssPriorityValue(pthreadInfo); + pthreadInfo->schedPolicy = policy; status = pthread_attr_setschedpolicy( &pthreadInfo->attr,policy); checkStatusOnce(status,"pthread_attr_setschedpolicy"); @@ -615,7 +616,7 @@ epicsShareFunc void epicsShareAPI epicsThreadSetPriority(epicsThreadId pthreadIn &pthreadInfo->attr,&pthreadInfo->schedParam); if(errVerbose) checkStatus(status,"pthread_attr_setschedparam"); status = pthread_setschedparam( - pthreadInfo->tid,pcommonAttr->schedPolicy,&pthreadInfo->schedParam); + pthreadInfo->tid, pthreadInfo->schedPolicy, &pthreadInfo->schedParam); if(errVerbose) checkStatus(status,"pthread_setschedparam"); #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ } diff --git a/src/libCom/osi/os/posix/osdThread.h b/src/libCom/osi/os/posix/osdThread.h index 8da859e94..7807fda6e 100644 --- a/src/libCom/osi/os/posix/osdThread.h +++ b/src/libCom/osi/os/posix/osdThread.h @@ -25,6 +25,7 @@ typedef struct epicsThreadOSD { pthread_t tid; pthread_attr_t attr; struct sched_param schedParam; + int schedPolicy; EPICSTHREADFUNC createFunc; void *createArg; epicsEventId suspendEvent; From ca441a2a0e04e852ef202d2e68820da1fd67223d Mon Sep 17 00:00:00 2001 From: Ralph Lange Date: Thu, 20 Sep 2012 21:55:32 +0200 Subject: [PATCH 2/2] libCom/osi: (posix) make getOssPriorityValue() public as epicsThreadGetPosixPriority() --- src/libCom/osi/os/Linux/osdThread.h | 1 + src/libCom/osi/os/posix/osdThread.c | 13 ++++++++----- src/libCom/osi/os/posix/osdThread.h | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/libCom/osi/os/Linux/osdThread.h b/src/libCom/osi/os/Linux/osdThread.h index 5cc26d722..7d2a4868d 100644 --- a/src/libCom/osi/os/Linux/osdThread.h +++ b/src/libCom/osi/os/Linux/osdThread.h @@ -39,6 +39,7 @@ typedef struct epicsThreadOSD { } epicsThreadOSD; epicsShareFunc pthread_t epicsThreadGetPosixThreadId(epicsThreadId id); +epicsShareFunc int epicsThreadGetPosixPriority(epicsThreadId id); #ifdef __cplusplus } diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index ba5a1269c..523877b99 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -106,9 +106,9 @@ if(status) { \ } -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) -static int getOssPriorityValue(epicsThreadOSD *pthreadInfo) +epicsShareFunc int epicsThreadGetPosixPriority(epicsThreadId pthreadInfo) { +#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) double maxPriority,minPriority,slope,oss; if(pcommonAttr->maxPriority==pcommonAttr->minPriority) @@ -118,8 +118,11 @@ static int getOssPriorityValue(epicsThreadOSD *pthreadInfo) slope = (maxPriority - minPriority)/100.0; oss = (double)pthreadInfo->osiPriority * slope + minPriority; return((int)oss); -} +#else + return 0; #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ +} + static void setSchedulingPolicy(epicsThreadOSD *pthreadInfo,int policy) { #if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) @@ -128,7 +131,7 @@ static void setSchedulingPolicy(epicsThreadOSD *pthreadInfo,int policy) status = pthread_attr_getschedparam( &pthreadInfo->attr,&pthreadInfo->schedParam); checkStatusOnce(status,"pthread_attr_getschedparam"); - pthreadInfo->schedParam.sched_priority = getOssPriorityValue(pthreadInfo); + pthreadInfo->schedParam.sched_priority = epicsThreadGetPosixPriority(pthreadInfo); pthreadInfo->schedPolicy = policy; status = pthread_attr_setschedpolicy( &pthreadInfo->attr,policy); @@ -611,7 +614,7 @@ epicsShareFunc void epicsShareAPI epicsThreadSetPriority(epicsThreadId pthreadIn pthreadInfo->osiPriority = priority; if(!pthreadInfo->isRealTimeScheduled) return; #if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) - pthreadInfo->schedParam.sched_priority = getOssPriorityValue(pthreadInfo); + pthreadInfo->schedParam.sched_priority = epicsThreadGetPosixPriority(pthreadInfo); status = pthread_attr_setschedparam( &pthreadInfo->attr,&pthreadInfo->schedParam); if(errVerbose) checkStatus(status,"pthread_attr_setschedparam"); diff --git a/src/libCom/osi/os/posix/osdThread.h b/src/libCom/osi/os/posix/osdThread.h index 7807fda6e..3a80b537c 100644 --- a/src/libCom/osi/os/posix/osdThread.h +++ b/src/libCom/osi/os/posix/osdThread.h @@ -38,6 +38,7 @@ typedef struct epicsThreadOSD { } epicsThreadOSD; epicsShareFunc pthread_t epicsThreadGetPosixThreadId(epicsThreadId id); +epicsShareFunc int epicsThreadGetPosixPriority(epicsThreadId id); #ifdef __cplusplus }