vxwRngLib.h
资源名称:ixp425BSP.rar [点击查看]
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:7k
源码类别:
VxWorks
开发平台:
C/C++
- // VXWRingBuf/vxwRngLib.h - ring buffer class
- // Copyright 1995-1999 Wind River Systems, Inc.
- // modification history
- // --------------------
- // 01b,23feb99,fle doc : made it refgen compliant
- // 01d,21feb99,jdi added library section, checked in documentation.
- // 01c,03oct95,rhp documented.
- // 01b,05feb97,bss fixed SPR #7821 by defining myValue() method.
- // 01a,15jun95,srh written.
- // DESCRIPTION
- // The `VXWRingBuf' class provides routines for creating and using
- // ring buffers, which are first-in-first-out circular buffers. The
- // routines simply manipulate the ring buffer data structure; no
- // kernel functions are invoked. In particular, ring buffers by
- // themselves provide no task synchronization or mutual exclusion.
- //
- // However, the ring buffer pointers are manipulated in such a way
- // that a reader task (invoking VXWRingBuf::get()) and a writer task
- // (invoking VXWRingBuf::put()) can access a ring simultaneously
- // without requiring mutual exclusion. This is because readers only
- // affect a <read> pointer and writers only affect a <write>
- // pointer in a ring buffer data structure. However, access by
- // multiple readers or writers <must> be interlocked through a
- // mutual exclusion mechanism (for example, a mutual-exclusion
- // semaphore guarding a ring buffer).
- //
- // INCLUDE FILES: vxwRngLib.h
- //
- // SECTION: 1C
- //
- #ifndef vxwRngLib_h
- #define vxwRngLib_h
- #include "vxWorks.h"
- #include "rngLib.h"
- #include "vxwObject.h"
- #include "vxwErr.h"
- class VXWRingBuf : virtual public VXWIdObject
- {
- public:
- //_ VXWRingBuf Public Constructors
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::VXWRingBuf - create an empty ring buffer
- //
- // This constructor creates a ring buffer of size <nbytes>, and initializes
- // it. Memory for the buffer is allocated from the system memory partition.
- //
- // RETURNS: N/A.
- VXWRingBuf (int nbytes)
- : rid_ (rngCreate (nbytes))
- {
- if (rid_ == 0)
- vxwThrowErrno ();
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::VXWRingBuf - build ring-buffer object from existing ID
- //
- // Use this constructor to build a ring-buffer object from an existing
- // ring buffer. This permits you to use the C++ ring-buffer
- // interfaces even if the ring buffer itself was created by a routine
- // written in C.
- //
- // RETURNS: N/A.
- //
- // SEE ALSO: rngLib
- VXWRingBuf (RING_ID aRingId)
- : rid_ (aRingId)
- {
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::~VXWRingBuf - delete ring buffer
- //
- // This destructor deletes a specified ring buffer.
- // Any data in the buffer at the time it is deleted is lost.
- //
- // RETURNS: N/A
- ~VXWRingBuf ()
- {
- rngDelete (rid_);
- }
- //_ VXWRingBuf Public Member Functions
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::get - get characters from ring buffer
- //
- // This routine copies bytes from the ring buffer into <buffer>.
- // It copies as many bytes as are available in the ring, up to <maxbytes>.
- // The bytes copied are then removed from the ring.
- //
- // RETURNS:
- // The number of bytes actually received from the ring buffer;
- // it may be zero if the ring buffer is empty at the time of the call.
- int get (char * buffer, int maxbytes)
- {
- return rngBufGet (rid_, buffer, maxbytes);
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::put - put bytes into ring buffer
- //
- // This routine puts bytes from <buffer> into the ring buffer. The
- // specified number of bytes is put into the ring, up to the number of
- // bytes available in the ring.
- //
- // RETURNS:
- // The number of bytes actually put into the ring buffer;
- // it may be less than number requested, even zero,
- // if there is insufficient room in the ring buffer at the time of the call.
- int put (char * buffer, int nBytes)
- {
- return rngBufPut (rid_, buffer, nBytes);
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::flush - make ring buffer empty
- //
- // This routine initializes the ring buffer to be empty.
- // Any data in the buffer is lost.
- //
- // RETURNS: N/A
- void flush ()
- {
- rngFlush (rid_);
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::freeBytes - determine the number of free bytes in ring buffer
- //
- // This routine determines the number of bytes currently unused in the
- // ring buffer.
- //
- // RETURNS: The number of unused bytes in the ring buffer.
- int freeBytes () const
- {
- return rngFreeBytes (rid_);
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::isEmpty - test whether ring buffer is empty
- //
- // This routine reports on whether the ring buffer is empty.
- //
- // RETURNS:
- // TRUE if empty, FALSE if not.
- BOOL isEmpty () const
- {
- return rngIsEmpty (rid_);
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::isFull - test whether ring buffer is full (no more room)
- //
- // This routine reports on whether the ring buffer is completely full.
- //
- // RETURNS:
- // TRUE if full, FALSE if not.
- BOOL isFull () const
- {
- return rngIsFull (rid_);
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::moveAhead - advance ring pointer by <n> bytes
- //
- // This routine advances the ring buffer input pointer by <n> bytes.
- // This makes <n> bytes available in the ring buffer, after having
- // been written ahead in the ring buffer with VXWRingBuf::putAhead().
- //
- // RETURNS: N/A
- void moveAhead (int n)
- {
- rngMoveAhead (rid_, n);
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::nBytes - determine the number of bytes in ring buffer
- //
- // This routine determines the number of bytes currently in the
- // ring buffer.
- //
- // RETURNS: The number of bytes filled in the ring buffer.
- int nBytes () const
- {
- return rngNBytes (rid_);
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // VXWRingBuf::putAhead - put a byte ahead in a ring buffer without moving ring pointers
- //
- // This routine writes a byte into the ring, but does not move the
- // ring buffer pointers. Thus the byte is not yet be available to
- // VXWRingBuf::get() calls. The byte is written <offset> bytes ahead
- // of the next input location in the ring. Thus, an offset of 0 puts
- // the byte in the same position as VXWRingBuf::put() would put a
- // byte, except that the input pointer is not updated.
- //
- // Bytes written ahead in the ring buffer with this routine can be
- // made available all at once by subsequently moving the ring buffer
- // pointers with the routine VXWRingBuf::moveAhead().
- //
- // Before calling VXWRingBuf::putAhead(), the caller must verify that at least
- // <offset> + 1 bytes are available in the ring buffer.
- //
- // RETURNS: N/A
- void putAhead (char byte, int offset)
- {
- rngPutAhead (rid_, byte, offset);
- }
- protected:
- VXWRingBuf ()
- {
- }
- VXWRingBuf (const VXWRingBuf &)
- {
- }
- VXWRingBuf & operator = (const VXWRingBuf &)
- {
- return *this;
- }
- // Added to fix SPR # 7821.
- virtual void * myValue ();
- RING_ID rid_;
- };
- #endif /* ifndef vxwRngLib_h */