From 045410a368aa0b037fa373c9b371ded024b8bc87 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Tue, 1 Feb 2000 14:15:54 +0000 Subject: [PATCH] another attemp at implementing priorities --- src/libCom/osi/os/posix/osdSem.c | 6 +-- src/libCom/osi/os/posix/osdThread.c | 64 +++++++++++++++++++---------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/libCom/osi/os/posix/osdSem.c b/src/libCom/osi/os/posix/osdSem.c index c633da711..34299ec39 100644 --- a/src/libCom/osi/os/posix/osdSem.c +++ b/src/libCom/osi/os/posix/osdSem.c @@ -52,15 +52,15 @@ semBinaryId semBinaryCreate(int initialState) strerror(status)); cantProceed("semBinaryCreate"); } +#if defined _POSIX_THREAD_PRIO_PROTECT status = pthread_mutexattr_setprotocol( &pbinary->attr,PTHREAD_PROCESS_PRIVATE); -/* For now dont report failure if(status) { errlogPrintf("semBinaryCreate pthread_mutexattr_setprotocal " "failed: error %s\n", strerror(status)); } -*/ +#endif status = pthread_mutex_init(&pbinary->mutex,&pbinary->attr); if(status) { errlogPrintf("pthread_mutex_init failed: error %s\n", @@ -156,7 +156,7 @@ semMutexId semMutexCreate(void) { strerror(status)); cantProceed("semMutexCreate"); } -#ifdef PTHREAD_PRIO_INHERIT +#ifdef _POSIX_THREAD_PRIO_INHERIT status = pthread_mutexattr_setprotocol(&pmutex->attr,PTHREAD_PRIO_INHERIT); if(status) { errlogPrintf("pthread_mutexattr_setprotocal failed: error %s\n", diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index 094fb598f..785722442 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -18,6 +18,7 @@ of this distribution. #include #include #include +#include #include "osiThread.h" #include "osiSem.h" @@ -55,37 +56,48 @@ static void once(void) pcommonAttr = callocMustSucceed(1,sizeof(commonAttr),"osdThread:once"); status = pthread_attr_init(&pcommonAttr->attr); if(status) { - errlogPrintf("pthread_attr_init failed: error %s\n",strerror(status)); + printf("pthread_attr_init failed: error %s\n",strerror(status)); cantProceed("threadCreate::once"); } status = pthread_attr_setdetachstate( &pcommonAttr->attr, PTHREAD_CREATE_DETACHED); if(status) { - errlogPrintf("pthread_attr_setdetachstate1 failed: error %s\n", + printf("pthread_attr_setdetachstate1 failed: error %s\n", strerror(status)); } status = pthread_attr_setscope(&pcommonAttr->attr,PTHREAD_SCOPE_PROCESS); if(status) { - errlogPrintf("pthread_attr_setscope failed: error %s\n", + printf("pthread_attr_setscope failed: error %s\n", + strerror(status)); + } +#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) && !defined (SOLARIS) + status = pthread_attr_getschedpolicy( + &pcommonAttr->attr,&pcommonAttr->schedPolicy); + if(status) { + printf("pthread_attr_getschedparam failed %s\n", strerror(status)); } status = pthread_attr_getschedparam( &pcommonAttr->attr,&pcommonAttr->schedParam); if(status) { - errlogPrintf("pthread_attr_getschedparam failed %s\n", - strerror(status)); - } - status = pthread_attr_getschedpolicy( - &pcommonAttr->attr,&pcommonAttr->schedPolicy); - if(status) { - errlogPrintf("pthread_attr_getschedparam failed %s\n", + printf("pthread_attr_getschedparam failed %s\n", strerror(status)); } pcommonAttr->maxPriority = sched_get_priority_max(pcommonAttr->schedPolicy); + if(pcommonAttr->maxPriority == -1) { + pcommonAttr->maxPriority = pcommonAttr->schedParam.sched_priority; + printf("sched_get_priority_max failed set to %d\n", + pcommonAttr->maxPriority); + } pcommonAttr->minPriority = sched_get_priority_min(pcommonAttr->schedPolicy); -printf("schedPolicy %d maxPriority %d minPriority %d\n", -pcommonAttr->schedPolicy, -pcommonAttr->maxPriority,pcommonAttr->minPriority); + if(pcommonAttr->minPriority == -1) { + pcommonAttr->minPriority = pcommonAttr->schedParam.sched_priority; + printf("sched_get_priority_min failed set to %d\n", + pcommonAttr->maxPriority); + } +#else + printf("task priorities are not implemented\n"); +#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ } static void * start_routine(void *arg) @@ -109,9 +121,6 @@ static int getOssPriorityValue(threadInfo *pthreadInfo) minPriority = (double)pcommonAttr->minPriority; slope = (maxPriority - minPriority)/100.0; oss = (double)pthreadInfo->osiPriority * slope + minPriority; -printf("osiPriority %d osdPriority %f %d\n", -pthreadInfo->osiPriority,oss,(int)oss); -oss = pthreadInfo->osiPriority; return((int)oss); } @@ -168,41 +177,49 @@ threadId threadCreate(const char *name, errlogPrintf("pthread_attr_setdetachstate1 failed: error %s\n", strerror(status)); } +#if defined (_POSIX_THREAD_ATTR_STACKSIZE) status = pthread_attr_setstacksize( &pthreadInfo->attr, (size_t)stackSize); if(status) { errlogPrintf("pthread_attr_setstacksize failed: error %s\n", strerror(status)); } +#endif status = pthread_attr_setscope(&pthreadInfo->attr,PTHREAD_SCOPE_PROCESS); if(status) { errlogPrintf("pthread_attr_setscope failed: error %s\n", strerror(status)); } pthreadInfo->osiPriority = priority; +#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) && !defined (SOLARIS) status = pthread_attr_getschedparam( &pthreadInfo->attr,&pthreadInfo->schedParam); if(status) { - errlogPrintf("threadCreate: pthread_attr_getschedparam failed %s\n", + errlogPrintf("pthread_attr_getschedparam failed %s\n", strerror(status)); } -printf("sched_priority %d\n",pthreadInfo->schedParam.sched_priority); pthreadInfo->schedParam.sched_priority = getOssPriorityValue(pthreadInfo); -pthreadInfo->schedParam.sched_priority = 10; status = pthread_attr_setschedparam( &pthreadInfo->attr,&pthreadInfo->schedParam); if(status) { - errlogPrintf("threadCreate: pthread_attr_setschedparam failed %s\n", + errlogPrintf("threadCreate: pthread_attr_setschedparam failed %s", + strerror(status)); + errlogPrintf(" sched_priority %d\n", + pthreadInfo->schedParam.sched_priority); + } + status = pthread_attr_setinheritsched( + &pthreadInfo->attr,PTHREAD_EXPLICIT_SCHED); + if(status) { + errlogPrintf("threadCreate: pthread_attr_setinheritsched failed %s\n", strerror(status)); } +#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ pthreadInfo->suspendSem = semBinaryMustCreate(semFull); status = pthread_create(&pthreadInfo->tid, &pthreadInfo->attr,start_routine,pthreadInfo); if(status) { errlogPrintf("pthread_create failed: error %s\n",strerror(status)); -/* cantProceed("threadCreate"); -*/ } return((threadId)pthreadInfo); } @@ -228,12 +245,14 @@ unsigned int threadGetPriority(threadId id) return(pthreadInfo->osiPriority); } + void threadSetPriority(threadId id,unsigned int priority) { threadInfo *pthreadInfo = (threadInfo *)id; int status; pthreadInfo->osiPriority = priority; +#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) && !defined (SOLARIS) pthreadInfo->schedParam.sched_priority = getOssPriorityValue(pthreadInfo); status = pthread_attr_setschedparam( &pthreadInfo->attr,&pthreadInfo->schedParam); @@ -247,6 +266,7 @@ void threadSetPriority(threadId id,unsigned int priority) errlogPrintf("threadSetPriority: pthread_setschedparam failed %s\n", strerror(status)); } +#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ } int threadIsEqual(threadId id1, threadId id2)