Re-merged the dontcant branch.
Michael backed out a few changes and added some others. I added some modifications to default/osdMessageQueue.cpp to remove arguments from a couple of internal (static) functions.
This commit is contained in:
@@ -135,21 +135,21 @@ getEventNode(epicsMessageQueueId pmsg)
|
||||
|
||||
evp = reinterpret_cast < struct eventNode * > ( ellGet(&pmsg->eventFreeList) );
|
||||
if (evp == NULL) {
|
||||
epicsEventId eid = epicsEventCreate(epicsEventEmpty);
|
||||
evp = (struct eventNode *) calloc(1, sizeof(*evp));
|
||||
if(!evp || !eid) {
|
||||
free(evp);
|
||||
if(eid)
|
||||
epicsEventDestroy(eid);
|
||||
return NULL;
|
||||
if (evp) {
|
||||
evp->event = epicsEventCreate(epicsEventEmpty);
|
||||
if (evp->event == NULL) {
|
||||
free(evp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
evp->event = eid;
|
||||
}
|
||||
return evp;
|
||||
}
|
||||
|
||||
static int
|
||||
mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bool haveTimeout, double timeout)
|
||||
mySend(epicsMessageQueueId pmsg, void *message, unsigned int size,
|
||||
double timeout)
|
||||
{
|
||||
char *myInPtr, *nextPtr;
|
||||
struct threadNode *pthr;
|
||||
@@ -160,15 +160,14 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo
|
||||
/*
|
||||
* See if message can be sent
|
||||
*/
|
||||
if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK)
|
||||
return -1;
|
||||
epicsMutexMustLock(pmsg->mutex);
|
||||
|
||||
if ((pmsg->numberOfSendersWaiting > 0)
|
||||
|| (pmsg->full && (ellFirst(&pmsg->receiveQueue) == NULL))) {
|
||||
/*
|
||||
* Return if not allowed to wait
|
||||
*/
|
||||
if (!wait) {
|
||||
if (timeout == 0) {
|
||||
epicsMutexUnlock(pmsg->mutex);
|
||||
return -1;
|
||||
}
|
||||
@@ -189,15 +188,13 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo
|
||||
|
||||
epicsMutexUnlock(pmsg->mutex);
|
||||
|
||||
if(haveTimeout)
|
||||
epicsEventWaitWithTimeout(threadNode.evp->event, timeout);
|
||||
epicsEventStatus status;
|
||||
if (timeout > 0)
|
||||
status = epicsEventWaitWithTimeout(threadNode.evp->event, timeout);
|
||||
else
|
||||
epicsEventWait(threadNode.evp->event);
|
||||
status = epicsEventWait(threadNode.evp->event);
|
||||
|
||||
if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK){
|
||||
freeEventNode(threadNode.evp);
|
||||
return -1;
|
||||
}
|
||||
epicsMutexMustLock(pmsg->mutex);
|
||||
|
||||
if(!threadNode.eventSent)
|
||||
ellDelete(&pmsg->sendQueue, &threadNode.link);
|
||||
@@ -205,7 +202,8 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo
|
||||
|
||||
ellAdd(&pmsg->eventFreeList, &threadNode.evp->link);
|
||||
|
||||
if (pmsg->full && (ellFirst(&pmsg->receiveQueue) == NULL)) {
|
||||
if ((pmsg->full && (ellFirst(&pmsg->receiveQueue) == NULL)) ||
|
||||
status != epicsEventOK) {
|
||||
epicsMutexUnlock(pmsg->mutex);
|
||||
return -1;
|
||||
}
|
||||
@@ -243,25 +241,29 @@ mySend(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bo
|
||||
}
|
||||
|
||||
epicsShareFunc int epicsShareAPI
|
||||
epicsMessageQueueTrySend(epicsMessageQueueId pmsg, void *message, unsigned int size)
|
||||
epicsMessageQueueTrySend(epicsMessageQueueId pmsg, void *message,
|
||||
unsigned int size)
|
||||
{
|
||||
return mySend(pmsg, message, size, false, false, 0.0);
|
||||
return mySend(pmsg, message, size, 0);
|
||||
}
|
||||
|
||||
epicsShareFunc int epicsShareAPI
|
||||
epicsMessageQueueSend(epicsMessageQueueId pmsg, void *message, unsigned int size)
|
||||
epicsMessageQueueSend(epicsMessageQueueId pmsg, void *message,
|
||||
unsigned int size)
|
||||
{
|
||||
return mySend(pmsg, message, size, true, false, 0.0);
|
||||
return mySend(pmsg, message, size, -1);
|
||||
}
|
||||
|
||||
epicsShareFunc int epicsShareAPI
|
||||
epicsMessageQueueSendWithTimeout(epicsMessageQueueId pmsg, void *message, unsigned int size, double timeout)
|
||||
epicsMessageQueueSendWithTimeout(epicsMessageQueueId pmsg, void *message,
|
||||
unsigned int size, double timeout)
|
||||
{
|
||||
return mySend(pmsg, message, size, true, true, timeout);
|
||||
return mySend(pmsg, message, size, timeout);
|
||||
}
|
||||
|
||||
static int
|
||||
myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait, bool haveTimeout, double timeout)
|
||||
myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size,
|
||||
double timeout)
|
||||
{
|
||||
char *myOutPtr;
|
||||
unsigned long l;
|
||||
@@ -270,8 +272,7 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait,
|
||||
/*
|
||||
* If there's a message on the queue, copy it
|
||||
*/
|
||||
if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK)
|
||||
return -1;
|
||||
epicsMutexMustLock(pmsg->mutex);
|
||||
|
||||
myOutPtr = (char *)pmsg->outPtr;
|
||||
if ((myOutPtr != pmsg->inPtr) || pmsg->full) {
|
||||
@@ -305,7 +306,7 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait,
|
||||
/*
|
||||
* Return if not allowed to wait
|
||||
*/
|
||||
if (!wait) {
|
||||
if (timeout == 0) {
|
||||
epicsMutexUnlock(pmsg->mutex);
|
||||
return -1;
|
||||
}
|
||||
@@ -328,7 +329,7 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait,
|
||||
threadNode.size = size;
|
||||
threadNode.eventSent = false;
|
||||
|
||||
if(!threadNode.evp) {
|
||||
if (!threadNode.evp) {
|
||||
epicsMutexUnlock(pmsg->mutex);
|
||||
return -1;
|
||||
}
|
||||
@@ -336,43 +337,45 @@ myReceive(epicsMessageQueueId pmsg, void *message, unsigned int size, bool wait,
|
||||
ellAdd(&pmsg->receiveQueue, &threadNode.link);
|
||||
epicsMutexUnlock(pmsg->mutex);
|
||||
|
||||
if(haveTimeout)
|
||||
epicsEventWaitWithTimeout(threadNode.evp->event, timeout);
|
||||
epicsEventStatus status;
|
||||
if (timeout > 0)
|
||||
status = epicsEventWaitWithTimeout(threadNode.evp->event, timeout);
|
||||
else
|
||||
epicsEventWait(threadNode.evp->event);
|
||||
status = epicsEventWait(threadNode.evp->event);
|
||||
|
||||
if(epicsMutexLock(pmsg->mutex)!=epicsMutexLockOK){
|
||||
freeEventNode(threadNode.evp);
|
||||
return -1;
|
||||
}
|
||||
epicsMutexMustLock(pmsg->mutex);
|
||||
|
||||
if(!threadNode.eventSent)
|
||||
if (!threadNode.eventSent)
|
||||
ellDelete(&pmsg->receiveQueue, &threadNode.link);
|
||||
ellAdd(&pmsg->eventFreeList, &threadNode.evp->link);
|
||||
|
||||
epicsMutexUnlock(pmsg->mutex);
|
||||
|
||||
if(threadNode.eventSent && (threadNode.size <= size))
|
||||
if (threadNode.eventSent && (threadNode.size <= size) &&
|
||||
status == epicsEventOK)
|
||||
return threadNode.size;
|
||||
return -1;
|
||||
}
|
||||
|
||||
epicsShareFunc int epicsShareAPI
|
||||
epicsMessageQueueTryReceive(epicsMessageQueueId pmsg, void *message, unsigned int size)
|
||||
epicsMessageQueueTryReceive(epicsMessageQueueId pmsg, void *message,
|
||||
unsigned int size)
|
||||
{
|
||||
return myReceive(pmsg, message, size, false, false, 0.0);
|
||||
return myReceive(pmsg, message, size, 0);
|
||||
}
|
||||
|
||||
epicsShareFunc int epicsShareAPI
|
||||
epicsMessageQueueReceive(epicsMessageQueueId pmsg, void *message, unsigned int size)
|
||||
epicsMessageQueueReceive(epicsMessageQueueId pmsg, void *message,
|
||||
unsigned int size)
|
||||
{
|
||||
return myReceive(pmsg, message, size, true, false, 0.0);
|
||||
return myReceive(pmsg, message, size, -1);
|
||||
}
|
||||
|
||||
epicsShareFunc int epicsShareAPI
|
||||
epicsMessageQueueReceiveWithTimeout(epicsMessageQueueId pmsg, void *message, unsigned int size, double timeout)
|
||||
epicsMessageQueueReceiveWithTimeout(epicsMessageQueueId pmsg, void *message,
|
||||
unsigned int size, double timeout)
|
||||
{
|
||||
return myReceive(pmsg, message, size, true, true, timeout);
|
||||
return myReceive(pmsg, message, size, timeout);
|
||||
}
|
||||
|
||||
epicsShareFunc int epicsShareAPI
|
||||
|
||||
@@ -245,7 +245,7 @@ void epicsMutexOsdUnlock(struct epicsMutexOSD * pmutex)
|
||||
pmutex->owned = 0;
|
||||
pmutex->ownerTid = 0;
|
||||
status = pthread_cond_signal(&pmutex->waitToBeOwner);
|
||||
checkStatus(status, "pthread_cond_signal epicsMutexOsdUnlock");
|
||||
checkStatusQuit(status, "pthread_cond_signal epicsMutexOsdUnlock", "epicsMutexOsdUnlock");
|
||||
}
|
||||
|
||||
status = pthread_mutex_unlock(&pmutex->lock);
|
||||
|
||||
@@ -3,11 +3,9 @@
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* epicsThread.c */
|
||||
|
||||
/* Author: Marty Kraimer Date: 18JAN2000 */
|
||||
|
||||
@@ -72,7 +70,7 @@ typedef struct epicsThreadOSD {
|
||||
int isFifoScheduled;
|
||||
int isOnThreadList;
|
||||
unsigned int osiPriority;
|
||||
char *name;
|
||||
char name[1]; /* actually larger */
|
||||
} epicsThreadOSD;
|
||||
|
||||
#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
|
||||
@@ -158,7 +156,8 @@ static epicsThreadOSD * create_threadInfo(const char *name)
|
||||
{
|
||||
epicsThreadOSD *pthreadInfo;
|
||||
|
||||
pthreadInfo = calloc(1,sizeof(*pthreadInfo) + strlen(name)+1);
|
||||
/* sizeof(epicsThreadOSD) includes one byte for the '\0' */
|
||||
pthreadInfo = calloc(1,sizeof(*pthreadInfo) + strlen(name));
|
||||
if(!pthreadInfo)
|
||||
return NULL;
|
||||
pthreadInfo->suspendEvent = epicsEventCreate(epicsEventEmpty);
|
||||
@@ -166,7 +165,6 @@ static epicsThreadOSD * create_threadInfo(const char *name)
|
||||
free(pthreadInfo);
|
||||
return NULL;
|
||||
}
|
||||
pthreadInfo->name = (char*)&pthreadInfo[1];
|
||||
strcpy(pthreadInfo->name, name);
|
||||
return pthreadInfo;
|
||||
}
|
||||
@@ -206,17 +204,13 @@ static void free_threadInfo(epicsThreadOSD *pthreadInfo)
|
||||
int status;
|
||||
|
||||
status = mutexLock(&listLock);
|
||||
checkStatus(status,"pthread_mutex_lock free_threadInfo");
|
||||
if(status)
|
||||
return;
|
||||
checkStatusQuit(status,"pthread_mutex_lock","free_threadInfo");
|
||||
if(pthreadInfo->isOnThreadList) ellDelete(&pthreadList,&pthreadInfo->node);
|
||||
status = pthread_mutex_unlock(&listLock);
|
||||
checkStatus(status,"pthread_mutex_unlock free_threadInfo");
|
||||
checkStatusQuit(status,"pthread_mutex_unlock","free_threadInfo");
|
||||
epicsEventDestroy(pthreadInfo->suspendEvent);
|
||||
status = pthread_attr_destroy(&pthreadInfo->attr);
|
||||
checkStatus(status,"pthread_attr_destroy free_threadInfo");
|
||||
if(status)
|
||||
return;
|
||||
checkStatusQuit(status,"pthread_attr_destroy","free_threadInfo");
|
||||
free(pthreadInfo);
|
||||
}
|
||||
|
||||
@@ -539,8 +533,7 @@ static epicsThreadOSD *createImplicit(void)
|
||||
tid = pthread_self();
|
||||
sprintf(name, "non-EPICS_%ld", (long)tid);
|
||||
pthreadInfo = create_threadInfo(name);
|
||||
if(!pthreadInfo)
|
||||
return NULL;
|
||||
assert(pthreadInfo);
|
||||
pthreadInfo->tid = tid;
|
||||
pthreadInfo->osiPriority = 0;
|
||||
#if defined (_POSIX_THREAD_PRIORITY_SCHEDULING)
|
||||
@@ -823,6 +816,7 @@ epicsShareFunc void epicsShareAPI epicsThreadShow(epicsThreadId showThread, unsi
|
||||
}
|
||||
status = pthread_mutex_unlock(&listLock);
|
||||
checkStatus(status,"pthread_mutex_unlock epicsThreadShowAll");
|
||||
if(status) return;
|
||||
if (!found)
|
||||
printf("Thread %#lx (%lu) not found.\n", (unsigned long)showThread, (unsigned long)showThread);
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ typedef struct ringPvt {
|
||||
volatile int nextPut;
|
||||
volatile int nextGet;
|
||||
int size;
|
||||
volatile char *buffer;
|
||||
volatile char buffer[1]; /* actually larger */
|
||||
}ringPvt;
|
||||
|
||||
epicsShareFunc epicsRingBytesId epicsShareAPI epicsRingBytesCreate(int size)
|
||||
@@ -42,7 +42,6 @@ epicsShareFunc epicsRingBytesId epicsShareAPI epicsRingBytesCreate(int size)
|
||||
if(!pring)
|
||||
return NULL;
|
||||
pring->size = size + SLOP;
|
||||
pring->buffer = (char*)&pring[1];
|
||||
pring->nextGet = 0;
|
||||
pring->nextPut = 0;
|
||||
return((void *)pring);
|
||||
|
||||
Reference in New Issue
Block a user