内容简介:kqueue是FreeBSD当中提供的io多路复用机制,由于上一篇在介绍epoll()的时候被告知有敏感词,不让发,那kqueue()的具体介绍也就只能往后延一下了,这里着重介绍redis是如何包装的其一般的api调用如下:关键api如下:
kqueue是FreeBSD当中提供的io多路复用机制,由于上一篇在介绍epoll()的时候被告知有敏感词,不让发,那kqueue()的具体介绍也就只能往后延一下了,这里着重介绍 redis 是如何包装的
点击( 此处 )折叠或打开
- typedef struct aeApiState {
- int kqfd ;
- struct kevent * events ;
- } aeApiState ;
其一般的api调用如下:
点击( 此处 )折叠或打开
- static int aeApiCreate ( aeEventLoop * eventLoop ) {
- aeApiState * state = zmalloc ( sizeof ( aeApiState ) ) ;
- if ( ! state ) return - 1 ;
- state - > events = zmalloc ( sizeof ( struct kevent ) * eventLoop - > setsize ) ;
- if ( ! state - > events ) {
- zfree ( state ) ;
- return - 1 ;
- }
- state - > kqfd = kqueue ( ) ;
- if ( state - > kqfd = = - 1 ) {
- zfree ( state - > events ) ;
- zfree ( state ) ;
- return - 1 ;
- }
- eventLoop - > apidata = state ;
- return 0 ;
- }
- static int aeApiResize ( aeEventLoop * eventLoop , int setsize ) {
- aeApiState * state = eventLoop - > apidata ;
- state - > events = zrealloc ( state - > events , sizeof ( struct kevent ) * setsize ) ;
- return 0 ;
- }
- static void aeApiFree ( aeEventLoop * eventLoop ) {
- aeApiState * state = eventLoop - > apidata ;
- close ( state - > kqfd ) ;
- zfree ( state - > events ) ;
- zfree ( state ) ;
- }
- static int aeApiAddEvent ( aeEventLoop * eventLoop , int fd , int mask ) {
- aeApiState * state = eventLoop - > apidata ;
- struct kevent ke ;
- if ( mask & AE_READABLE ) {
- EV_SET ( & ke , fd , EVFILT_READ , EV_ADD , 0 , 0 , NULL ) ;
- if ( kevent ( state - > kqfd , & ke , 1 , NULL , 0 , NULL ) = = - 1 ) return - 1 ;
- }
- if ( mask & AE_WRITABLE ) {
- EV_SET ( & ke , fd , EVFILT_WRITE , EV_ADD , 0 , 0 , NULL ) ;
- if ( kevent ( state - > kqfd , & ke , 1 , NULL , 0 , NULL ) = = - 1 ) return - 1 ;
- }
- return 0 ;
- }
- static void aeApiDelEvent ( aeEventLoop * eventLoop , int fd , int mask ) {
- aeApiState * state = eventLoop - > apidata ;
- struct kevent ke ;
- if ( mask & AE_READABLE ) {
- EV_SET ( & ke , fd , EVFILT_READ , EV_DELETE , 0 , 0 , NULL ) ;
- kevent ( state - > kqfd , & ke , 1 , NULL , 0 , NULL ) ;
- }
- if ( mask & AE_WRITABLE ) {
- EV_SET ( & ke , fd , EVFILT_WRITE , EV_DELETE , 0 , 0 , NULL ) ;
- kevent ( state - > kqfd , & ke , 1 , NULL , 0 , NULL ) ;
- }
- }
- static char * aeApiName ( void ) {
- return "kqueue" ;
- }
关键api如下:
点击( 此处 )折叠或打开
- static int aeApiPoll ( aeEventLoop * eventLoop , struct timeval * tvp ) {
- aeApiState * state = eventLoop - > apidata ;
- int retval , numevents = 0 ;
- if ( tvp ! = NULL ) {
- struct timespec timeout ;
- timeout . tv_sec = tvp - > tv_sec ;
- timeout . tv_nsec = tvp - > tv_usec * 1000 ;
- retval = kevent ( state - > kqfd , NULL , 0 , state - > events , eventLoop - > setsize ,
- & timeout ) ;
- } else {
- retval = kevent ( state - > kqfd , NULL , 0 , state - > events , eventLoop - > setsize ,
- NULL ) ;
- }
- if ( retval > 0 ) {
- int j ;
- numevents = retval ;
- for ( j = 0 ; j < numevents ; j + + ) {
- int mask = 0 ;
- struct kevent * e = state - > events + j ;
- if ( e - > filter = = EVFILT_READ ) mask | = AE_READABLE ;
- if ( e - > filter = = EVFILT_WRITE ) mask | = AE_WRITABLE ;
- eventLoop - > fired [ j ] . fd = e - > ident ;
- eventLoop - > fired [ j ] . mask = mask ;
- }
- }
- return numevents ;
- }
还请各位看官老爷多提宝贵意见~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
汇编语言(第2版)
王爽 / 清华大学出版社 / 2008-4 / 33.00元
《汇编语言(第2版)》是各种CPU提供的机器指令的助记符的集合,人们可以用汇编语言直接控制硬件系统进行工作。汇编语言是很多相关课程(如数据结构、操作系统、微机原理等)的重要基础。为了更好地引导、帮助读者学习汇编语言,作者以循序渐进的思想精心创作了《汇编语言(第2版)》。《汇编语言(第2版)》具有如下特点:采用了全新的结构对课程的内容进行组织,对知识进行最小化分割,为读者构造了循序渐进的学习线索;在......一起来看看 《汇编语言(第2版)》 这本书的介绍吧!