読書に便利なソースコード(D):チャネルクラス

チャンネル、パッケージには、ファイルディスクリプタfdのにすることができます。

構造体チャンネル:プライベートコピー不可{ 
  チャンネル(EventBase * ベースint型のfd、int型のイベント)。
  チャンネル(); 
  EventBase * getBase(){ 戻りbase_。}
   int型の FD(){ 戻りFD_。} 

  // 通道のID 
  int64_d IDは、(){   戻りID_。}
   短いイベント(){   戻りevents_と、}
   // 关闭通道
  ボイド近いです(); 

  無効 onRead(CONSTタスク&readcb){readcb_ = readcb。}
   のボイドonWrite(CONSTタスク&writecb){writecb_ = writecb。}
   ボイド onRead(タスク&& readcb){readcb_ = STD ::移動(readcb)。}
   ボイド onWrite(タスク&& writecb){writecb_ = STD ::移動(writecb)。} 

  // 启动读写监听
  空隙 enableRead(BOOL イネーブル)
   enableWrite(BOOL 有効)。
   enableReadWrite(ブール読める、ブール書き込み可能)。
  BOOL )(readEnabled。
  BOOL )(writeEnabled。

  // 处理读写事件
  ボイドhandleRead(){readcb_()。}
  ボイドhandleWrite(){writecb_()。} 

保護
  EventBase * base_。
  PollerBase * poller_。
  int型FD_;
  短いevents_; 
  int64_tのID_; 
  std ::機能 < 無効()> readcb_、writecb_、errorcb_。
}。

その実装は以下のとおりです。

チャンネル::チャネル(EventBase * ベースint型のfd、int型のイベント):base_(ベース)、FD_(FD)、events_(イベント){ 
  fatalif(ネット:: setNonBlock(FD_) < 0" チャンネル設定以外のブロックに失敗しました" );
  静的原子<int64_tの> ID(0 )。
  ID_ = ++ ID; 
  poller_ = ベース - > IMP _-> poller_。
  poller_ - > addChannel(この); 
} 

チャネル::Channle(){ 
  クローズ(); 
} 

のボイドChannle :: enableRead(BOOL イネーブル){
   場合(イネーブル){ 
    events_ | = kReadEvent。
  } { 
    events_&=〜KReadEvent。
  } 
  poller_ - > updateChannel(
} 

ボイドチャネル:: enableWrite(BOOL イネーブル){
   場合(イネーブル){ 
    events_ | = kWriteEvent。
  } { 
    events_&=〜kWriteEvent。
  } 
  poller_ - > updateChannel(
}

チャンネル:: enableReadWrite(ブール読める、ブール書き込み可能){
   場合(読み){ 
    events_ | = kReadEvent。
  } { 
    events_&=〜kReadEvent。
  } 
  場合(書き込み可能){ 
    events_ | = kWriteEvent。
  } { 
    events_&=〜kWriteEvent。
  } 
  poller_ - > updateChannel(
} 

ボイドチャネル::近い(){
   場合(FD_が> = 0 ){
    トレース(" 近いチャネル%LD FD%D "、(長い)ID_、FD_)。
    poller_ - > removeChannel(この); 
    ::近い(FD_)。
    FD_ = - 1 
    handleRead(); 
  } 
} 

BOOL チャネル:: readEnabled(){
   戻り events_&kReadEvent。
} 

BOOL チャネル:: writeEnabled(){
   戻り events_&kWriteEvent。
}

 

おすすめ

転載: www.cnblogs.com/sssblog/p/11586775.html