很好的代码风格
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
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