SpiecsEngine
 
Loading...
Searching...
No Matches
Channel.h
Go to the documentation of this file.
1/**
2* @file Channel.h.
3* @brief The Channel Class Definitions.
4* @author Spices & Muduo.
5*/
6
7#pragma once
8#include "InetAddress.h"
9#include "Socket.h"
10
11#include <wepoll.h>
12#include <optional>
13
14namespace Spices {
15
16namespace Net {
17
18 /**
19 * @brief Forward Declare.
20 */
21 class EventLoop;
22
23 /**
24 * @brief Wrapper of SOCKET'S Event.
25 */
26 class Channel
27 {
28 public:
29
30 using EventCallback = std::function<void()>;
31
33 {
34 None = 0,
37 };
38
39 using EventFlags = uint32_t;
40
41 enum class PollState
42 {
43 New = 0,
44 Added = 1,
45 Deleted = 2
46 };
47
48 public:
49
50 /**
51 * @brief Constructor Function.
52 * @param[in] fd socket fd.
53 * @param[in] loop EventLoop.
54 */
55 Channel(SOCKET fd, EventLoop* loop);
56
57 /**
58 * @brief Destructor Function.
59 */
60 ~Channel() = default;
61
62 /**
63 * @brief Copy Constructor Function.
64 * @note This Class not allowed copy behaves.
65 */
66 Channel(const Channel&) = delete;
67
68 /**
69 * @brief Copy Assignment Operation.
70 * @note This Class not allowed copy behaves.
71 */
72 Channel& operator=(const Channel&) = delete;
73
74 /**
75 * @brief Handle happened events on fd.
76 */
77 void HandleEvent() const;
78
79 /**
80 * @brief Set Read Event Callback.
81 * @param[in] cb Read Event Callback.
82 */
83 void SetReadCallback(EventCallback cb)
84 {
85 m_ReadCallback = std::move(cb);
86 }
87
88 /**
89 * @brief Set Write Event Callback.
90 * @param[in] cb Write Event Callback.
91 */
92 void SetWriteCallback(EventCallback cb)
93 {
94 m_WriteCallback = std::move(cb);
95 }
96
97 /**
98 * @brief Set Close Event Callback.
99 * @param[in] cb Close Event Callback.
100 */
101 void SetCloseCallback(EventCallback cb)
102 {
103 m_CloseCallback = std::move(cb);
104 }
105
106 /**
107 * @brief Set Error Event Callback.
108 * @param[in] cb Error Event Callback.
109 */
110 void SetErrorCallback(EventCallback cb)
111 {
112 m_ErrorCallback = std::move(cb);
113 }
114
115 void Tie(const std::shared_ptr<void>& obj);
116
117 /**
118 * @brief Get this SOCKET.
119 * @return Returns this SOCKET
120 */
121 SOCKET Fd() const { return m_Fd; }
122
123 /**
124 * @brief Get this Events type.
125 * @return Returns this Events type.
126 */
127 int Events() const { return m_Events; }
128
129 /**
130 * @brief Set this REvents type.
131 * @param[in] revt Events type.
132 */
133 void SetRevents(int revt) { m_Revents = revt; }
134
135 /**
136 * @brief Enable Read event.
137 */
139 {
141 Update();
142 }
143
144 /**
145 * @brief Disable Read event.
146 */
148 {
150 Update();
151 }
152
153 /**
154 * @brief Enable Write event.
155 */
157 {
159 Update();
160 }
161
162 /**
163 * @brief Disable Write event.
164 */
166 {
168 Update();
169 }
170
171 /**
172 * @brief Disable All event.
173 */
175 {
177 Update();
178 }
179
180 /**
181 * @brief Determine whether the event is a None Event.
182 * @return Returns true if the event is a None Event, otherwise false.
183 */
184 bool IsNoneEvent() const { return m_Events == EventBits::None; }
185
186 /**
187 * @brief Determine whether the event is a Write Event.
188 * @return Returns true if the event is a Write Event, otherwise false.
189 */
190 bool IsWriting() const { return m_Events & EventBits::Write; }
191
192 /**
193 * @brief Determine whether the event is a Read Event.
194 * @return Returns true if the event is a Read Event, otherwise false.
195 */
196 bool IsReading() const { return m_Events & EventBits::Read; }
197
198 /**
199 * @brief Get Poll State.
200 * @return Returns PollState.
201 */
203
204 /**
205 * @brief Set Poll State.
206 * @param[in] state PollState.
207 */
208 void SetPollState(PollState state) { m_PollState = state; }
209
210 /**
211 * @brief Remove this Channel state from Poller.
212 */
213 void Remove();
214
215 private:
216
217 /**
218 * @brief Update this Channel state to Poller.
219 */
220 void Update();
221
222 /**
223 * @brief Internal handle happened events on fd.
224 */
225 void HandleEventsWithGuard() const;
226
227 private:
228
229 /**
230 * @brief This channel interested SOCKET.
231 */
233
234 /**
235 * @brief This channel interested EventLoop.
236 */
238
239 /**
240 * @brief This SOCKET interested Events type.
241 */
242 EventFlags m_Events;
243
244 /**
245 * @brief Current happened event type.
246 */
248
249 /**
250 * @brief This channel PollState.
251 */
253
255
256 /**
257 * @brief Read Event Callback.
258 */
260
261 /**
262 * @brief Write Event Callback.
263 */
265
266 /**
267 * @brief Close Event Callback.
268 */
270
271 /**
272 * @brief Error Event Callback.
273 */
275 };
276
277}
278
279}
#define SPICES_PROFILE_ZONE
void Listen()
Listen accept socket.
Definition Acceptor.cpp:39
std::shared_ptr< Channel > m_AcceptChannel
Acceptor Channel.
Definition Acceptor.h:92
Socket m_AcceptSocket
Acceptor Socket.
Definition Acceptor.h:87
void HandleRead() const
On Read Event Callback.
Definition Acceptor.cpp:48
Acceptor(const Acceptor &)=delete
Copy Constructor Function.
bool IsListening() const
Determine if this is in listening. @reutrn Returns true if is in listening.
Definition Acceptor.h:68
void SetConnectionCallback(const ConnectionCallback &cb)
Set ConnectionCallback.
Definition Acceptor.h:59
Acceptor(const InetAddress &listenAddress, bool reusePort)
Constructor Function.
Definition Acceptor.cpp:15
ConnectionCallback m_ConnectionCallback
ConnectionCallback.
Definition Acceptor.h:97
bool m_IsListening
Boolean of whether is in listening.
Definition Acceptor.h:102
virtual ~Acceptor()
Destructor Function.
Definition Acceptor.cpp:31
Acceptor & operator=(const Acceptor &)=delete
Copy Assignment Operation.
Wrapper of Channel and Socket, As the entrance of comm.
Definition Acceptor.h:24
Wrapper of readwrite buffer.
Definition Buffer.h:19
~Channel()=default
Destructor Function.
void Update()
Update this Channel state to Poller.
Definition Channel.cpp:48
void SetErrorCallback(EventCallback cb)
Set Error Event Callback.
Definition Channel.h:110
EventCallback m_ReadCallback
Read Event Callback.
Definition Channel.h:259
bool IsReading() const
Determine whether the event is a Read Event.
Definition Channel.h:196
EventLoop * m_Loop
This channel interested EventLoop.
Definition Channel.h:237
void SetWriteCallback(EventCallback cb)
Set Write Event Callback.
Definition Channel.h:92
Channel(const Channel &)=delete
Copy Constructor Function.
Channel(SOCKET fd, EventLoop *loop)
Constructor Function.
Definition Channel.cpp:15
EventCallback m_WriteCallback
Write Event Callback.
Definition Channel.h:264
void SetCloseCallback(EventCallback cb)
Set Close Event Callback.
Definition Channel.h:101
void SetRevents(int revt)
Set this REvents type.
Definition Channel.h:133
void DisableReading()
Disable Read event.
Definition Channel.h:147
void DisableAll()
Disable All event.
Definition Channel.h:174
Channel & operator=(const Channel &)=delete
Copy Assignment Operation.
std::optional< std::weak_ptr< void > > m_Tie
Definition Channel.h:254
int Events() const
Get this Events type.
Definition Channel.h:127
EventCallback m_ErrorCallback
Error Event Callback.
Definition Channel.h:274
void HandleEvent() const
Handle happened events on fd.
Definition Channel.cpp:23
void HandleEventsWithGuard() const
Internal handle happened events on fd.
Definition Channel.cpp:53
void Tie(const std::shared_ptr< void > &obj)
Definition Channel.cpp:38
void EnableWriting()
Enable Write event.
Definition Channel.h:156
SOCKET Fd() const
Get this SOCKET.
Definition Channel.h:121
void SetPollState(PollState state)
Set Poll State.
Definition Channel.h:208
bool IsWriting() const
Determine whether the event is a Write Event.
Definition Channel.h:190
void DisableWriting()
Disable Write event.
Definition Channel.h:165
int m_Revents
Current happened event type.
Definition Channel.h:247
void EnableReading()
Enable Read event.
Definition Channel.h:138
PollState GetPollState() const
Get Poll State.
Definition Channel.h:202
EventFlags m_Events
This SOCKET interested Events type.
Definition Channel.h:242
SOCKET m_Fd
This channel interested SOCKET.
Definition Channel.h:232
EventCallback m_CloseCallback
Close Event Callback.
Definition Channel.h:269
void Remove()
Remove this Channel state from Poller.
Definition Channel.cpp:43
PollState m_PollState
This channel PollState.
Definition Channel.h:252
bool IsNoneEvent() const
Determine whether the event is a None Event.
Definition Channel.h:184
void SetReadCallback(EventCallback cb)
Set Read Event Callback.
Definition Channel.h:83
Wrapper of SOCKET'S Event.
Definition Channel.h:27
ThreadPool of Multiple threading EventLoop.
EventLoopThreadWrapper()
Constructor Function.
Definition EventLoop.h:186
virtual ~EventLoopThreadWrapper()
Destructor Function.
static EventLoop *& GetInst(InetAddress *address=nullptr)
Get EventLoop Instance. @reutrn Returns EventLoop Instance.
EventLoop * instance
This thread EventLoop instance.
Definition EventLoop.h:204
Wrapper of Instance/Delete ThreadCache in thread.
Definition EventLoop.h:180
EventLoop & operator=(const EventLoop &)=delete
Copy Assignment Operation.
void HandleWakeUp()
Handle WakeUp notify by read one byte data.
std::vector< Functor > m_PendingFunctors
Delay functors.
Definition EventLoop.h:168
void DoPendingFunctors()
Execute all pending functors.
std::shared_ptr< Poller > m_Poller
Poller instance.
Definition EventLoop.h:148
std::atomic_bool m_IsCallingPendingFunctors
True if is execute pending functors.
Definition EventLoop.h:138
std::atomic_bool m_IsLooping
True if is in Looping.
Definition EventLoop.h:128
bool HasChannel(Channel *channel) const
Determine if channel is inside poller.
std::mutex m_Mutex
Mutex for PendingFunctors.
Definition EventLoop.h:173
EventLoop(const EventLoop &)=delete
Copy Constructor Function.
std::atomic_bool m_IsQuit
True if is quit from Looping.
Definition EventLoop.h:133
EventLoop(InetAddress *address=nullptr)
Constructor Function.
Definition EventLoop.cpp:22
void WakeUp()
WakeUp a thread, which wait on recv, by sending one byte data.
std::unique_ptr< Channel > m_WeakupChannel
Wakeup Channel.
Definition EventLoop.h:158
void Loop()
Start Event Loop.
Definition EventLoop.cpp:48
bool IsInLoopThread() const
Determine if current thread is in eventloop thread.
Definition EventLoop.h:109
void RunInLoop(Functor cb)
Push functor to pending functors.
Definition EventLoop.cpp:79
~EventLoop()
Destructor Function.
Definition EventLoop.cpp:42
Socket m_WakeupFd
Wakeup Socket.
Definition EventLoop.h:153
DWORD m_ThreadId
Thread's identify, which is running this EventLoop.
Definition EventLoop.h:143
void QueueInLoop(Functor cb)
Execute functor in EventLoop thread.
Definition EventLoop.cpp:91
void UpdateChannel(Channel *channel) const
Update channel state with poller.
void Quit()
Quit from Event Loop.
Definition EventLoop.cpp:69
ChannelList m_ActiveChannels
Channels with events.
Definition EventLoop.h:163
void RemoveChannel(Channel *channel) const
Remove channel from poller.
Wrapper of Poller and wakeup socket to acceptor(SubLoop).
Definition EventLoop.h:28
const Version GetVersion() const
Get Http Version.
Definition HttpRequest.h:89
std::string GetHeader(const std::string &name) const
Get a Header from this HttpRequest.
Http Request body.
Definition HttpRequest.h:18
HttpResponse(bool close)
Constructor Function.
void AppendToBuffer(Buffer *output)
Append this response to Buffer.
bool CloseConnection() const
Get CloseConnection.
HttpServer & operator=(const HttpServer &)=delete
Copy Assignment Operation.
HttpServer(const HttpServer &)=delete
Copy Constructor Function.
void OnRequest(const TcpConnectionPtr &connection, const HttpRequest &request)
HttpCallback m_HttpCallback
Definition HttpServer.h:75
virtual ~HttpServer()=default
Destructor Function.
void OnConnection(const TcpConnectionPtr &connection)
HttpServer(const InetAddress &listenAddress, int idleSeconds, TcpServer::Option option=TcpServer::Option::NoReusePort)
Constructor Function.
void Start(int threadSize) const
Start ThreadPool and call listen on acceptor.
WeakConnectionList m_ConnectionList
Definition HttpServer.h:78
void OnMessage(const TcpConnectionPtr &connection, Buffer *buf)
This class is Wrapper of current socket address.
Definition InetAddress.h:22
Inherit from this and Implement Specific Poller.
Definition Poller.h:25
Socket(const Socket &)=delete
Copy Constructor Function.
void SetReuseAddress(bool on) const
Set socket reuse address option.
Definition Socket.cpp:188
void SetTcpNoDelay(bool on) const
Set socket Tcp no delay option.
Definition Socket.cpp:149
void Connect(InetAddress *connectAddress) const
Connect to socket.
Definition Socket.cpp:62
Socket & operator=(const Socket &)=delete
Copy Assignment Operation.
SOCKET m_SocketFd
This socket fd.
Definition Socket.h:142
void Send(const std::string &data) const
Send data to server.
Definition Socket.cpp:106
SOCKET Accept(InetAddress *peerAddress) const
Accept connection on socket.
Definition Socket.cpp:83
Socket()=default
Constructor Function.
void BindAddress(const InetAddress &localAddress) const
Bind address to socket.
Definition Socket.cpp:36
void Create()
Create Non Blocking Socket.
Definition Socket.cpp:27
virtual ~Socket()
Destructor Function.
Definition Socket.cpp:14
std::string Receive() const
Receive data from server.
Definition Socket.cpp:119
SOCKET Fd()
Get this socket fd.
Definition Socket.h:66
Socket(SOCKET socketFd)
Constructor Function.
Definition Socket.h:30
const SOCKET Fd() const
Get this socket fd.
Definition Socket.h:60
void SetKeepAlive(bool on) const
Set socket keep alive option.
Definition Socket.cpp:175
void SetReusePort(bool on) const
Set socket reuse port option.
Definition Socket.cpp:162
void ShutDownWrite() const
Disable writen in socket.
Definition Socket.cpp:136
void Listen() const
Listen on socket.
Definition Socket.cpp:49
This class is Wrapper of socket.
Definition Socket.h:18
Combine of Socket Connection data.
void SetThreadInitCallback(const ThreadInitCallback &cb)
Set Thread initialize Call back.
Definition TcpServer.h:71
void AddMessageCallback(const DelegateMessageCallback::Agent &cb)
Add Message Call back.
Definition TcpServer.h:89
void Start(int threadSize) const
Start ThreadPool and call listen on acceptor.
Definition TcpServer.cpp:46
std::shared_ptr< EventLoopThreadPool > m_ThreadPool
ThreadPool.
Definition TcpServer.h:145
void NewConnection(SOCKET socketFd, const InetAddress &peerAddress)
Handle New Connection to Acceptor.
Definition TcpServer.cpp:57
void RemoveConnectionInLoop(const TcpConnectionPtr &connection)
Remove a TcpConnection InLoop.
Definition TcpServer.cpp:97
TcpServer(const TcpServer &)=delete
Copy Constructor Function.
ConnectionMap m_Connections
All TcpConnections.
Definition TcpServer.h:175
DelegateWriteCompleteCallback m_WriteCompleteCallback
WriteCompleteCallback.
Definition TcpServer.h:160
void RemoveConnection(const TcpConnectionPtr &connection)
Remove a TcpConnection.
Definition TcpServer.cpp:92
TcpServer(const InetAddress &listenAddress, Option option=Option::NoReusePort)
Constructor Function.
Definition TcpServer.cpp:16
TcpServer & operator=(const TcpServer &)=delete
Copy Assignment Operation.
ThreadInitCallback m_ThreadInitCallback
ThreadInitCallback.
Definition TcpServer.h:165
std::unique_ptr< Acceptor > m_Acceptor
Acceptor.
Definition TcpServer.h:140
std::string m_IpPort
TcpServer Ip and Port.
Definition TcpServer.h:135
void AddConnectionCallback(const DelegateConnectionCallback::Agent &cb)
Add Connection Call back.
Definition TcpServer.h:80
virtual ~TcpServer()
Destructor Function.
Definition TcpServer.cpp:33
DelegateConnectionCallback m_ConnectionCallback
ConnectionCallback.
Definition TcpServer.h:150
int m_NextConnectedId
Next Connection id.
Definition TcpServer.h:170
DelegateMessageCallback m_MessageCallback
MessageCallback.
Definition TcpServer.h:155
void AddWriteCompleteCallback(const DelegateWriteCompleteCallback::Agent &cb)
Add WriteComplete Call back.
Definition TcpServer.h:98
Sample of a TcpServer.
Definition TcpServer.h:29