diff --git a/src/libCom/osi/os/posix/osdEvent.c b/src/libCom/osi/os/posix/osdEvent.c index cfd80aa67..f133ed028 100644 --- a/src/libCom/osi/os/posix/osdEvent.c +++ b/src/libCom/osi/os/posix/osdEvent.c @@ -24,10 +24,6 @@ #include "epicsTime.h" #include "errlog.h" -/* Until these can be demonstrated to work leave them undefined*/ -#undef _POSIX_THREAD_PROCESS_SHARED -#undef _POSIX_THREAD_PRIO_INHERIT - struct epicsEventOSD { pthread_mutex_t mutex; pthread_cond_t cond; diff --git a/src/libCom/osi/os/posix/osdMutex.c b/src/libCom/osi/os/posix/osdMutex.c index 7ad6c56ef..f569916a5 100644 --- a/src/libCom/osi/os/posix/osdMutex.c +++ b/src/libCom/osi/os/posix/osdMutex.c @@ -80,7 +80,7 @@ epicsMutexOSD * epicsMutexOsdCreate(void) { if (status) goto fail; -#if defined _POSIX_THREAD_PRIO_INHERIT +#if defined(_POSIX_THREAD_PRIO_INHERIT) && _POSIX_THREAD_PRIO_INHERIT > 0 status = pthread_mutexattr_setprotocol(&pmutex->mutexAttr, PTHREAD_PRIO_INHERIT); if (errVerbose) checkStatus(status, "pthread_mutexattr_setprotocal"); @@ -161,7 +161,7 @@ typedef struct epicsMutexOSD { pthread_mutex_t lock; pthread_mutexattr_t mutexAttr; pthread_cond_t waitToBeOwner; -#if defined _POSIX_THREAD_PROCESS_SHARED +#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED > 0 pthread_condattr_t condAttr; #endif /*_POSIX_THREAD_PROCESS_SHARED*/ int count; @@ -181,7 +181,7 @@ epicsMutexOSD * epicsMutexOsdCreate(void) { if(status) goto fail; -#if defined _POSIX_THREAD_PRIO_INHERIT +#if defined(_POSIX_THREAD_PRIO_INHERIT) && _POSIX_THREAD_PRIO_INHERIT > 0 status = pthread_mutexattr_setprotocol( &pmutex->mutexAttr,PTHREAD_PRIO_INHERIT); if (errVerbose) checkStatus(status, "pthread_mutexattr_setprotocal"); @@ -191,7 +191,7 @@ epicsMutexOSD * epicsMutexOsdCreate(void) { if(status) goto dattr; -#if defined _POSIX_THREAD_PROCESS_SHARED +#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED > 0 status = pthread_condattr_init(&pmutex->condAttr); checkStatus(status, "pthread_condattr_init"); status = pthread_condattr_setpshared(&pmutex->condAttr, @@ -221,7 +221,7 @@ void epicsMutexOsdDestroy(struct epicsMutexOSD * pmutex) status = pthread_cond_destroy(&pmutex->waitToBeOwner); checkStatus(status, "pthread_cond_destroy"); -#if defined _POSIX_THREAD_PROCESS_SHARED +#if defined(_POSIX_THREAD_PROCESS_SHARED) && _POSIX_THREAD_PROCESS_SHARED > 0 status = pthread_condattr_destroy(&pmutex->condAttr); #endif /*_POSIX_THREAD_PROCESS_SHARED*/ status = pthread_mutex_destroy(&pmutex->lock); diff --git a/src/libCom/osi/os/posix/osdProcess.c b/src/libCom/osi/os/posix/osdProcess.c index 33f9f7892..847caa4ad 100644 --- a/src/libCom/osi/os/posix/osdProcess.c +++ b/src/libCom/osi/os/posix/osdProcess.c @@ -96,7 +96,7 @@ epicsShareFunc osiSpawnDetachedProcessReturn epicsShareAPI osiSpawnDetachedProce } } -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 /* * Drop real-time SCHED_FIFO priority */ diff --git a/src/libCom/osi/os/posix/osdSpin.c b/src/libCom/osi/os/posix/osdSpin.c index ee578c41a..aa61a6c90 100644 --- a/src/libCom/osi/os/posix/osdSpin.c +++ b/src/libCom/osi/os/posix/osdSpin.c @@ -27,7 +27,7 @@ * preemption can't be disabled. */ #if defined(DONT_USE_POSIX_THREAD_PRIORITY_SCHEDULING) -#if defined(_POSIX_SPIN_LOCKS) && (_POSIX_SPIN_LOCKS > 1) +#if defined(_POSIX_SPIN_LOCKS) && (_POSIX_SPIN_LOCKS > 0) # define USE_PSPIN #endif #endif diff --git a/src/libCom/osi/os/posix/osdThread.c b/src/libCom/osi/os/posix/osdThread.c index f9bea4b7d..613c3456c 100644 --- a/src/libCom/osi/os/posix/osdThread.c +++ b/src/libCom/osi/os/posix/osdThread.c @@ -23,6 +23,10 @@ #include #include +#if defined(_POSIX_MEMLOCK) && _POSIX_MEMLOCK > 0 +#include +#endif + #define epicsExportSharedSymbols #include "epicsStdio.h" #include "ellLib.h" @@ -35,13 +39,6 @@ #include "epicsAssert.h" #include "epicsExit.h" -#if defined(linux) -#if _POSIX_MEMLOCK > 0 -#include -#endif -#endif - - epicsShareFunc void epicsThreadShowInfo(epicsThreadOSD *pthreadInfo, unsigned int level); epicsShareFunc void osdThreadHooksRun(epicsThreadId id); epicsShareFunc void osdThreadHooksRunMain(epicsThreadId id); @@ -69,7 +66,7 @@ typedef struct commonAttr{ int schedPolicy; } commonAttr; -#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 typedef struct { int min_pri, max_pri; int policy; @@ -115,7 +112,7 @@ if(status) { \ epicsShareFunc int epicsThreadGetPosixPriority(epicsThreadId pthreadInfo) { -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 double maxPriority,minPriority,slope,oss; if(pcommonAttr->maxPriority==pcommonAttr->minPriority) @@ -132,7 +129,7 @@ epicsShareFunc int epicsThreadGetPosixPriority(epicsThreadId pthreadInfo) static void setSchedulingPolicy(epicsThreadOSD *pthreadInfo,int policy) { -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 int status; status = pthread_attr_getschedparam( @@ -214,7 +211,7 @@ static void free_threadInfo(epicsThreadOSD *pthreadInfo) free(pthreadInfo); } -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 /* * The actually available range priority range (at least under linux) * may be restricted by resource limitations (but that is ignored @@ -328,7 +325,8 @@ static void once(void) checkStatusOnce(status,"pthread_attr_setdetachstate"); status = pthread_attr_setscope(&pcommonAttr->attr,PTHREAD_SCOPE_PROCESS); if(errVerbose) checkStatusOnce(status,"pthread_attr_setscope"); -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) + +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 status = pthread_attr_setschedpolicy( &pcommonAttr->attr,SCHED_FIFO); checkStatusOnce(status,"pthread_attr_setschedpolicy"); @@ -352,7 +350,7 @@ static void once(void) pcommonAttr->maxPriority); } -#if _POSIX_MEMLOCK > 0 +#if defined(_POSIX_MEMLOCK) && _POSIX_MEMLOCK > 0 if(errVerbose) { fprintf(stderr, "LRT: min priority: %d max priority %d\n", pcommonAttr->minPriority, pcommonAttr->maxPriority); @@ -371,6 +369,7 @@ static void once(void) #else if(errVerbose) fprintf(stderr,"task priorities are not implemented\n"); #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ + pthreadInfo = init_threadInfo("_main_",0,epicsThreadGetStackSize(epicsThreadStackSmall),0,0); assert(pthreadInfo!=NULL); status = pthread_setspecific(getpthreadInfo,(void *)pthreadInfo); @@ -425,11 +424,9 @@ static void epicsThreadInit(void) epicsShareFunc unsigned int epicsShareAPI epicsThreadGetStackSize (epicsThreadStackSizeClass stackSizeClass) { -#if ! defined (_POSIX_THREAD_ATTR_STACKSIZE) +#if defined (OSITHREAD_USE_DEFAULT_STACK) return 0; -#elif defined (OSITHREAD_USE_DEFAULT_STACK) - return 0; -#else +#elif defined(_POSIX_THREAD_ATTR_STACKSIZE) && _POSIX_THREAD_ATTR_STACKSIZE > 0 #define STACK_SIZE(f) (f * 0x10000 * sizeof(void *)) static const unsigned stackSizeTable[epicsThreadStackBig+1] = { STACK_SIZE(1), STACK_SIZE(2), STACK_SIZE(4) @@ -445,6 +442,8 @@ epicsShareFunc unsigned int epicsShareAPI epicsThreadGetStackSize (epicsThreadSt } return stackSizeTable[stackSizeClass]; +#else + return 0; #endif /*_POSIX_THREAD_ATTR_STACKSIZE*/ } @@ -543,7 +542,8 @@ static epicsThreadOSD *createImplicit(void) assert(pthreadInfo); pthreadInfo->tid = tid; pthreadInfo->osiPriority = 0; -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) + +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 { struct sched_param param; int policy; @@ -553,6 +553,7 @@ static epicsThreadOSD *createImplicit(void) (pcommonAttr->maxPriority - pcommonAttr->minPriority + 1); } #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ + status = pthread_setspecific(getpthreadInfo,(void *)pthreadInfo); checkStatus(status,"pthread_setspecific createImplicit"); if(status){ @@ -613,7 +614,7 @@ epicsShareFunc unsigned int epicsShareAPI epicsThreadGetPrioritySelf(void) epicsShareFunc void epicsShareAPI epicsThreadSetPriority(epicsThreadId pthreadInfo,unsigned int priority) { -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 int status; #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ @@ -625,7 +626,8 @@ epicsShareFunc void epicsShareAPI epicsThreadSetPriority(epicsThreadId pthreadIn } pthreadInfo->osiPriority = priority; if(!pthreadInfo->isRealTimeScheduled) return; -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) + +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 pthreadInfo->schedParam.sched_priority = epicsThreadGetPosixPriority(pthreadInfo); status = pthread_attr_setschedparam( &pthreadInfo->attr,&pthreadInfo->schedParam); @@ -640,7 +642,7 @@ epicsShareFunc epicsThreadBooleanStatus epicsShareAPI epicsThreadHighestPriority unsigned int priority, unsigned *pPriorityJustBelow) { unsigned newPriority = priority - 1; -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 int diff; diff = pcommonAttr->maxPriority - pcommonAttr->minPriority; if(diff<0) diff = -diff; @@ -658,12 +660,13 @@ epicsShareFunc epicsThreadBooleanStatus epicsShareAPI epicsThreadLowestPriorityL { unsigned newPriority = priority + 1; -#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING) +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && _POSIX_THREAD_PRIORITY_SCHEDULING > 0 int diff; diff = pcommonAttr->maxPriority - pcommonAttr->minPriority; if(diff<0) diff = -diff; if(diff>1 && diff <100) newPriority += 100/(diff+1); #endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */ + if (newPriority <= 99) { *pPriorityJustAbove = newPriority; return epicsThreadBooleanStatusSuccess; diff --git a/src/libCom/osi/os/posix/osdTime.h b/src/libCom/osi/os/posix/osdTime.h index 28c481701..12ff42a12 100644 --- a/src/libCom/osi/os/posix/osdTime.h +++ b/src/libCom/osi/os/posix/osdTime.h @@ -19,12 +19,12 @@ #include -#ifndef _POSIX_TIMERS +#if !defined(_POSIX_TIMERS) || _POSIX_TIMERS < 0 struct timespec { time_t tv_sec; /* seconds since some epoch */ long tv_nsec; /* nanoseconds within the second */ }; -#endif /* ifndef _POSIX_TIMERS */ +#endif /* !_POSIX_TIMERS */ #ifdef __cplusplus extern "C" {