replace osiRing with epicsRingPointer

This commit is contained in:
Marty Kraimer
2000-12-15 15:05:48 +00:00
parent 34198a1824
commit f110f47011
5 changed files with 237 additions and 29 deletions
+6 -3
View File
@@ -12,6 +12,12 @@ SRC_DIRS += $(LIBCOM)/bucketLib
INC += bucketLib.h
SRCS += bucketLib.c
SRC_DIRS += $(LIBCOM)/ring
#following needed for locating epicsRingPointer.h
USR_CFLAGS += -I$(LIBCOM)/ring
INC += epicsRingPointer.h
SRCS += epicsRingPointer.cpp
SRC_DIRS += $(LIBCOM)/calc
#following needed for locating postfixPvt.h and sCalcPostfixPvt.h
USR_CFLAGS += -I$(LIBCOM)/calc
@@ -110,8 +116,6 @@ INC += osiSock.h
INC += osdSock.h
INC += osiInterrupt.h
INC += osdInterrupt.h
INC += osiRing.h
INC += osdRing.h
INC += osiSem.h
INC += osdSem.h
INC += epicsAssert.h
@@ -138,7 +142,6 @@ SRCS += osdAssert.c
SRCS += osdFindGlobalSymbol.c
SRCS += osdInterrupt.c
SRCS += osdPoolStatus.c
SRCS += osdRing.c
SRCS += osdSem.c
SRCS += osdThread.c
SRCS += osiThread.cpp
+78
View File
@@ -0,0 +1,78 @@
/*epicsRingPointer.cpp*/
/* Author: Marty Kraimer Date: 13OCT2000 */
/********************COPYRIGHT NOTIFICATION**********************************
This software was developed under a United States Government license
described on the COPYRIGHT_UniversityOfChicago file included as part
of this distribution.
****************************************************************************/
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#define epicsExportSharedSymbols
#include "epicsRingPointer.h"
typedef epicsRingPointer<void> voidPointer;
epicsShareFunc epicsRingPointerId epicsShareAPI epicsRingPointerCreate(int size)
{
voidPointer *pvoidPointer = new voidPointer(size);
return(reinterpret_cast<void *>(pvoidPointer));
}
epicsShareFunc void epicsShareAPI epicsRingPointerDelete(epicsRingPointerId id)
{
voidPointer *pvoidPointer = reinterpret_cast<voidPointer*>(id);
delete pvoidPointer;
}
epicsShareFunc void* epicsShareAPI epicsRingPointerPop(epicsRingPointerId id)
{
voidPointer *pvoidPointer = reinterpret_cast<voidPointer*>(id);
return((void *)(pvoidPointer->pop()));
}
epicsShareFunc int epicsShareAPI epicsRingPointerPush(epicsRingPointerId id, void *p)
{
voidPointer *pvoidPointer = reinterpret_cast<voidPointer*>(id);
return((pvoidPointer->push(p) ? 1 : 0));
}
epicsShareFunc void epicsShareAPI epicsRingPointerFlush(epicsRingPointerId id)
{
voidPointer *pvoidPointer = reinterpret_cast<voidPointer*>(id);
pvoidPointer->flush();
}
epicsShareFunc int epicsShareAPI epicsRingPointerGetFree(epicsRingPointerId id)
{
voidPointer *pvoidPointer = reinterpret_cast<voidPointer*>(id);
return(pvoidPointer->getFree());
}
epicsShareFunc int epicsShareAPI epicsRingPointerGetUsed(epicsRingPointerId id)
{
voidPointer *pvoidPointer = reinterpret_cast<voidPointer*>(id);
return(pvoidPointer->getUsed());
}
epicsShareFunc int epicsShareAPI epicsRingPointerSize(epicsRingPointerId id)
{
voidPointer *pvoidPointer = reinterpret_cast<voidPointer*>(id);
return(pvoidPointer->getSize());
}
epicsShareFunc int epicsShareAPI epicsRingPointerIsEmpty(epicsRingPointerId id)
{
voidPointer *pvoidPointer = reinterpret_cast<voidPointer*>(id);
return((pvoidPointer->isEmpty()) ? 1 : 0);
}
epicsShareFunc int epicsShareAPI epicsRingPointerIsFull(epicsRingPointerId id)
{
voidPointer *pvoidPointer = reinterpret_cast<voidPointer*>(id);
return((pvoidPointer->isFull()) ? 1 : 0);
}
+136
View File
@@ -0,0 +1,136 @@
/*epicsRingPointer.h */
/* Author: Marty Kraimer Date: 15JUL99 */
/********************COPYRIGHT NOTIFICATION**********************************
This software was developed under a United States Government license
described on the COPYRIGHT_UniversityOfChicago file included as part
of this distribution.
****************************************************************************/
#ifndef INCepicsRingPointerh
#define INCepicsRingPointerh
/* NOTES
If there is only one writer it is not necessary to lock push
If there is a single reader it is not necessary to lock pop
*/
#include "shareLib.h"
#ifdef __cplusplus
template <class T> class epicsRingPointer
{
public:
epicsRingPointer(int size);
~epicsRingPointer();
bool push(T *p);
T* pop();
void flush();
int getFree() const;
int getUsed() const;
int getSize() const;
bool isEmpty() const;
bool isFull() const;
private:
int nextPush;
int nextPop;
int size;
T **buffer;
// copy constructor and assignment operator not allowed
epicsRingPointer(const epicsRingPointer &);
epicsRingPointer& operator=(const epicsRingPointer &);
};
#endif /*__cplusplus */
#ifdef __cplusplus
extern "C" {
#endif
typedef void *epicsRingPointerId;
epicsShareFunc epicsRingPointerId epicsShareAPI epicsRingPointerCreate(int size);
epicsShareFunc void epicsShareAPI epicsRingPointerDelete(epicsRingPointerId id);
/*ringPointerPush returns (0,1) if p (was not, was) put on ring*/
epicsShareFunc int epicsShareAPI epicsRingPointerPush(epicsRingPointerId id,void *p);
/*ringPointerPop returns 0 if ring is empty*/
epicsShareFunc void* epicsShareAPI epicsRingPointerPop(epicsRingPointerId id) ;
epicsShareFunc void epicsShareAPI epicsRingPointerFlush(epicsRingPointerId id);
epicsShareFunc int epicsShareAPI epicsRingPointerGetFree(epicsRingPointerId id);
epicsShareFunc int epicsShareAPI epicsRingPointerGetUsed(epicsRingPointerId id);
epicsShareFunc int epicsShareAPI epicsRingPointerGetSize(epicsRingPointerId id);
epicsShareFunc int epicsShareAPI epicsRingPointerIsEmpty(epicsRingPointerId id);
epicsShareFunc int epicsShareAPI epicsRingPointerIsFull(epicsRingPointerId id);
#ifdef __cplusplus
}
#endif
/* Following is implementation */
/* Algorithm note
* Space is allocated for one additional element.
* A put request is rejected if the it would cause nextPush to equal nextPop
* The algorithm does not require locking puts for a single writer
* or locking of gets for a single reader
*/
#ifdef __cplusplus
template <class T> inline epicsRingPointer<T>::epicsRingPointer(int sz)
: nextPush(0), nextPop(0), size(sz+1), buffer(new T* [sz+1]) {}
template <class T> inline epicsRingPointer<T>::~epicsRingPointer()
{delete [] buffer;}
template <class T> inline bool epicsRingPointer<T>::push(T *p)
{
int newNext = nextPush +1;
if(newNext>=size) newNext=0;
if(newNext==nextPop) return(false);
buffer[nextPush] = p;
nextPush = newNext;
return(true);
}
template <class T> inline T* epicsRingPointer<T>::pop()
{
if(nextPop == nextPush) return(0);
T*p = buffer[nextPop];
int newNext= nextPop;
++newNext;
if(newNext >=size) newNext = 0;
nextPop = newNext;
return(p);
}
template <class T> inline void epicsRingPointer<T>::flush()
{ nextPop = nextPush = 0;}
template <class T> inline int epicsRingPointer<T>::getFree() const
{
int n = nextPop - nextPush - 1;
if (n < 0) n += size;
return n;
}
template <class T> inline int epicsRingPointer<T>::getUsed() const
{
int n = nextPush - nextPop;
if (n < 0) n += size;
return n;
}
template <class T> inline int epicsRingPointer<T>::getSize() const
{return(size-1);}
template <class T> inline bool epicsRingPointer<T>::isEmpty() const
{return(nextPush==nextPop);}
template <class T> inline bool epicsRingPointer<T>::isFull() const
{
int count = nextPush - nextPop +1;
return((count == 0) || (count == size));
}
#endif /* __cplusplus */
#endif /* INCepicsRingPointerh */