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

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

?? fifo.c

?? 7號信令功能代碼,為開源代碼
?? C
字號:
/* *  fifo.c - FIFO pseudo-driver * *  This pseudo-driver is used for FIFOs and pipes.  Note that the queue *  pairs for this pseudo-driver become the stream head; thus the use of *  strrput and strwsrv in the qinit structures. * *  Since Linux has FIFOs and pipes implemented in the kernel (and they *  monopolize the S_IFIFO file type), this pseudo-driver manages FIFOs *  as character minor devices.  Since Linux also limits the number of *  minor devices per major number to 256, this pseudo-driver manages *  multiple major numbers in order to support more than 256 minor devices. *  They are list-managed, and so can be allocated/freed in effectively *  constant time.  The open()/close() entry points in this file serve *  primarily to support the FIFO minor device pool; the remainder of *  the necessary support for FIFOs and pipes is in the stream head code. * *  Minor device 0 for each major is a clonable; it will never be actually *  used as an open stream.  Thus, 255 minor numbers are available per *  major number. * *  Copyright (C) 2000  John A. Boyd Jr.  protologos, LLC * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Library General Public *  License as published by the Free Software Foundation; either *  version 2 of the License, or (at your option) any later version. *  *  This library is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Library General Public License for more details. *  *  You should have received a copy of the GNU Library General Public *  License along with this library; if not, write to the *  Free Software Foundation, Inc., 59 Temple Place - Suite 330, Cambridge, *  MA 02139, USA. */#ident "@(#) LiS fifo.c 1.10 12/15/02"#include <sys/LiS/config.h>#include <sys/stream.h>#include <sys/stropts.h>#ifdef LINUX#include <linux/errno.h>#else#include <sys/errno.h>#endif#include <sys/cmn_err.h>#include <sys/LiS/head.h>    /* for lis_strrput/lis_strwsrv */#include <sys/lislocks.h>	/* semaphores */#include <linux/list.h>#include <sys/osif.h>/* *  Some configuration sanity checks */#ifndef FIFO_#error Not configured#endif#ifndef FIFO__ID#define FIFO__ID 0xfef0#endif#ifndef FIFO__CMAJORS#error The number of major numbers must be defined#endif#ifndef FIFO__UNITS#define FIFO__UNITS 256#endif#define  MOD_ID   FIFO__ID#define  MOD_NAME "fifo"/* *  per-minor device (i.e., per-open) info */typedef struct _fifo_dev {    short index;              /* self-index */    short flags;              /* see below  */    struct list_head list;    /* for free/used lists */} fifo_dev_t;#define FIFO_CLONABLE    0x01#define FIFO_ALLOCATED   0x02int fifo_units = FIFO__UNITS;     /* total number of units (i.e., minors) */fifo_dev_t fifo_dev[FIFO__UNITS];  /* elems 0 mod minor() not used */static LIST_HEAD(free_fifos);static int num_free_fifos = 0;#if 0static LIST_HEAD(used_fifos);static int num_used_fifos = 0;#endifextern int fifo__0_majors[];          /* in streams.o via modconf */static lis_semaphore_t fifo_sem;  /* for allocating minor numbers */static int fifo_initialized = 0;/* *  function prototypes */static int  fifo_open(queue_t *, dev_t*, int, int, cred_t *);static int  fifo_close(queue_t *, int, cred_t *);/* *  module structure */static struct module_info fifo_minfo ={     MOD_ID,            /* id */    MOD_NAME,          /* name */    0,                 /* min packet size accepted */    INFPSZ,            /* max packet size accepted */    10240L,            /* highwater mark */    512L               /* lowwater mark */};static struct qinit fifo_rinit = {    lis_strrput,       /* put */    lis_strrsrv,       /* service */    fifo_open,         /* open */    fifo_close,        /* close */    NULL,              /* admin */    &fifo_minfo,       /* info */    NULL               /* stat */};static struct qinit fifo_winit = {     NULL,              /* put */    lis_strwsrv,       /* service */    NULL,              /* open */    NULL,              /* close */    NULL,              /* admin */    &fifo_minfo,       /* info */    NULL               /* stat */};struct streamtab fifo_info ={    &fifo_rinit,       /* read queue init */    &fifo_winit,       /* write queue init */    NULL,              /* lower mux read queue init */    NULL               /* lower mux write queue init */};static inline int fifo_major_index( int maj ){    int idx;    for (idx = 0;  idx < FIFO__CMAJORS;  idx++)	if (fifo__0_majors[idx] == maj)	    return(idx);    return(-ENOENT);}static inline int fifo_unit_index( dev_t dev ){    int idx = fifo_major_index(MAJOR(dev));    dev_t maxminor_dev = MKDEV(0,0x0000ffff) ;    if (idx < 0)	return(idx);    idx = idx * (MINOR(maxminor_dev)+1) + MINOR(dev) ;    if (idx >= fifo_units)	return(-ENXIO);    return(idx);}static dev_t fifo_mkdev(int dev_major, int unit_index){    dev_t maxminor_dev = MKDEV(0,0x0000ffff) ;    int   maxminor = MINOR(maxminor_dev)+1 ;    return(MKDEV(dev_major + (unit_index / maxminor),					    unit_index % maxminor)) ;}static int fifo_alloc( int idx ){    fifo_dev_t *fdp;    if (idx > fifo_units)	return -ENXIO;    if (list_empty(&free_fifos))	return -EMFILE;    if (idx < 0) {	struct list_head *e = free_fifos.next;	fdp = list_entry( e, fifo_dev_t, list );    } else	fdp = &(fifo_dev[idx]);    if (fdp->flags & FIFO_ALLOCATED)	return -EBUSY;    fdp->flags |= FIFO_ALLOCATED;    list_del(&(fdp->list));  num_free_fifos--;#if 0    list_add( &(fdp->list), &(used_fifos) );  num_used_fifos++;#endif    return fdp->index;}static void fifo_free( int idx ){    fifo_dev_t *fdp;    if (idx < 0 || idx >= fifo_units)  return;    fdp = &(fifo_dev[idx]);    if (!(fdp->flags & FIFO_ALLOCATED))  return;    fdp->flags &= ~FIFO_ALLOCATED;#if 0    list_del(&(fdp->list));  num_used_fifos--;#endif    list_add( &(fdp->list), free_fifos.prev );  num_free_fifos++;}/* *  open */static int fifo_open( queue_t *q, dev_t *devp,		      int flag, int sflag,		      cred_t *credp ){    int m;    int dev_major ;#ifdef FIFO_DEBUG    cmn_err( CE_CONT,	     "%s_open( 0x%p, 0x%x, 0x%x, 0x%x, ... )\n",	     MOD_NAME, q, *devp, flag, sflag );#endif    lis_down(&fifo_sem);    /*     *  we allow a clone open both ways: 0 minors are clonables     */    m = (sflag == CLONEOPEN ? 0 : fifo_unit_index(*devp));    dev_major = MAJOR(*devp) ;    if (m < 0) {	lis_up(&fifo_sem);	return(m);     /* m is an error code */    }    if (fifo_dev[m].flags & FIFO_CLONABLE)  {	/*	 *  select any unused unit	 */	if ((m = fifo_alloc(-1)) < 0)  {	    lis_up(&fifo_sem);	    return(m);   /* m is an error code */	}    } else {	/*	 *  select the requested unit if unused	 */	if (!(q->q_ptr)) {	    if ((m = fifo_alloc(m)) < 0) {		lis_up(&fifo_sem);		return(m);	    }	}    }    if (!q->q_ptr) {	RD(q)->q_ptr = WR(q)->q_ptr = (void *) &(fifo_dev[m]);	/*	 *  simulate a FIFO by linking WR(q) -> RD(q);  the head might	 *  also do this, but just in case...	 */	WR(q)->q_next = RD(q);	qprocson(q);	MOD_INC_USE_COUNT;    }    *devp = fifo_mkdev(dev_major, m) ;    lis_up(&fifo_sem);#ifdef FIFO_DEBUG    cmn_err( CE_CONT,	     "%s_open( 0x%p, 0x%x, ... ) unit %d OK\n",	     MOD_NAME, q, *devp, m );#endif    return 0;	/* OK */}/* *  close */static int fifo_close( queue_t *q, int flag, cred_t *credp ){    fifo_dev_t *fdp = (fifo_dev_t *) q->q_ptr;#ifdef FIFO_DEBUG    cmn_err( CE_CONT,	     "%s_close( 0x%p, 0x%x, ... ) unit %d\n",	     MOD_NAME, q, flag, fdp->index );#endif    lis_down(&fifo_sem);    fifo_free( fdp->index );    /*     *  undo FIFO/pipe queue linkage     */    if (WR(q)->q_next) {	if (!SAMESTR(WR(q)) && (WR(WR(q)->q_next)->q_next == RD(q))) {	    /*	     *  pipe linkage - unlink other side - we need to do this	     *  so that SAMESTR works on the second stream after the	     *  first stream's queues are deallocated	     */	    WR(WR(q)->q_next)->q_next = NULL;	}	WR(q)->q_next = NULL;    }    RD(q)->q_ptr = WR(q)->q_ptr = NULL;    lis_up(&fifo_sem);    qprocsoff(q);    MOD_DEC_USE_COUNT;    return 0;	/* success */} #if 0/* *  wput */static void fifo_wput( queue_t *q, mblk_t *mp ){    fifo_dev_t *fdp = (fifo_dev_t *) q->q_ptr;#ifdef FIFO_DEBUG    cmn_err( CE_CONT,	     "%s_wput( 0x%08x, 0x%08x ) unit %d\n", MOD_NAME,	     q, mp, fdp->index );#endif    /*     *  this is a driver - we should NAK IOCTLs we don't handle     *  (which means all of them)     */    switch (mp->b_datap->db_type) {    case M_IOCTL:	mp->b_datap->db_type = M_IOCNAK;	qreply( q, mp );	break;    default:	putnext( q, mp );   /* this goes to our RD(q) */	break;    }}/* *  wsrv */static void fifo_wsrv( queue_t *q ){    fifo_dev_t *fdp = (fifo_dev_t *) q->q_ptr;    mblk_t *mp;#ifdef FIFO_DEBUG    cmn_err( CE_CONT,	     "%s_wsrv( 0x%08x ) unit %d\n", MOD_NAME,	     q, fdp->index );#endif    while ((mp = getq(q))) {	/*	 *  this is a driver - we should NAK IOCTLs we don't handle	 *  (which means all of them)	 */	switch (mp->b_datap->db_type) {	case M_IOCTL:	    mp->b_datap->db_type = M_IOCNAK;	    qreply( q, mp );	    break;	default:	    putnext( q, mp );  /* this goes to our RD(q) */	    break;	}    }}/* *  rput */static void fifo_rput( queue_t *q, mblk_t *mp ){    fifo_dev_t *fdp = (fifo_dev_t *) q->q_ptr;#ifdef FIFO_DEBUG    cmn_err( CE_CONT,	     "%s_rput( 0x%08x, 0x%08x ) unit %d\n", MOD_NAME,	     q, mp, fdp->index );#endif    putnext( q, mp );}/* *  rsrv */static void fifo_rsrv( queue_t *q ){    fifo_dev_t *fdp = (fifo_dev_t *) q->q_ptr;    mblk_t *mp;#ifdef FIFO_DEBUG    cmn_err( CE_CONT, "%s_rsrv( 0x%08x ) unit %d\n", MOD_NAME,	     q, fdp->index );#endif    while ((mp = getq(q))) {	putnext( q, mp );    }}#endif/* *  initialization/termination * *  These can be invoked one of two ways: *   . for modules, it is easiest to call them from [init,cleanup]_module *   . otherwise, specify "initialize" and "terminate" in Config */void fifo_init(void){    int i;    dev_t maxminor_dev = MKDEV(0,0x0000ffff) ;    int   maxminor = MINOR(maxminor_dev)+1 ;#ifdef FIFO_DEBUG    cmn_err( CE_CONT, "%s_init() #%d\n", MOD_NAME, fifo_initialized );#endif    /*     *  only initialize once (per load)...     */    if (fifo_initialized++)  return;    /*     *  initialize major/minor device data     */    for (i = 0;  i < fifo_units;  i++) {	fifo_dev_t *fdp = &(fifo_dev[i]);	/*	 *  initialize per-unit data -	 *	 *  we treat the index 'i' as a device number of sorts here; we	 *  let major() and minor() split it into parts.  This works as	 *  long as the low x bits are minor number, and the upper y	 *  bits are major.	 */	fdp->index = i;	if ((i % maxminor) != 0) {	    fdp->flags = 0;	    list_add( &(fdp->list), free_fifos.prev );	    num_free_fifos++;	}  else {	    fdp->flags = FIFO_CLONABLE;	    INIT_LIST_HEAD(&(fdp->list));	    /*	     *  indicate that this is a FIFO pseudo device that allows	     *  minors to reopen	     */	    LIS_DEVFLAGS(fifo__0_majors[i/maxminor]) |=		LIS_MODFLG_FIFO | LIS_MODFLG_REOPEN;	}    }#ifdef FIFO_DEBUG    cmn_err( CE_CONT, "%s_init() %d units available\n", MOD_NAME,	     num_free_fifos );#endif        lis_sem_init( &fifo_sem, 1 );}void fifo_term(void){#ifdef FIFO_DEBUG    cmn_err( CE_CONT, "%s_term() #%d\n", MOD_NAME, fifo_initialized );#endif    if (--fifo_initialized)  return;    SEM_DESTROY(&fifo_sem);}#ifdef LINUX#ifdef MODULE/* *  Linux loadable module interface */int init_module(void){    int ret = lis_register_strdev( FIFO__CMAJOR_0, &fifo_info,				   fifo_units, MOD_NAME );    if (ret < 0) {	cmn_err( CE_CONT,		 "%s - unable to register driver.\n",		 MOD_NAME );	return ret;    }    fifo_init();    return 0;}void cleanup_module(void){    fifo_term();    if (lis_unregister_strdev(FIFO__CMAJOR_0) < 0)	cmn_err( CE_CONT,		 "%s - unable to unregister driver.\n",		 MOD_NAME );    return;}#endif#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区三区三区| 久久精品男人天堂av| 亚洲综合色噜噜狠狠| 91亚洲午夜精品久久久久久| 国产欧美久久久精品影院| 国产黄色精品视频| 国产精品女主播av| 99久久免费精品高清特色大片| 亚洲欧美日韩中文字幕一区二区三区| av电影一区二区| 一区二区高清视频在线观看| 欧美乱熟臀69xxxxxx| 日韩在线卡一卡二| 久久亚洲精精品中文字幕早川悠里| 国产精一品亚洲二区在线视频| 久久久国产午夜精品| 99精品偷自拍| 日本成人在线视频网站| 久久久影院官网| 色偷偷一区二区三区| 日本不卡视频在线观看| 久久久综合网站| 日本丶国产丶欧美色综合| 五月激情丁香一区二区三区| 精品国产污网站| 91视视频在线观看入口直接观看www| 夜夜嗨av一区二区三区四季av| 欧美一区二区三区四区高清| 国产宾馆实践打屁股91| 一片黄亚洲嫩模| 亚洲精品一线二线三线无人区| 不卡的av中国片| 日本成人超碰在线观看| 中文字幕一区在线观看| 91麻豆精品国产综合久久久久久| 国产成人精品三级麻豆| 午夜不卡av免费| ㊣最新国产の精品bt伙计久久| 欧美福利视频一区| www.视频一区| 国产一区二区三区在线观看免费视频| 一二三区精品福利视频| 国产日韩欧美精品综合| 91精品久久久久久久久99蜜臂| 懂色av一区二区在线播放| 日韩黄色小视频| 亚洲精品欧美在线| 久久婷婷综合激情| 日韩视频免费直播| 日韩欧美成人一区| 日本乱人伦一区| 粉嫩在线一区二区三区视频| 日本中文字幕一区二区视频 | 亚洲va欧美va人人爽| 日本一二三四高清不卡| 日韩精品一区二区三区蜜臀| 色噜噜狠狠色综合欧洲selulu| 国产一区二区三区美女| 美女网站视频久久| 亚洲一二三四在线| 最新成人av在线| 国产精品视频在线看| 久久综合色婷婷| 欧美成人女星排名| 91精品在线观看入口| 欧美日韩一区久久| 欧美日韩一区 二区 三区 久久精品 | 欧美一级二级三级蜜桃| 欧美日韩在线免费视频| 色综合天天综合网天天狠天天 | 日韩成人av影视| 午夜激情久久久| 婷婷综合另类小说色区| 亚洲不卡在线观看| 婷婷综合久久一区二区三区| 亚洲成人av资源| 五月天精品一区二区三区| 亚洲一区二区精品视频| 一个色妞综合视频在线观看| 一区二区高清视频在线观看| 夜夜爽夜夜爽精品视频| 亚洲一卡二卡三卡四卡无卡久久| 亚洲精品视频在线| 亚洲中国最大av网站| 亚洲午夜精品一区二区三区他趣| 一个色妞综合视频在线观看| 亚洲国产精品尤物yw在线观看| 亚洲国产aⅴ天堂久久| 亚洲成人精品在线观看| 日韩电影在线观看一区| 免费日本视频一区| 国内欧美视频一区二区| 国产精品亚洲专一区二区三区| 成人做爰69片免费看网站| 不卡av免费在线观看| 日本精品一区二区三区高清| 最新中文字幕一区二区三区 | 国产亚洲午夜高清国产拍精品 | 91丨九色丨黑人外教| 在线精品亚洲一区二区不卡| 欧美日韩在线亚洲一区蜜芽| 日韩一级片在线观看| 国产日本欧美一区二区| 综合亚洲深深色噜噜狠狠网站| 一区二区三区丝袜| 石原莉奈在线亚洲二区| 国产精品性做久久久久久| 91视视频在线观看入口直接观看www | 日本丰满少妇一区二区三区| 欧美日韩免费一区二区三区| 日韩美女在线视频| 国产精品久99| 日日夜夜免费精品视频| 国产在线视频精品一区| 99国产精品久久久久久久久久久| 欧美性猛片aaaaaaa做受| 精品国内片67194| 亚洲日本中文字幕区| 美腿丝袜亚洲综合| 91免费在线视频观看| 日韩欧美国产一区在线观看| 中文字幕一区二区三| 日本一不卡视频| 91免费国产在线观看| 精品欧美黑人一区二区三区| 亚洲欧洲在线观看av| 美女www一区二区| 在线观看区一区二| 久久久久久久网| 亚洲国产精品久久久久秋霞影院 | 欧美一区二区三区在线看| 欧美激情资源网| 日本三级韩国三级欧美三级| 97se狠狠狠综合亚洲狠狠| 欧美成va人片在线观看| 亚洲一区二区三区中文字幕在线| 韩国欧美一区二区| 欧美伦理视频网站| 亚洲精品国产品国语在线app| 国产综合一区二区| 欧美日韩免费在线视频| 亚洲另类春色校园小说| 国产91丝袜在线播放九色| 欧美一区二区三区在线| 一区二区在线观看免费视频播放| 国产麻豆欧美日韩一区| 日韩欧美国产wwwww| 亚洲成av人片www| 欧美网站一区二区| 一区二区三区四区视频精品免费 | 亚洲视频在线观看三级| 高清不卡在线观看| 久久综合九色综合欧美亚洲| 午夜视频久久久久久| 欧美三片在线视频观看| 亚洲蜜臀av乱码久久精品| caoporen国产精品视频| 久久精品视频在线免费观看| 欧美a级理论片| 欧美一区日本一区韩国一区| 香蕉成人啪国产精品视频综合网| 国产精品青草久久| 丁香激情综合国产| 国产精品日韩成人| av动漫一区二区| 亚洲精品少妇30p| 欧美综合视频在线观看| 亚洲制服丝袜一区| 欧美日韩一卡二卡三卡| 日韩高清不卡一区二区| 91.麻豆视频| 蜜臀国产一区二区三区在线播放| 欧美一级理论片| 精品亚洲成a人在线观看 | 欧美国产禁国产网站cc| 成人深夜福利app| 国产精品每日更新在线播放网址 | 欧美一级高清片| 国产精品综合二区| 国产精品久久久久久户外露出 | 91欧美一区二区| 亚洲国产三级在线| 在线不卡的av| 日韩电影在线看| 久久久一区二区三区| 成人av电影在线观看| 亚洲精品成人天堂一二三| 欧美肥妇free| 国产真实乱对白精彩久久| 欧美激情一区不卡| 在线观看亚洲a| 美女视频黄 久久| 国产色爱av资源综合区| 99精品国产热久久91蜜凸| 亚洲精品欧美在线| 精品精品国产高清一毛片一天堂| 国产成人自拍高清视频在线免费播放| 国产精品成人免费精品自在线观看 | 国产精品一区二区91| 亚洲免费毛片网站|