redis源码阅读之ae_kqueue

栏目: 数据库 · 发布时间: 5年前

内容简介:kqueue是FreeBSD当中提供的io多路复用机制,由于上一篇在介绍epoll()的时候被告知有敏感词,不让发,那kqueue()的具体介绍也就只能往后延一下了,这里着重介绍redis是如何包装的其一般的api调用如下:关键api如下:

kqueue是FreeBSD当中提供的io多路复用机制,由于上一篇在介绍epoll()的时候被告知有敏感词,不让发,那kqueue()的具体介绍也就只能往后延一下了,这里着重介绍 redis 是如何包装的

点击( 此处 )折叠或打开

  1. typedef struct aeApiState {
  2.      int kqfd ;
  3.     struct kevent * events ;
  4. } aeApiState ;

其一般的api调用如下:

点击( 此处 )折叠或打开

  1. static int aeApiCreate ( aeEventLoop * eventLoop ) {
  2.     aeApiState * state = zmalloc ( sizeof ( aeApiState ) ) ;
  3.      if ( ! state ) return - 1 ;
  4.     state - > events = zmalloc ( sizeof ( struct kevent ) * eventLoop - > setsize ) ;
  5.      if ( ! state - > events ) {
  6.         zfree ( state ) ;
  7.         return - 1 ;
  8.      }
  9.     state - > kqfd = kqueue ( ) ;
  10.      if ( state - > kqfd = = - 1 ) {
  11.         zfree ( state - > events ) ;
  12.         zfree ( state ) ;
  13.         return - 1 ;
  14.      }
  15.     eventLoop - > apidata = state ;
  16.     return 0 ;
  17. }
  18. static int aeApiResize ( aeEventLoop * eventLoop , int setsize ) {
  19.     aeApiState * state = eventLoop - > apidata ;
  20.     state - > events = zrealloc ( state - > events , sizeof ( struct kevent ) * setsize ) ;
  21.     return 0 ;
  22. }
  23. static void aeApiFree ( aeEventLoop * eventLoop ) {
  24.     aeApiState * state = eventLoop - > apidata ;
  25.     close ( state - > kqfd ) ;
  26.     zfree ( state - > events ) ;
  27.     zfree ( state ) ;
  28. }
  29. static int aeApiAddEvent ( aeEventLoop * eventLoop , int fd , int mask ) {
  30.     aeApiState * state = eventLoop - > apidata ;
  31.     struct kevent ke ;
  32.      if ( mask & AE_READABLE ) {
  33.         EV_SET ( & ke , fd , EVFILT_READ , EV_ADD , 0 , 0 , NULL ) ;
  34.          if ( kevent ( state - > kqfd , & ke , 1 , NULL , 0 , NULL ) = = - 1 ) return - 1 ;
  35.      }
  36.      if ( mask & AE_WRITABLE ) {
  37.         EV_SET ( & ke , fd , EVFILT_WRITE , EV_ADD , 0 , 0 , NULL ) ;
  38.          if ( kevent ( state - > kqfd , & ke , 1 , NULL , 0 , NULL ) = = - 1 ) return - 1 ;
  39.      }
  40.     return 0 ;
  41. }
  42. static void aeApiDelEvent ( aeEventLoop * eventLoop , int fd , int mask ) {
  43.     aeApiState * state = eventLoop - > apidata ;
  44.     struct kevent ke ;
  45.      if ( mask & AE_READABLE ) {
  46.         EV_SET ( & ke , fd , EVFILT_READ , EV_DELETE , 0 , 0 , NULL ) ;
  47.         kevent ( state - > kqfd , & ke , 1 , NULL , 0 , NULL ) ;
  48.      }
  49.      if ( mask & AE_WRITABLE ) {
  50.         EV_SET ( & ke , fd , EVFILT_WRITE , EV_DELETE , 0 , 0 , NULL ) ;
  51.         kevent ( state - > kqfd , & ke , 1 , NULL , 0 , NULL ) ;
  52.      }
  53. }
  54. static char * aeApiName ( void ) {
  55.     return "kqueue" ;
  56. }

关键api如下:

点击( 此处 )折叠或打开

  1. static int aeApiPoll ( aeEventLoop * eventLoop , struct timeval * tvp ) {
  2.     aeApiState * state = eventLoop - > apidata ;
  3.      int retval , numevents = 0 ;
  4.      if ( tvp ! = NULL ) {
  5.         struct timespec timeout ;
  6.         timeout . tv_sec = tvp - > tv_sec ;
  7.         timeout . tv_nsec = tvp - > tv_usec * 1000 ;
  8.         retval = kevent ( state - > kqfd , NULL , 0 , state - > events , eventLoop - > setsize ,
  9.                          & timeout ) ;
  10.      } else {
  11.         retval = kevent ( state - > kqfd , NULL , 0 , state - > events , eventLoop - > setsize ,
  12.                          NULL ) ;
  13.      }
  14.      if ( retval > 0 ) {
  15.          int j ;
  16.         numevents = retval ;
  17.          for ( j = 0 ; j < numevents ; j + + ) {
  18.              int mask = 0 ;
  19.             struct kevent * e = state - > events + j ;
  20.              if ( e - > filter = = EVFILT_READ ) mask | = AE_READABLE ;
  21.              if ( e - > filter = = EVFILT_WRITE ) mask | = AE_WRITABLE ;
  22.             eventLoop - > fired [ j ] . fd = e - > ident ;
  23.             eventLoop - > fired [ j ] . mask = mask ;
  24.          }
  25.      }
  26.     return numevents ;
  27. }

还请各位看官老爷多提宝贵意见~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

绝对价值

绝对价值

[美] 伊塔马尔·西蒙森 艾曼纽·罗森 / 钱峰 / 中国友谊出版公司 / 2014-7 / 45.00元

绝对价值指的是经用户体验的产品质量,即使用某件产品或者享受某项服务的切实感受。 过去,消费就像是押宝。一件商品好不好,一家餐馆的环境如何,没有亲身体验过消费者无从得知,只能根据营销人员提供的有限信息去猜测。品牌、原产地、价位、广告,这些重要的质量线索左右着消费者的选择。 然而,互联网和新兴科技以一种前所未有的速度改变了商业环境。当消费者可以在购买前查看到交易记录和消费者评价,通过便捷的......一起来看看 《绝对价值》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具