很好的代码风格

  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  : guanzhongdaoke@gmail.com
 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
posted on 2008-08-19 16:46  风荷小筑  阅读(768)  评论(2编辑  收藏  举报