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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? zbuflib.c

?? vxworks的完整的源代碼
?? 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 */	{

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品福利一区二区三区av| 亚洲欧美色一区| 日韩欧美精品在线| 日韩亚洲欧美一区二区三区| 欧美久久一二三四区| 欧美日韩中文另类| 欧美日韩一区在线观看| 欧美日韩黄色影视| 欧美一区二区三区色| 欧美一级理论性理论a| 日韩欧美在线观看一区二区三区| 欧美一区二区三区不卡| 日韩一区二区麻豆国产| 日韩精品综合一本久道在线视频| 日韩欧美一区二区三区在线| 精品国产露脸精彩对白| 国产亚洲精品aa| 成人免费视频在线观看| 亚洲影视在线观看| 日韩电影在线观看电影| 狂野欧美性猛交blacked| 国产精品一级在线| 成人av小说网| 91高清视频在线| 欧美一区二区三区精品| 精品播放一区二区| 国产精品欧美综合在线| 亚洲欧美日韩一区二区| 成人一级片在线观看| 国模冰冰炮一区二区| 欧美伊人久久久久久久久影院| 色欧美片视频在线观看在线视频| 99视频精品在线| 精品视频免费看| 欧美日韩久久一区二区| 日韩一级片网站| 精品日韩在线一区| 国产精品久久三| 日韩电影免费在线看| 亚洲一区二区高清| 麻豆传媒一区二区三区| 国产在线国偷精品产拍免费yy| www.日韩av| 欧美高清视频一二三区 | 欧美一区二区免费视频| 久久亚洲春色中文字幕久久久| 国产亚洲欧美在线| 亚洲欧洲成人精品av97| 免费黄网站欧美| aaa欧美色吧激情视频| 在线看国产日韩| 欧美精品在线观看播放| 国产女人aaa级久久久级| 一区二区三区精密机械公司| 麻豆精品国产传媒mv男同| 国产成人啪免费观看软件| 91玉足脚交白嫩脚丫在线播放| 欧美亚洲一区二区在线观看| 欧美v日韩v国产v| 国产精品伦理一区二区| 亚洲bdsm女犯bdsm网站| 国产一区二区在线视频| 欧美在线免费播放| 日韩一区二区三区精品视频| 欧美激情一区二区三区全黄| 香港成人在线视频| 国产精品亚洲午夜一区二区三区 | 免费高清视频精品| 成人深夜视频在线观看| 欧美日韩国产首页在线观看| 久久久综合视频| 亚洲午夜私人影院| 国产在线观看一区二区| 欧美日韩久久一区二区| 欧美韩国日本一区| 日韩在线一区二区| av在线不卡电影| 久久综合色8888| 国产精品伦理一区二区| 久久精品国产精品亚洲精品| 成人黄动漫网站免费app| 久久亚洲欧美国产精品乐播| 日日夜夜一区二区| 91最新地址在线播放| 欧美精品一区二区三区在线播放| 亚洲高清在线视频| 99久久免费精品| av亚洲精华国产精华精华| 国产精品无圣光一区二区| 91视频你懂的| 国产精品乱码妇女bbbb| 国产最新精品精品你懂的| 欧美一区二区三区四区高清| 国产精品国产三级国产三级人妇| 久久不见久久见免费视频7| 欧美三级日韩三级国产三级| 亚洲综合在线电影| 欧美老肥妇做.爰bbww视频| 欧美视频在线一区二区三区| 欧美军同video69gay| 亚洲精品久久久久久国产精华液| 国产乱码字幕精品高清av| 欧美一区三区二区| 亚洲va韩国va欧美va精品| 在线免费观看成人短视频| 国产精品电影一区二区三区| 丁香亚洲综合激情啪啪综合| 精品久久久久久久久久久院品网| 丝袜亚洲精品中文字幕一区| 欧美亚洲国产一区二区三区va| 国产日产欧产精品推荐色| 美女一区二区视频| 欧美一级片免费看| 日本视频在线一区| 欧美一区日韩一区| 日韩国产欧美在线视频| 欧美午夜精品理论片a级按摩| 国产精品欧美经典| 国产成人av影院| 久久免费看少妇高潮| 国产麻豆精品视频| 精品毛片乱码1区2区3区| 免费成人av资源网| 久久婷婷一区二区三区| 国产在线精品一区二区不卡了| 久久综合资源网| 国产99精品国产| 中文字幕一区二区三区色视频 | 中文字幕一区二区三区精华液 | 亚洲一区二区视频| 欧美一区二区视频在线观看| 美女免费视频一区二区| 亚洲精品一区二区三区影院 | 国产一区二区三区不卡在线观看 | 国产另类ts人妖一区二区| xfplay精品久久| 成熟亚洲日本毛茸茸凸凹| 国产亚洲综合在线| 国产综合久久久久久久久久久久| 国产精品久久久久影院老司| 日本久久电影网| 日韩精品欧美成人高清一区二区| 精品黑人一区二区三区久久| 国产成人综合在线| 亚洲青青青在线视频| 在线电影欧美成精品| 国内精品伊人久久久久av影院| 国产精品视频在线看| 91在线国产福利| 韩国av一区二区三区在线观看 | 九九**精品视频免费播放| 久久久天堂av| 色婷婷久久久综合中文字幕| 午夜影视日本亚洲欧洲精品| 日韩欧美三级在线| 国产麻豆视频一区| 亚洲二区视频在线| 久久久久亚洲蜜桃| 色综合天天综合网天天狠天天| 日韩精品一二区| 国产精品免费视频网站| 欧美精品久久一区二区三区| 经典三级一区二区| 亚洲啪啪综合av一区二区三区| 99久久久国产精品| 亚洲成av人片一区二区三区| 精品99一区二区三区| 色婷婷av一区二区| 国产在线看一区| 五月激情综合网| 国产精品国产三级国产aⅴ中文 | 成人精品视频.| 天堂av在线一区| 国产女人aaa级久久久级| 欧美日韩国产欧美日美国产精品| 国产精品88888| 亚洲成人久久影院| 国产日韩精品视频一区| 欧美妇女性影城| 成人av电影在线播放| 蜜臀av性久久久久蜜臀aⅴ | 在线成人av网站| 不卡一区中文字幕| 乱中年女人伦av一区二区| 亚洲另类在线一区| 欧美精品一区二区在线观看| 在线亚洲+欧美+日本专区| 成人综合婷婷国产精品久久蜜臀| 日本大胆欧美人术艺术动态| 亚洲精品高清在线| 日本一区二区三区国色天香| 91精品在线麻豆| 欧美日韩综合在线| 色哟哟精品一区| 91在线视频网址| 成人av小说网| 国产成人夜色高潮福利影视| 蜜桃在线一区二区三区| 亚洲国产一区二区在线播放| 亚洲摸摸操操av|