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

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

?? zbuflib.c

?? vxwork源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* zbufLib.c - zbuf interface library *//* Copyright 1984 - 2001 Wind River Systems, Inc. */#include "copyright_wrs.h"/*modification history--------------------01h,07may02,kbw  man page edits01g,15oct01,rae  merge from truestack ver 01g, base 01f (AE / 5_X)01f,26jan95,jdi  format tweak.01e,24jan95,rhp  revisions based on jdi feedback01d,16jan95,rhp  fix SEE ALSO subroutine ref format01c,15nov94,dzb  doc tweaks.01b,09nov94,rhp  library man page added, subroutine man pages edited.01a,08nov94,dzb  written.*//*DESCRIPTIONThis library contains routines to create, build, manipulate, anddelete zbufs.  Zbufs, also known as "zero copy buffers," are a dataabstraction designed to allow software modules to share bufferswithout unnecessarily copying data.To support the data abstraction, the subroutines in this library hidethe implementation details of zbufs.  This also maintains thelibrary's independence from any particular implementation mechanism,thus permitting the zbuf interface to be used with other buffering schemes.Zbufs have three essential properties.  First, a zbuf holds asequence of bytes.  Second, these bytes are organized into one or moresegments of contiguous data, although the successive segmentsthemselves are not usually contiguous.  Third, the data within asegment may be shared with other segments; that is, the data may be in useby more than one zbuf at a time.ZBUF TYPESThe following data types are used in managing zbufs:.iP ZBUF_ID 16 3An arbitrary (but unique) integer that identifies a particular zbuf..iP ZBUF_SEGAn arbitrary (but unique within a single zbuf) integer that identifiesa segment within a zbuf..LPADDRESSING BYTES IN ZBUFSThe bytes in a zbuf are addressed by the combination <zbufSeg>,<offset>.  The <offset> may be positive or negative, and is simply thenumber of bytes from the beginning of the segment <zbufSeg>.A <zbufSeg> can be specified as NULL, to identify the segment at thebeginning of a zbuf.  If <zbufseg> is NULL, <offset> is theabsolute offset to any byte in the zbuf.  However, it is moreefficient to identify a zbuf byte location relative to the <zbufSeg>that contains it; see zbufSegFind() to convert any <zbufSeg>, <offset>pair to the most efficient equivalent.Negative <offset> values always refer to bytes before thecorresponding <zbufSeg>, and are not usually the most efficientaddress formulation (though using them may save yourprogram other work in some cases).The following special <offset> values, defined as constants,allow you to specify the very beginning or the very end of an entire zbuf,regardless of the <zbufSeg> value:.iP ZBUF_BEGIN 16 3The beginning of the entire zbuf..iP ZBUF_ENDThe end of the entire zbuf (useful for appending to a zbuf; see below)..LPINSERTION AND LIMITS ON OFFSETSAn <offset> is not valid if it points outside the zbuf.  Thus, toaddress data currently within an N-byte zbuf, the valid offsetsrelative to the first segment are 0 through N-1.Insertion routines are a special case: they obey the usualconvention, but they use <offset> to specify where the new databegins after the insertion is complete.  Therefore, the originalzbuf data is always inserted just before the bytelocation addressed by the <offset> value.  The value of thisconvention is that it permits inserting (or concatenating) data eitherbefore or after the existing data.  To insert before all the datacurrently in a zbuf segment, use 0 as <offset>.  To insert after allthe data in an N-byte segment, use N as <offset>. An <offset> of N-1inserts the data just before the last byte in an N-byte segment.An <offset> of 0 is always a valid insertion point; for an empty zbuf,0 is the only valid <offset> (and NULL the only valid <zbufSeg>).SHARING DATAThe routines in this library avoid copying segment data wheneverpossible.  Thus, by passing and manipulating ZBUF_IDs rather thancopying data, multiple programs can communicate with greaterefficiency.  However, each program must be aware of data sharing:changes to the data in a zbuf segment are visible to all zbuf segmentsthat reference the data.To alter your own program's view of zbuf data without affecting otherprograms, first use zbufDup() to make a new zbuf; then you can use aninsertion or deletion routine, such as zbufInsertBuf(), to add asegment that only your program sees (until you pass a zbuf containingit to another program).  It is safest to do all direct datamanipulation in a private buffer, before enrolling it in a zbuf: inprinciple, you should regard all zbuf segment data as shared.Once a data buffer is enrolled in a zbuf segment, the zbuf library isresponsible for noticing when the buffer is no longer in use by anyprogram, and freeing it.  To support this, zbufInsertBuf() requiresthat you specify a callback to a free routine each time you build azbuf segment around an existing buffer.  You can use this callback to notifyyour application when a data buffer is no longer in use.VXWORKS AE PROTECTION DOMAINSUnder VxWorks AE, this feature is restricted to the kernel protection domain.  This restriction does not apply under non-AE versions of VxWorks.  To use this feature, include the following component:INCLUDE_ZBUF_SOCKSEE ALSOzbufSockLibINTERNALExtensions:zbufJoin (zbufId, zbufSeg) - coalesce two adjacent segment fragments    This routine combines two or more contiguous zbuf segments into a single    zbuf segment.  Such an operation is only feasible for joining segments    that have the same freeRtn and freeArg, and that follow eachother in    the zbuf.  This could be useful for coalescing zbuf segments fragmented    by split operations.zbufOwn (zbufId, zbufSeg, offset, len) - own a local copy of zbuf data    This routine makes a local copy of a portion of a zbuf.  This    is useful if you want to change the actual data in a zbuf, but want to    make sure that you are not corrupting another zbuf that shares the    same data.  If you are the only zbuf segment using a particular buffer,    this routine does nothing.  If other zbufs reference the same data, this    routine inserts a copy of the requested data, then deletes reference    to the original data.*//* includes */#include "vxWorks.h"#include "zbufLib.h"#include "stdlib.h"#include "memPartLib.h"/* locals *//* * N.B. * As other back-ends to zbuf are ever developed, and need to be run * concurrently with existing back-ends, the zbufFunc table needs to have * the back-end resident function table pointer in the ZBUF_ID.  This will * require a modification to the current method of simply passing through * the ZBUF_ID to the back-end.  Instead, the ZBUF_ID will have to point * to a structure, which would contain the back-end function table pointer * and a back-end-specific XX_ID pointer. */LOCAL ZBUF_FUNC		zbufFuncNull =	/* null funcs for unconnected zbufs */    {    NULL,				/* zbufCreate()		*/    NULL,				/* zbufDelete()		*/    NULL,				/* zbufInsert()		*/    NULL,				/* zbufInsertBuf()	*/    NULL,				/* zbufInsertCopy()	*/    NULL,				/* zbufExtractCopy()	*/    NULL,				/* zbufCut()		*/    NULL,				/* zbufSplit()		*/    NULL,				/* zbufDup()		*/    NULL,				/* zbufLength()		*/    NULL,				/* zbufSegFind()	*/    NULL,				/* zbufSegNext()	*/    NULL,				/* zbufSegPrev()	*/    NULL,				/* zbufSegData()	*/    NULL				/* zbufSegLength()	*/    };LOCAL ZBUF_FUNC *	pZbufFunc = &zbufFuncNull;/********************************************************************************* zbufLibInit - initialize the zbuf interface library** This routine initializes the zbuf interface facility.  It* must be called before any zbuf routines are used.  This routine is* typically called during the initialization of a VxWorks facility which* uses or extends the zbuf interface, although this is not a requirement.* The zbuf library may be used on its own, provided an appropriate back-end* buffer mechanism is available, and is specified by <libInitRtn>.** RETURNS:* OK, or ERROR if the zbuf interface cannot be initialized.** NOMANUAL*/STATUS zbufLibInit    (    FUNCPTR		libInitRtn	/* back-end buffer mechanism init rtn */    )    {    ZBUF_FUNC *		pZbufFuncTemp;	/* temp return of back-end func table */    /* call the back-end initialization routine - watch for NULL func ptr */    if ((libInitRtn == NULL) || ((pZbufFuncTemp =	(ZBUF_FUNC *) (libInitRtn) ()) == NULL))	return (ERROR);    pZbufFunc = pZbufFuncTemp;			/* connect back-end func tbl */    return (OK);    }#if	FALSE		/* Pool routines not in service yet *//********************************************************************************* zbufSegPoolCreate - create an empty zbuf segment pool** This routine creates a zbuf segment pool.  It remains empty (that is, does* not contain any free segments) until segments are added by calling* zbufSegPoolAdd().  Operations performed on zbuf segments pools require* a zbuf segment pool ID, which is returned by this routine.** RETURNS:* A zbuf segment pool ID, or NULL if an ID cannot be created.** SEE ALSO: zbufSegPoolDelete(), zbufSegPoolAdd()** NOMANUAL*/ZBUF_POOL_ID zbufSegPoolCreate (void)    {    ZBUF_POOL_ID	zbufPoolId;		/* new ID */        if ((zbufPoolId = (ZBUF_POOL_ID) KHEAP_ALLOC(sizeof(struct zbufPoolId))) ==	NULL)	return (NULL);				/* malloc pool ID struct */    /* create mutex sem for guarding access to zbuf segment pool */    if ((zbufPoolId->poolSem = semMCreate ((SEM_Q_PRIORITY |	SEM_INVERSION_SAFE | SEM_DELETE_SAFE))) == ERROR)	{	KHEAP_FREE(zbufPoolId);			/* free resources */	return (NULL);	}    /* create binary sem for waiting for free segments to come into pool */    if ((zbufPoolId->waitSem = semBCreate (SEM_Q_PRIORITY, SEM_EMPTY)) == ERROR)	{        semDelete (zbufPoolId->poolSem);	/* free resources */	KHEAP_FREE(zbufPoolId);	return (NULL);	}    zbufPoolId->use = 0;			/* no loaned buffers yet */    zbufPoolId->blockHead = NULL;		/* no blocks/segs yet */    return (zbufPoolId);    }/********************************************************************************* zbufSegPoolDelete - delete a zbuf segment pool and free associated segments** This routine will free any segments associated with <zbufPoolId>,* then delete the zbuf segment pool ID itself.  To do this, all segments* must be in the pool (that is, no segments may currently be part of a zbuf).* <zbufPoolId> must not be used after this routine executes successfully.** Associated segments will be returned to the system memory pool if they* were allocated with zbufSegPoolAdd().  No action will be taken upon* user segments added to the segment pool by specifying the segment block* start address. These segments should be considered free after this* routine executes successfully.* * RETURNS:* OK, or ERROR if the zbuf segment pool has outstanding segments.** SEE ALSO: zbufSegPoolCreate(), zbufSegPoolAdd()** NOMANUAL*/STATUS zbufSegPoolDelete    (    ZBUF_POOL_ID	zbufPoolId	/* zbuf segment pool to delete */    )    {    ZBUF_BLOCK_ID	zbufBlock;		/* ptr to block headers */    ZBUF_BLOCK_ID	zbufBlockTemp;		/* temp storage of block hdr */    /* obtain exclusive access to zbuf segment pool structures */    if ((semTake (zbufPoolId->poolSem, WAIT_FOREVER)) == ERROR)	return (ERROR);    if (zbufPoolId->use != 0)			/* any segments in use ? */	{	semGive (zbufPoolId->poolSem);		/* give up access */	return (ERROR);				/* cannot feee if in use */	}    /* go through list of block headers, freein all alloc'ed mem */    for (zbufBlock = zbufPoolId->blockHead; zbufBlock != NULL;)	{	zbufBlockTemp = zbufBlock->blockNext;		KHEAP_FREE(zbufBlock);			/* free each hdr & memory */        zbufBlock = zbufBlockTemp;		/* bump to next block hdr */        }    semDelete (zbufPoolId->waitSem);		/* free wait binary sem */    semDelete (zbufPoolId->poolSem);		/* free pool mutex sem */    KHEAP_FREE(zbufPoolId);			/* free actual pool ID struct */    return (OK);    }/********************************************************************************* zbufSegPoolAdd - add a block of zbuf segments to a zbuf segment pool** This routine adds a block of zbuf segments to <zbufPoolId>.  This routine* may be called multiple times to add segment blocks of different sizes and* numbers.** The segment size <segSise> will be rounded up to the memory allignment* requirements of the target architecture.  The minimum size of a* segment is the size of a void pointer.** If system memory is to be used for the segment allocation, set <blockStart>* to NULL, in which case <blockLength> parameter will be ignored.* Otherwise, a block of memory to be used may be specified by <blockStart> and* <blockLen>.  If a segment block is specified with <blockStart>, the* <segNum> parameter is ignored.  Instead, the number of alligned segments* that can be obtained from <memLength> are added to the pool.* * If a zbuf segment pool is deleted with zbufSegPoolDelete(), any allocated* segment blocks will be returned to the system memory pool.  Specific memory* blocks obtained through <blockStart> should be considered free after* zbufSegPoolDelete() executes successfully, but the user will not be* given any further indication of the memory being released from the pool.* * RETURNS:* OK, or ERROR if the zbuf segment block cannot be added to the pool.** SEE ALSO: zbufSegPoolDelete()** NOMANUAL*/STATUS zbufSegPoolAdd    (    ZBUF_POOL_ID	zbufPoolId,	/* pool to add zbuf segments to */    int			segSize,	/* size of new segments */    int			segNum,		/* number of new segs (system memory) */    caddr_t		blockStart,	/* start of seg block (user memory) */    int			blockLen	/* length of seg block (user memory) */    )    {    ZBUF_BLOCK_ID	zbufBlockNew;		/* new block header */    ZBUF_BLOCK_ID 	zbufBlock = NULL;	/* location to insert new hdr */    STATUS		status = ERROR;		/* return value */    int			ix;			/* counter for block init */    /* obtain exclusive access to zbuf segment pool structures */    if ((semTake (zbufPoolId->poolSem, WAIT_FOREVER)) == ERROR)	return (ERROR);    /* adjust segSize for mem allign - must be at least void * (see below) */    segSize = min (MEM_ROUND_UP(segSize), sizeof (void *));    if (blockStart == NULL)			/* if allocating from system */	{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩二区三区| 黑人精品欧美一区二区蜜桃| 白白色亚洲国产精品| 精品免费日韩av| 国产曰批免费观看久久久| 日韩精品一区二区三区在线播放| 日本不卡一区二区三区| 日韩精品一区二区三区蜜臀| 国产一区二区三区最好精华液| 久久综合视频网| 高清在线成人网| 亚洲精品大片www| 欧美日韩一区在线观看| 蜜臀精品久久久久久蜜臀| 久久九九久久九九| 色综合久久久久综合99| 日韩精品三区四区| 26uuu久久天堂性欧美| jiyouzz国产精品久久| 夜色激情一区二区| 日韩视频一区在线观看| 国产精品影视在线观看| 亚洲美女一区二区三区| 91麻豆精品国产91久久久资源速度 | 亚洲欧美激情小说另类| 欧美主播一区二区三区| 久久精工是国产品牌吗| 国产精品盗摄一区二区三区| 欧美猛男男办公室激情| 国产二区国产一区在线观看| 亚洲最大的成人av| 久久综合九色综合久久久精品综合| 成人网在线播放| 三级一区在线视频先锋 | 中文字幕欧美日本乱码一线二线| 一本大道久久a久久综合| 日韩1区2区日韩1区2区| 国产精品久久久久久久久免费丝袜 | 欧美激情一区二区三区四区| 欧美日韩国产综合视频在线观看| 久久精品999| 玉足女爽爽91| 精品国产成人在线影院| 欧美在线观看禁18| 国产一区二区电影| 同产精品九九九| 中文字幕一区在线观看视频| 日韩视频一区二区三区| 欧美日韩一区久久| 9l国产精品久久久久麻豆| 麻豆成人91精品二区三区| 亚洲激情图片qvod| 欧美激情一区二区三区全黄 | 99久久综合精品| 日日摸夜夜添夜夜添亚洲女人| 日本一区二区综合亚洲| 欧美一区二区三区性视频| 欧美性受极品xxxx喷水| 成人毛片在线观看| 国产原创一区二区三区| 老司机精品视频线观看86| 亚洲va国产天堂va久久en| ...xxx性欧美| 欧美韩国日本一区| 国产视频一区在线播放| 精品国产sm最大网站免费看| 欧美一区二区三区在线观看| 8v天堂国产在线一区二区| 欧美性猛片aaaaaaa做受| 色婷婷久久久综合中文字幕| 成人av在线电影| 成人精品视频.| 国v精品久久久网| 成人黄色在线网站| 不卡的av中国片| 成人高清免费在线播放| 成a人片国产精品| 成人av在线电影| 91理论电影在线观看| 97久久超碰国产精品| 色噜噜狠狠色综合中国| 91国产丝袜在线播放| 欧美系列日韩一区| 欧美日韩成人综合天天影院| 欧美日韩精品一区二区三区四区 | 91福利社在线观看| 色噜噜狠狠一区二区三区果冻| 91麻豆国产在线观看| 在线免费观看日韩欧美| 欧美午夜精品一区| 欧美精品久久久久久久多人混战| 欧美精品视频www在线观看| 91精品国产欧美一区二区成人| 欧美一区二视频| 久久综合色婷婷| 国产日本欧美一区二区| 中文字幕一区二| 亚洲综合色噜噜狠狠| 欧美aaaaaa午夜精品| 国产一区在线精品| 成人久久18免费网站麻豆| 成人av在线网站| 欧美日韩国产系列| 欧美mv日韩mv国产网站app| 久久久亚洲综合| 最新不卡av在线| 青娱乐精品视频| 国产a区久久久| 在线观看免费一区| 在线播放日韩导航| 国产欧美精品在线观看| 亚洲一区二区在线视频| 美女看a上一区| caoporen国产精品视频| 欧美日韩第一区日日骚| 久久久精品影视| 亚洲一级在线观看| 国产一区二区三区精品视频| 不卡电影一区二区三区| 91精品福利在线一区二区三区| 国产清纯在线一区二区www| 亚洲午夜精品在线| 国产精品资源在线观看| 精品视频一区二区不卡| 久久久久国产精品人| 夜夜嗨av一区二区三区四季av | 日韩高清不卡一区二区三区| 国产成人超碰人人澡人人澡| 欧美在线免费播放| 久久久国产午夜精品| 亚洲福利视频导航| 成人深夜福利app| 欧美成人性福生活免费看| 亚洲精品一二三四区| 国产美女视频一区| 这里只有精品99re| 一区二区三区欧美日韩| 国产高清不卡一区| 91麻豆精品国产91久久久资源速度| 国产精品传媒入口麻豆| 国产精品一二三四五| 91精品国产综合久久婷婷香蕉| 综合亚洲深深色噜噜狠狠网站| 国产精品一二三| 555www色欧美视频| 一区二区三区四区不卡在线| 懂色av噜噜一区二区三区av| 日韩亚洲欧美成人一区| 亚洲二区在线观看| 色婷婷一区二区三区四区| 国产精品久久影院| 国产福利一区二区三区视频在线| 91麻豆精品国产自产在线观看一区 | 开心九九激情九九欧美日韩精美视频电影| kk眼镜猥琐国模调教系列一区二区 | 成人国产精品免费观看| 久久久久久黄色| 韩国一区二区三区| 日韩美一区二区三区| 婷婷一区二区三区| 欧美中文字幕一区二区三区| 亚洲色图在线看| 91丨porny丨国产入口| 国产精品传媒在线| 97久久精品人人做人人爽50路| 中文字幕精品—区二区四季| 丰满白嫩尤物一区二区| 久久久91精品国产一区二区精品 | 日韩一二三区不卡| 奇米影视在线99精品| 日韩午夜在线播放| 奇米精品一区二区三区四区| 日韩你懂的在线播放| 九九九精品视频| 久久色在线视频| 成人午夜视频在线观看| 国产精品欧美一级免费| 99精品国产91久久久久久| 亚洲日本中文字幕区| 在线观看欧美日本| 日韩精品亚洲一区| 精品国产第一区二区三区观看体验| 国产一区二区不卡| 国产精品情趣视频| 91婷婷韩国欧美一区二区| 亚洲一区在线观看视频| 欧美丰满嫩嫩电影| 精品一区二区三区香蕉蜜桃| 久久久精品国产免大香伊| 成人手机在线视频| 亚洲国产精品久久人人爱蜜臀| 欧美电影在哪看比较好| 激情综合网av| 国产精品久久久久久亚洲伦| 欧美性高清videossexo| 蜜臀久久久99精品久久久久久| 亚洲精品一区二区三区精华液| 成人免费视频一区二区| 毛片av中文字幕一区二区| 国产日韩精品久久久|