首先来预览一下主Reactor头文件:
namespace atlas {
/// 主 Reactor:仅负责 accept 新连接,分发给 SubReactor,就是对Reactor加上了连接请求和分发给SubReactor
class MainReactor : public Reactor {
public:
MainReactor(uint16_t port, int subReactorCount = 4, int maxEvents = 1024);
~MainReactor();
void start();
void stop();
SubReactor* nextSubReactor();
void forEachSubReactor(std::function<void(SubReactor*)> f);
void setNewConnectionCallback(std::function<void(int, const std::string&, SubReactor*)> cb) {
newConnectionCallback_ = std::move(cb);
}
TcpServer* server() { return &server_; }
private:
void handleEvents(const std::vectorEpoll::Event& events) override;
void handleAccept();
TcpServer server_;
std::vector<std::unique_ptr<SubReactor>> subReactors_;
std::vector<std::thread> subThreads_;
std::atomic<size_t> nextSubIndex_{0};
std::function<void(int, const std::string&, SubReactor*)> newConnectionCallback_;
};
} // namespace atlas
首先初始化的三个参数是端口号,从reactor的数量和最大事件数量,start就是抽一个从reactor进去循环,quit就是先停止然后让从reactor退出。
再来看看从Reactor的头文件:
namespace atlas {
/// 从 Reactor:处理 I/O 读写事件,每个 SubReactor 运行在独立线程
class SubReactor : public Reactor {
public:
SubReactor(int index, int maxEvents = 1024);
~SubReactor() override;
void addConnection(int fd, ConnectionType type, const std::string& clientIp = "",
const std::shared_ptr<Connection>& peer = nullptr,
const std::string& initialSend = "");
/// 设置客户端连接建立后的回调(用于设置 message/close 等)
void setClientSetup(std::function<void(Connection*)> cb) { clientSetup_ = std::move(cb); }
/// 设置后端连接建立后的回调(backend, client)
void setBackendSetup(std::function<void(Connection*, Connection*)> cb) { backendSetup_ = std::move(cb); }
void removeConnection(const std::shared_ptr<Connection>& conn);
std::shared_ptr<Connection> getConnection(int fd) const;
int index() const { return index_; }
void runInLoop(std::function<void()> cb);
void queueInLoop(std::function<void()> cb);
private:
void handleEvents(const std::vectorEpoll::Event& events) override;
void handleNewConnection(int fd, ConnectionType type, const std::string& clientIp,
const std::shared_ptr
const std::string& initialSend);
void handleConnectionEvent(const std::shared_ptr
int index_;
std::unordered_map<int, std::shared_ptr<Connection>> connections_;
int wakeupFd_{-1}; // eventfd for runInLoop
std::vector<std::function<void()>> pendingFunctors_;
std::mutex pendingMutex_;
std::function<void(Connection*)> clientSetup_;
std::function<void(Connection*, Connection*)> backendSetup_;
};
} // namespace atlas
浙公网安备 33010602011771号