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:
Andrew Johnson
2012-06-19 14:28:26 -05:00
4 changed files with 59 additions and 63 deletions
+48 -45
View File
@@ -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
+1 -1
View File
@@ -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);
+9 -15
View File
@@ -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);
}
+1 -2
View File
@@ -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);