Posix: Fix how we check POSIX features

Darwin defines some macros as -1, which means unsupported.
This commit is contained in:
Andrew Johnson
2014-09-11 17:08:49 -05:00
parent 81fdbdebd9
commit 42f0b9be21
6 changed files with 34 additions and 35 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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
*/

View File

@@ -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

View File

@@ -23,6 +23,10 @@
#include <sched.h>
#include <unistd.h>
#if defined(_POSIX_MEMLOCK) && _POSIX_MEMLOCK > 0
#include <sys/mman.h>
#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 <sys/mman.h>
#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;

View File

@@ -19,12 +19,12 @@
#include <unistd.h>
#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" {