亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rnglib.c

?? 環型隊列函數
?? C
字號:
/* rngLib.c - ring buffer subroutine library *//* Copyright 1984-1995 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01x,13feb95,jdi  doc tweaks.01w,20jan93,jdi  documentation cleanup for 5.1.01v,26may92,rrr  the tree shuffle01u,11jan92,wmd  fix bug spr #1210, race condition based on updates of buf		 pointers in more than 1 place in rngBufPut() and rngBufGet().01t,13dec91,gae  ANSI cleanup.01s,04oct91,rrr  passed through the ansification filter                  -changed functions to ansi style		  -changed VOID to void		  -changed copyright notice01r,05apr91,jdi	 documentation -- removed header parens and x-ref numbers;		 doc review by dnw.01q,11mar91,jaa	 documentation cleanup.01p,11may90,yao  added missing modification history (01o) for the last checkin.01o,09may90,yao  typecasted malloc to (char *).01n,22mar89,dab  changed shorts to ints in rngBufGet, rngBufPut.01m,03feb89,dab  added rngDelete to delete a ring buffer.01l,20aug88,gae  documentation.01k,07jul88,jcf  fixed malloc to match new declaration.01j,30may88,dnw  changed to v4 names.01i,03nov87,ecs  documentation.01h,20oct87,gae  documentation.01g,23mar87,jlf  documentation.01f,21dec86,dnw  changed to not get include files from default directories.01e,14apr86,rdc  changed memAllocates to mallocs.01d,20jul85,jlf  documentation.01c,09sep84,jlf  added comments and copyright.01b,15aug84,dnw  changed rngBufCreate to allocate ring buffer one byte larger		   than requested, because ring buffer algorithm always leaves		   at least one empty byte in buffer.		 added rngEmpty, rngFull, rngFreeBytes, rngNBytes, rngFlush,		   rngPutAhead, rngMoveAhead, some of which used to be		   macros in rngLib.h.		 changed rngBufGet,rngBufPut to rngGetBuf,rngPutBuf.		 changed rngBufCreate to rngCreate.01a,06jun84,dnw  culled from old drvLib.c*//*This library provides routines for creating and using ring buffers, whichare first-in-first-out circular buffers.  The routines simply manipulatethe ring buffer data structure; no kernel functions are invoked.  Inparticular, ring buffers by themselves provide no task synchronization ormutual exclusion.However, the ring buffer pointers are manipulated in such a way that areader task (invoking rngBufGet()) and a writer task (invokingrngBufPut()) can access a ring simultaneously without requiring mutualexclusion.  This is because readers only affect a \f2read\f1 pointer andwriters only affect a \f2write\f1 pointer in a ring buffer data structure.However, access by multiple readers or writers \f2must\fP be interlockedthrough a mutual exclusion mechanism (i.e., a mutual-exclusion semaphoreguarding a ring buffer).This library also supplies two macros, RNG_ELEM_PUT and RNG_ELEM_GET,for putting and getting single bytes from a ring buffer.  They are definedin rngLib.h..CS    int RNG_ELEM_GET (ringId, pch, fromP)    int RNG_ELEM_PUT (ringId, ch, toP).CEBoth macros require a temporary variable <fromP> or <toP>, whichshould be declared as `register int' for maximum efficiency.  RNG_ELEM_GETreturns 1 if there was a character available in the buffer; it returns 0otherwise.  RNG_ELEM_PUT returns 1 if there was room in the buffer; it returns0 otherwise.  These are somewhat faster than rngBufPut() and rngBufGet(),which can put and get multi-byte buffers.INCLUDE FILES: rngLib.h*//* LINTLIBRARY */#include "vxWorks.h"#include "memLib.h"#include "rngLib.h"#include "stdlib.h"#include "string.h"/********************************************************************************* rngCreate - create an empty ring buffer** This routine creates a ring buffer of size <nbytes>, and initializes* it.  Memory for the buffer is allocated from the system memory partition.** RETURNS* The ID of the ring buffer, or NULL if memory cannot be allocated.*/RING_ID rngCreate    (    int nbytes          /* number of bytes in ring buffer */    )    {    char *buffer;    RING_ID ringId = (RING_ID) malloc (sizeof (RING));    if (ringId == NULL)	return (NULL);    /* bump number of bytes requested because ring buffer algorithm     * always leaves at least one empty byte in buffer */    buffer = (char *) malloc ((unsigned) ++nbytes);    if (buffer == NULL)	{	free ((char *)ringId);	return (NULL);	}    ringId->bufSize = nbytes;    ringId->buf	    = buffer;    rngFlush (ringId);    return (ringId);    }/********************************************************************************* rngDelete - delete a ring buffer** This routine deletes a specified ring buffer.* Any data currently in the buffer will be lost.** RETURNS: N/A*/void rngDelete    (    FAST RING_ID ringId         /* ring buffer to delete */    )    {    free (ringId->buf);    free ((char *)ringId);    }/********************************************************************************* rngFlush - make a ring buffer empty** This routine initializes a specified ring buffer to be empty.* Any data currently in the buffer will be lost.** RETURNS: N/A*/void rngFlush    (    FAST RING_ID ringId         /* ring buffer to initialize */    )    {    ringId->pToBuf   = 0;    ringId->pFromBuf = 0;    }/********************************************************************************* rngBufGet - get characters from a ring buffer** This routine copies bytes from the ring buffer <rngId> into <buffer>.* It copies as many bytes as are available in the ring, up to <maxbytes>.* The bytes copied will be 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 rngBufGet    (    FAST RING_ID rngId,         /* ring buffer to get data from      */    char *buffer,               /* pointer to buffer to receive data */    int maxbytes                /* maximum number of bytes to get    */    )    {    FAST int bytesgot = 0;    int pToBuf = rngId->pToBuf;    int bytes2;    int pRngTmp = 0;    if (pToBuf >= rngId->pFromBuf)	{	/* pToBuf has not wrapped around */	bytesgot = min (maxbytes, pToBuf - rngId->pFromBuf);	bcopy (&rngId->buf [rngId->pFromBuf], buffer, bytesgot);	rngId->pFromBuf += bytesgot;	}    else	{	/* pToBuf has wrapped around.  Grab chars up to the end of the	 * buffer, then wrap around if we need to. */	bytesgot = min (maxbytes, rngId->bufSize - rngId->pFromBuf);	bcopy (&rngId->buf [rngId->pFromBuf], buffer, bytesgot);	pRngTmp = rngId->pFromBuf + bytesgot;	/* If pFromBuf is equal to bufSize, we've read the entire buffer,	 * and need to wrap now.  If bytesgot < maxbytes, copy some more chars	 * in now. */	if (pRngTmp == rngId->bufSize)	    {	    bytes2 = min (maxbytes - bytesgot, pToBuf);	    bcopy (rngId->buf, buffer + bytesgot, bytes2);	    rngId->pFromBuf = bytes2;	    bytesgot += bytes2;	    }	else	    rngId->pFromBuf = pRngTmp;	}    return (bytesgot);    }/********************************************************************************* rngBufPut - put bytes into a ring buffer** This routine puts bytes from <buffer> into ring buffer <ringId>.  The* specified number of bytes will be put into the ring, up to the number of* bytes available in the ring.** INTERNAL* Always leaves at least one byte empty between pToBuf and pFromBuf, to* eliminate ambiguities which could otherwise occur when the two pointers* are equal.** 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 rngBufPut    (    FAST RING_ID rngId,         /* ring buffer to put data into  */    char *buffer,               /* buffer to get data from       */    int nbytes                  /* number of bytes to try to put */    )    {    FAST int bytesput = 0;    int pFromBuf = rngId->pFromBuf;    int bytes2;    int pRngTmp = 0;    if (pFromBuf > rngId->pToBuf)	{	/* pFromBuf is ahead of pToBuf.  We can fill up to two bytes	 * before it */	bytesput = min (nbytes, pFromBuf - rngId->pToBuf - 1);	bcopy (buffer, &rngId->buf [rngId->pToBuf], bytesput);	rngId->pToBuf += bytesput;	}    else if (pFromBuf == 0)	{	/* pFromBuf is at the beginning of the buffer.  We can fill till	 * the next-to-last element */	bytesput = min (nbytes, rngId->bufSize - rngId->pToBuf - 1);	bcopy (buffer, &rngId->buf [rngId->pToBuf], bytesput);	rngId->pToBuf += bytesput;	}    else	{	/* pFromBuf has wrapped around, and its not 0, so we can fill	 * at least to the end of the ring buffer.  Do so, then see if	 * we need to wrap and put more at the beginning of the buffer. */	bytesput = min (nbytes, rngId->bufSize - rngId->pToBuf);	bcopy (buffer, &rngId->buf [rngId->pToBuf], bytesput);	pRngTmp = rngId->pToBuf + bytesput;	if (pRngTmp == rngId->bufSize)	    {	    /* We need to wrap, and perhaps put some more chars */	    bytes2 = min (nbytes - bytesput, pFromBuf - 1);	    bcopy (buffer + bytesput, rngId->buf, bytes2);	    rngId->pToBuf = bytes2;	    bytesput += bytes2;	    }	else	    rngId->pToBuf = pRngTmp;	}    return (bytesput);    }/********************************************************************************* rngIsEmpty - test if a ring buffer is empty** This routine determines if a specified ring buffer is empty.** RETURNS:* TRUE if empty, FALSE if not.*/BOOL rngIsEmpty    (    RING_ID ringId      /* ring buffer to test */    )    {    return (ringId->pToBuf == ringId->pFromBuf);    }/********************************************************************************* rngIsFull - test if a ring buffer is full (no more room)** This routine determines if a specified ring buffer is completely full.** RETURNS:* TRUE if full, FALSE if not.*/BOOL rngIsFull    (    FAST RING_ID ringId         /* ring buffer to test */    )    {    int n = ringId->pToBuf - ringId->pFromBuf + 1;    return ((n == 0) || (n == ringId->bufSize));    }/********************************************************************************* rngFreeBytes - determine the number of free bytes in a ring buffer** This routine determines the number of bytes currently unused in a specified* ring buffer.** RETURNS: The number of unused bytes in the ring buffer.*/int rngFreeBytes    (    FAST RING_ID ringId         /* ring buffer to examine */    )    {    FAST int n = ringId->pFromBuf - ringId->pToBuf - 1;    if (n < 0)	n += ringId->bufSize;    return (n);    }/********************************************************************************* rngNBytes - determine the number of bytes in a ring buffer** This routine determines the number of bytes currently in a specified* ring buffer.** RETURNS: The number of bytes filled in the ring buffer.*/int rngNBytes    (    FAST RING_ID ringId         /* ring buffer to be enumerated */    )    {    FAST int n = ringId->pToBuf - ringId->pFromBuf;    if (n < 0)	n += ringId->bufSize;    return (n);    }/********************************************************************************* rngPutAhead - 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 will not yet be available to rngBufGet() 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 would* RNG_ELEM_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* rngMoveAhead().** Before calling rngPutAhead(), the caller must verify that at least* <offset> + 1 bytes are available in the ring buffer.** RETURNS: N/A*/void rngPutAhead    (    FAST RING_ID ringId,   /* ring buffer to put byte in    */    char byte,             /* byte to be put in ring        */    int offset             /* offset beyond next input byte where to put byte */    )    {    FAST int n = ringId->pToBuf + offset;    if (n >= ringId->bufSize)	n -= ringId->bufSize;    *(ringId->buf + n) = byte;    }/********************************************************************************* rngMoveAhead - advance a 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 rngPutAhead().** RETURNS: N/A*/void rngMoveAhead    (    FAST RING_ID ringId,  /* ring buffer to be advanced                  */    FAST int n            /* number of bytes ahead to move input pointer */    )    {    n += ringId->pToBuf;    if (n >= ringId->bufSize)	n -= ringId->bufSize;    ringId->pToBuf = n;    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
夜夜揉揉日日人人青青一国产精品| 精品一区二区三区免费视频| 免费在线观看一区二区三区| 成人成人成人在线视频| 欧美精品vⅰdeose4hd| 国产精品免费丝袜| 日本亚洲最大的色成网站www| 99久久精品国产毛片| 久久影音资源网| 日韩av中文字幕一区二区三区| av电影在线观看完整版一区二区| 精品福利一区二区三区| 亚洲成av人片一区二区梦乃| 91啪亚洲精品| 国产精品丝袜一区| 国产乱码精品一区二区三区av| 这里是久久伊人| 一区二区三区不卡视频在线观看 | 中文字幕av一区二区三区免费看| 亚洲一区二区三区在线播放| 不卡电影免费在线播放一区| 久久影视一区二区| 国产在线不卡一区| 精品成人私密视频| 极品尤物av久久免费看| 日韩一区二区三区电影| 无码av中文一区二区三区桃花岛| 欧美主播一区二区三区美女| 亚洲九九爱视频| 色婷婷综合久久久久中文| 亚洲欧美在线高清| www.av精品| 国产精品护士白丝一区av| youjizz久久| 亚洲卡通欧美制服中文| 欧美在线看片a免费观看| 亚洲一区在线播放| 欧美精品 国产精品| 亚洲成人先锋电影| 欧美肥胖老妇做爰| 免费国产亚洲视频| 久久久精品影视| 波多野结衣91| 一区二区三区高清不卡| 欧美疯狂做受xxxx富婆| 麻豆成人久久精品二区三区红| 日韩免费观看2025年上映的电影| 久久激情五月激情| 久久影院午夜论| 97久久人人超碰| 亚洲狠狠爱一区二区三区| 欧美精选一区二区| 国产美女主播视频一区| 亚洲欧洲日韩女同| 欧美年轻男男videosbes| 美脚の诱脚舐め脚责91| 亚洲国产精品二十页| 一本到不卡精品视频在线观看| 婷婷久久综合九色综合伊人色| 日韩欧美三级在线| 成人国产一区二区三区精品| 亚洲国产成人精品视频| 精品国产三级电影在线观看| av毛片久久久久**hd| 日韩精品一二区| 国产精品乱人伦中文| 欧美日本不卡视频| 国产河南妇女毛片精品久久久| 亚洲欧美日韩系列| 精品国产91洋老外米糕| 一本到三区不卡视频| 国产综合久久久久久久久久久久| 亚洲免费在线看| 久久久亚洲国产美女国产盗摄| 在线观看日产精品| 国产成人啪免费观看软件 | 欧美综合一区二区| 国产成人精品免费视频网站| 亚洲国产精品一区二区www在线| 久久综合色一综合色88| 91福利精品视频| 成人性视频网站| 另类人妖一区二区av| 亚洲国产成人tv| 中文字幕视频一区| 久久久噜噜噜久久中文字幕色伊伊| 日本高清视频一区二区| 成人午夜在线免费| 久久99国产精品久久99| 亚洲成人www| 亚洲欧美日韩电影| 国产女主播一区| xnxx国产精品| 日韩一区二区三区免费看| 91传媒视频在线播放| 成人免费观看视频| 韩国中文字幕2020精品| 亚洲成人激情av| 艳妇臀荡乳欲伦亚洲一区| 亚洲欧美视频一区| 国产精品国产馆在线真实露脸| 久久色视频免费观看| 日韩精品中文字幕一区二区三区 | 亚洲3atv精品一区二区三区| 国产精品国产a| 中文字幕免费不卡在线| 国产亚洲一二三区| 久久久高清一区二区三区| 久久久久国产成人精品亚洲午夜| 日韩欧美在线不卡| 精品美女在线观看| 欧美一级xxx| 日韩欧美不卡在线观看视频| 7777精品伊人久久久大香线蕉| 欧美日韩国产免费一区二区| 欧美色手机在线观看| 欧美性大战久久| 欧美日韩aaa| 欧美一级一区二区| 精品国产99国产精品| 国产视频一区二区三区在线观看| 久久精品欧美一区二区三区不卡| 久久精品男人天堂av| 欧美激情一区三区| 亚洲免费视频中文字幕| 亚洲在线一区二区三区| 香蕉加勒比综合久久| 日本sm残虐另类| 国产最新精品精品你懂的| 丁香桃色午夜亚洲一区二区三区| 成年人网站91| 欧美揉bbbbb揉bbbbb| 日韩一区二区三区四区| 国产欧美视频一区二区三区| 国产精品二区一区二区aⅴ污介绍| 亚洲精品高清在线观看| 午夜精品久久久久久久| 精久久久久久久久久久| 成人激情图片网| 欧美日韩在线观看一区二区| 日韩欧美专区在线| 中文字幕一区不卡| 亚洲二区视频在线| 黄色小说综合网站| 91网址在线看| 日韩欧美色综合网站| 亚洲天堂成人网| 秋霞午夜鲁丝一区二区老狼| 成人激情免费电影网址| 欧美乱熟臀69xxxxxx| 国产亚洲一本大道中文在线| 亚洲一区二区综合| 国产福利一区二区三区| 欧美日免费三级在线| 久久久亚洲高清| 午夜av一区二区| 9久草视频在线视频精品| 欧美日本一区二区三区| 国产精品成人免费| 麻豆视频观看网址久久| 色婷婷精品大视频在线蜜桃视频 | 国产精品亚洲人在线观看| 日本久久一区二区三区| 26uuu亚洲综合色| 亚洲国产wwwccc36天堂| 成人精品gif动图一区| 日韩午夜激情av| 亚洲午夜免费视频| 9色porny自拍视频一区二区| 欧美tk—视频vk| 图片区小说区区亚洲影院| 91视频国产资源| 久久精品亚洲麻豆av一区二区 | 成人黄色软件下载| 日韩欧美另类在线| 亚洲最大成人综合| 成人激情小说网站| 久久久青草青青国产亚洲免观| 三级欧美在线一区| 91国产免费观看| 亚洲男同性恋视频| 99久久99久久精品国产片果冻| 国产欧美一区二区三区在线老狼 | 99热这里都是精品| 国产校园另类小说区| 久久激情五月婷婷| 欧美一级久久久久久久大片| 午夜私人影院久久久久| 91蜜桃传媒精品久久久一区二区| 欧美国产视频在线| 国产乱人伦精品一区二区在线观看| 日韩欧美在线影院| 日韩不卡免费视频| 欧美一区二区大片| 另类小说欧美激情| 欧美电影免费观看高清完整版在| 免费观看在线色综合| 欧美一二三区在线观看| 久久 天天综合| 久久久综合视频|