rBuffLib.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:10k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* rBuffLib.h - ring of buffers library header file */
  2. /* Copyright 1984-1997 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01l,14oct98,pr   added rBuffShowInit
  7. 01k,23jul98,cjtc defined new structure for windview ring buffer manager
  8.  structure (SPR 21752)
  9. 01j,04may98,nps  rework msg passing for rBuff maintenance.
  10. 01i,19mar98,nps  added new rBuff option which indicates whether to give
  11.                  threshold sempahore.
  12. 01h,18dec97,cth  changed include buffer.h to private/wvBufferP.h
  13. 01g,02dec97,nps  Added field to store peak utilisation.
  14. 01f,20nov97,nps  put the OBJ_CORE in BUFFER_DESC (the work described in
  15.                  the previous coment).
  16. 01e,16nov97,cth  changed interface to include BUFFER_DESC as hdr of struct rBuff
  17.                  OBJ_CORE vs BUFFER_DESC still needs work
  18. 01d,21oct97,nps  include semLibP.h.
  19. 01c,16sep97,nps  modified interface to support generic upload path.
  20.                  split off those fields returned by rBuffInfoGet into
  21.                  separate structure.
  22.                  added RBUFF_MAX_AVAILABLE.
  23. 01b,28jul97,nps  further implementation/testing.
  24.                  rBuffReset returns STATUS type.
  25. 01a,14jul97,nps  written
  26. */
  27. #ifndef __INCrBuffLibh
  28. #define __INCrBuffLibh
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. #include "vxWorks.h"
  33. #include "memLib.h"
  34. #include "msgQLib.h"
  35. #include "objLib.h"
  36. #include "semLib.h"
  37. #include "private/wvBufferP.h"
  38. #include "private/semLibP.h"
  39. #include "private/objLibP.h"
  40. /* defines */
  41. /* rBuffMgr Msg Queue Configuration */
  42. #define RBUFF_MSGQ_MAX_MSGS        50
  43. #define RBUFF_MSGQ_OPTIONS         (MSG_Q_FIFO)
  44. #define RBUFF_MGR_PRIORITY          100
  45. #define RBUFF_MGR_OPTIONS           VX_UNBREAKABLE
  46. /* WindView rBuffMgr Configuration */
  47. #define WV_RBUFF_MGR_PRIORITY     100
  48. #define WV_RBUFF_MGR_OPTIONS        VX_UNBREAKABLE
  49. #define WV_RBUFF_MGR_MSGQ_MAX       50
  50. #define WV_RBUFF_MGR_MSGQ_OPTIONS   (MSG_Q_FIFO)
  51. #define RBUFF_MAX_AVAILABLE      -1
  52. #if USE_RBUFF_SEM
  53. #define RBUFF_LOCK(RBUFF)                                      
  54. if (!INT_CONTEXT())                                            
  55.     {                                                          
  56.         semTake(RBUFF->access,WAIT_FOREVER);                   
  57.     }
  58. #define RBUFF_UNLOCK(RBUFF)                                    
  59. if (!INT_CONTEXT())                                            
  60.     {                                                          
  61.         semGive(RBUFF->access);                                
  62.     }
  63. #else
  64. #define RBUFF_LOCK(RBUFF)
  65. #define RBUFF_UNLOCK(RBUFF)
  66. #endif /* USE_RBUFF */
  67. #define RBUFF_UPLOAD_SEM(RBUFF)   (&(RBUFF->buffDesc.hasDataSem))
  68. #define RBUFF_EMPTY_KEEP         1
  69. /* rBuff Manager Msg Defines */
  70. #define RBUFF_MAX_MSGS           10
  71. #define RBUFF_MSG_LEN            12
  72. #define RBUFF_MSG_ADD            1
  73. #define RBUFF_MSG_FREE           2
  74. #define RBUFF_MSG_FULL -1
  75. /* types */
  76. /* Individual buffer control structure */
  77. typedef struct rbuff_buff {
  78.     struct rbuff_buff *next;        /* ptr to the next buffer in the ring */
  79.     UINT32            spaceAvail;   /* num of bytes of free space in buff */
  80.     unsigned char     *dataStart;   /* ptr to the actual buffer region */
  81.     unsigned char     *dataEnd;     /* ptr to the last actual byte of buff area */
  82.     UINT32            dataLen;      /* length of valid data in bytes */
  83. } RBUFF_BUFF_TYPE;
  84. typedef RBUFF_BUFF_TYPE *RBUFF_PTR;
  85. typedef struct rbuff_stats {
  86.     PART_ID       srcPart;          /* source partition specified on creation */
  87.     UINT32        options;          /* options selected */
  88.     UINT32        buffSize;         /* size of each buffer in bytes */
  89.     UINT32        currBuffs;        /* current num of buffs in the ring */
  90.     UINT32        threshold;        /* threshold at which upload will begin */
  91.     UINT32        minBuffs;         /* min num of buffs specified */
  92.     INT32         maxBuffs;         /* max num of buffs specified */
  93.     UINT32        maxBuffsActual;   /* max num of buffs actually used */
  94.     UINT32        emptyBuffs;       /* num of buffs to hold empty */
  95.     UINT32        dataContent;      /* num of bytes of data currently in the buff */
  96.     UINT32        writesSinceReset; /* num of write accesses since the last reset */
  97.     UINT32        readsSinceReset;  /* num of read accesses since the last reset */
  98.     UINT32        timesExtended;    /* num of times the buffer had to be extended */
  99.     UINT32        timesXThreshold;  /* num of times the threshold was crossed */
  100.     UINT32        bytesWritten;     /* bytes written since reset */
  101.     UINT32        bytesRead;        /* bytes read since reset */
  102.     UINT32        bytesPeak;        /* Peak buffer content */
  103. } RBUFF_INFO_TYPE;
  104. /*
  105.  * In the new ring buffer scheme, the message list is held in the ring buffer
  106.  * manager's control structure, not in the ring buffer itself. For WV 2.0, it
  107.  * is being left here so that the structure offsets will not change, so as not
  108.  * to require a chage to the host side. For WV 2.2, the message queue here may
  109.  * be removed - i.e. the following fields will no longer be required:
  110.  *  msgSem
  111.  * msg
  112.  * msgWriteIndex
  113.  * msgReadIndex
  114.  * When removed, the host side tcl offsets will need to be changed to reflect
  115.  * the new structure.
  116.  *
  117.  * msgOutstanding is still required in this structure, since it is buffer-
  118.  * specific, but in reality its name
  119.  * should be changed to more closely reflect its function...to
  120.  * rBuffAddMsgOutstanding, for example
  121.  */
  122. /* Ring control structure */
  123. typedef struct rbuff {
  124.     BUFFER_DESC   buffDesc;         /* generic buffer descriptor */ 
  125.     RBUFF_PTR     buffRead;         /* buff from which next data read */
  126.     RBUFF_PTR     buffWrite;        /* buff to hold next data read */
  127.     UINT8         *dataRead;        /* abs ptr from where data next read */
  128.     UINT8         *dataWrite;       /* abs ptr to where data next written */
  129.     int           fd;               /* the fd of the upload device */
  130.     FUNCPTR       errorHandler;     /* fn to call is fd write returns error */
  131.     SEMAPHORE     readBlk;          /* sem on which to pend if no data */
  132.     SEMAPHORE     bufferFull;       /* sem on which to pend if buffer is full */
  133.     UINT32        nestLevel;        /* the level to which rBuff calls are nested */
  134.     RBUFF_INFO_TYPE info;           /* Info that is returned by rBuffInfo */
  135.     SEMAPHORE     msgSem;
  136.     int           rBuffMgrId;
  137.     unsigned int  msg[RBUFF_MAX_MSGS][2];
  138.     unsigned int  msgOutstanding;
  139.     unsigned int  msgWriteIndex;
  140.     unsigned int  msgReadIndex;
  141. } RBUFF_TYPE;
  142. typedef struct rBuffCreateParams {
  143.     PART_ID sourcePartition;
  144.     UINT32  minimum;
  145.     INT32  maximum;
  146.     UINT32  buffSize;
  147.     UINT32  threshold;
  148.     FUNCPTR errorHandler;
  149.     UINT32  options;
  150. } rBuffCreateParamsType;
  151. #ifndef GENERIC_RBUFF
  152. /* ring buffer manager types - for windview */
  153. /*
  154.  * these types have been defined especially for windview. For truly generic
  155.  * ring buffers, a vxWorks message queue may be used rather than the home-
  156.  * grown one which is needed for windview (to prevent the messages for the
  157.  * windview ring buffer manager themselves generating events)
  158.  */
  159. typedef struct wv_rbuff_mgr_msg_type {
  160.     RBUFF_TYPE *  ringId; /* id of ring for message */
  161.     unsigned int  msgType;              /* message type */
  162.     unsigned int  arg;                  /* argument */
  163. } WV_RBUFF_MGR_MSG_TYPE;
  164. typedef struct wv_rbuff_mgr_type {
  165.     int        tid; /* tid of tWvRBuffMgr task */
  166.     int        priorityDefault;  /* default priority of task */
  167.     SEMAPHORE        msgSem;          /* semaphore to run it    */
  168.     unsigned int       msgWriteIndex; /* message q write index */
  169.     unsigned int       msgReadIndex; /* message q read index */
  170.     WV_RBUFF_MGR_MSG_TYPE   msg [WV_RBUFF_MGR_MSGQ_MAX]; /* msg queue */
  171. } WV_RBUFF_MGR_TYPE;
  172. typedef WV_RBUFF_MGR_TYPE * WV_RBUFF_MGR_ID;
  173. #endif /* GENERIC_RBUFF */
  174. #ifndef _ASMLANGUAGE
  175. typedef RBUFF_TYPE *RBUFF_ID;
  176. #endif /* ~ _ASMLANGUAGE */
  177. /* ring of buffer options */
  178. #define RBUFF_WRAPAROUND 0x1
  179. #define RBUFF_WRITE_BLOCK               0x2
  180. #define RBUFF_READ_BLOCK                0x4
  181. #define RBUFF_UP_DEFERRED               0x8
  182. #ifndef _ASMLANGUAGE
  183. /* variable declarations */
  184. extern CLASS_ID rBuffClassId;
  185. extern MSG_Q_ID rBuffMgrMsgQId;
  186. /* function declarations */
  187. #if defined(__STDC__) || defined(__cplusplus)
  188. extern STATUS rBuffLibInit(void);
  189. extern BUFFER_ID rBuffCreate
  190.     (
  191.     void *rBuffParams
  192.     );
  193. extern UINT8 *rBuffWrite
  194.     (
  195.     BUFFER_ID buffId,
  196.     UINT8 *dataSrc,
  197.     UINT32 numOfBytes
  198.     );
  199. extern INT32 rBuffRead
  200.     (
  201.     BUFFER_ID buffId,
  202.     UINT8    *dataDest,
  203.     UINT32  numOfBytes
  204.     );
  205. extern UINT32 rBuffReadReserve
  206.     (
  207.     BUFFER_ID buffId,
  208.     UINT8 **src
  209.     );
  210. extern STATUS rBuffReadCommit
  211.     (
  212.     BUFFER_ID buffId,
  213.     UINT32  numOfBytes
  214.     );
  215. extern INT32 rBuffFlush
  216.     (
  217.     BUFFER_ID buffId
  218.     );
  219. extern STATUS rBuffReset
  220.     (
  221.     BUFFER_ID buffId
  222.     );
  223. extern INT32 rBuffNBytes
  224.     (
  225.     BUFFER_ID buffId
  226.     );
  227. extern int rBuffUpload
  228.     (
  229.     BUFFER_ID buffId,
  230.     int fd
  231.     );
  232. extern STATUS rBuffSetFd
  233.     (
  234.     BUFFER_ID buffId,
  235.     int      fd
  236.     );
  237. extern void rBuffShowInit 
  238.     (
  239.     void
  240.     );
  241. extern STATUS rBuffShow
  242.     (
  243.     BUFFER_ID buffId,
  244.     UINT32 type
  245.     );
  246. extern STATUS rBuffDestroy
  247.     (
  248.     BUFFER_ID buffId
  249.     );
  250. #else /* __STDC__ */
  251. extern STATUS rBuffLibInit();
  252. extern BUFFER_ID rBuffCreate();
  253. extern UINT8 *rBuffWrite();
  254. extern INT32  rBuffRead();
  255. extern INT32  rBuffNBytesContig();
  256. extern STATUS rBuffMoveAhead();
  257. extern INT32  rBuffFlush();
  258. extern STATUS rBuffReset();
  259. extern INT32  rBuffNBytes();
  260. extern STATUS rBuffUpload();
  261. extern STATUS rBuffSetFd();
  262. extern STATUS rBuffShow();
  263. extern void   rBuffShowInit ();
  264. extern STATUS rBuffDestroy();
  265. #endif /* __STDC__ */
  266. #endif /* _ASMLANGUAGE */
  267. #ifdef __cplusplus
  268. }
  269. #endif
  270. #endif /* __INCrBuffLibh */