很好的代码风格

  1  #ifndef  _LC_COBRA_EPOLLER_H
  2  #define   _LC_COBRA_EPOLLER_H
  3 
  4 
  5 
  6  /*
  7  * Copyright(c)2008
  8  *
  9  * 文件名称: Epoller
 10  * 文件标识:
 11  * 摘    要: Epoller是我自己封装的epoll,仿照
 12              Windows平台的IOCP(完成端口)来实现类似
 13              的一套高性能的网络底层io策略。
 14              Epoller实现的原理是:
 15              但个线程来循环我们的epoll来等待底层的网络事件
 16              当有事件的时候,我们就把这些事件对应的数据放入
 17              到我们的上层Epoller缓冲队列中,并且发出信号,通知
 18              阻塞在这个上面的线程可以取数据去处理。
 19  *
 20  * 当前版本: cobra 1.05
 21  * 作    者: 关中刀客
 22  * E-Mail  : [email protected]
 23  * Blog    :  http://guan-zhong-dao-ke.blog.163.com/
 24  * 完成时间: 2008年04月28日
 25  */
 26 
 27 
 28  #include  " ../common/Header.h "
 29  #include  < sys / epoll.h >
 30  #include  < sys / socket.h >
 31  #include  < pthread.h >
 32  #include  < semaphore.h >
 33 
 34 
 35  class    EpollerEvent;
 36  class    Epoller
 37  {
 38  public :
 39       /*
 40          需要监听的套接字Epoller消息
 41       */
 42       enum  EPOLLERMESSAGE
 43      {
 44          EPOLLERREAD,
 45          EPOLLERWRITE
 46      };
 47 
 48  private :
 49       int                   m_epoller;    //  epoller句柄
 50      pthread_mutex_t      m_lock;       //  中间队列的锁
 51      pthread_cond_t       m_cond;       //  条件变量锁
 52      sem_t                m_sem;        //  主轮循等待线程处理的信号量
 53      Queue < EpollerEvent, EmptyLock >   m_queue;   //  中间的数据结构缓冲队列 
 54 
 55  public :
 56      Epoller();
 57       ~ Epoller();
 58 
 59  public :
 60       /*
 61          初始化epoller
 62          queuesize : 初始化的时候我们的缓冲队列默认的大小
 63          number    : 处理的数目
 64       */
 65       bool    init_epoller(size_t queuesize, size_t number);
 66       /*
 67          向epoller注册套接字需要监听事件
 68          sock   :   指定的套接字
 69          iMsg   :   注册到Epoller上的消息
 70          pEvent :   指定的事件数据体
 71       */
 72       bool    register_epoller_socket_event(SOCKET sock,  int  iMsg, EpollerEvent *  pEvent);
 73       /*
 74          改变Epoller中套接字监听的事件
 75          sock   :   指定的套接字
 76          iMsg   :   注册到Epoller上的消息
 77          pEvent :   指定的事件数据体
 78       */
 79       bool    change_epoller_socket_event(SOCKET sock,  int  iMsg, EpollerEvent *  pEvent);
 80       /*
 81          删除Epoller中套接字的所有事件
 82       */
 83       void    delete_epoller_socket_event(SOCKET sock,  int  iMsg);
 84       /*
 85          向Epoller发送指定的事件
 86          pEvent :   指定的事件结构体
 87          通常情况下,我们使用这个函数控制各Epoller线程的退出
 88          类似于windows下的PostQueuedCompletionStatus
 89       */
 90       void    post_event_to_epoller(EpollerEvent *  pEvent);
 91       /*
 92          得到Epoller中的事件结构体数据
 93          pEvent :  表示得到的数据体
 94          一般情况下,这个函数由各Epoller线程函数调用,然后回得到指定的事件,
 95          然后根据事件的信息去处理
 96          类似于windows下的GetQueuedCompletionStatus
 97       */
 98       bool    get_event_from_epoller(EpollerEvent *  pEvent, size_t timeout);
 99       /*
100          单独线程来循环Epoller主循环,检测套接字的事件
101          timeout :  超时的时间
102       */
103       int     listen_epoller_event( int  timeout);
104       /*
105          销毁epoller
106       */
107       void    destroy_epoller();
108  };
109  extern   Epoller  g_Epoller;
110 
111 
112  #endif

你可能感兴趣的:(代码)