2024-12-25 19:37:28 +08:00
|
|
|
#include "io_thread.hpp"
|
|
|
|
#include "logger.hpp"
|
|
|
|
#include "reactor.hpp"
|
|
|
|
#include "coroutine.hpp"
|
|
|
|
#include "tcp_connection.hpp"
|
2025-01-21 16:35:26 +08:00
|
|
|
#include "tcp_server.hpp"
|
2025-01-14 15:27:15 +08:00
|
|
|
#include <memory>
|
2025-01-16 14:41:46 +08:00
|
|
|
#include <mutex>
|
2024-12-25 19:37:28 +08:00
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
|
|
|
|
namespace tinyrpc {
|
|
|
|
static thread_local Reactor* t_reactor = nullptr;
|
|
|
|
static thread_local IOThread* t_ioThread = nullptr;
|
|
|
|
|
2025-01-10 15:00:50 +08:00
|
|
|
|
|
|
|
// static IOThread* getThisIoThread() {
|
|
|
|
// return t_ioThread;
|
|
|
|
// }
|
|
|
|
|
|
|
|
IOThread::IOThread() : m_thread(&IOThread::mainFunc, this) {
|
|
|
|
logger() << "IO Thread is built";
|
2024-12-25 19:37:28 +08:00
|
|
|
}
|
|
|
|
|
2025-01-14 15:27:15 +08:00
|
|
|
|
2025-01-10 15:00:50 +08:00
|
|
|
|
2025-01-21 16:35:26 +08:00
|
|
|
void IOThread::addClient(TcpServer* ser, int fd) {
|
2025-01-14 15:27:15 +08:00
|
|
|
|
2025-01-21 16:35:26 +08:00
|
|
|
m_clients[fd] = std::make_shared<TcpConnection>(fd, *m_reactor, *ser);
|
2025-01-14 15:27:15 +08:00
|
|
|
|
2024-12-25 19:37:28 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void IOThread::mainFunc() {
|
|
|
|
if(t_ioThread) {
|
|
|
|
logger() << "this thread already built!";
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(t_reactor) {
|
|
|
|
logger() << "this thread:" << std::this_thread::get_id() << " already has reactor!";
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
t_ioThread = this;
|
2025-01-10 15:00:50 +08:00
|
|
|
m_reactor = t_reactor = new Reactor(Reactor::ReactorType::Sub);
|
2024-12-25 19:37:28 +08:00
|
|
|
Coroutine::getMainCoroutine(); // 创建协程
|
2025-01-10 15:00:50 +08:00
|
|
|
m_reactor->loop();
|
|
|
|
}
|
|
|
|
|
|
|
|
IOThread::~IOThread() {
|
|
|
|
m_reactor->stop();
|
|
|
|
if(m_thread.joinable()) {
|
|
|
|
m_thread.join();
|
|
|
|
}
|
|
|
|
delete m_reactor;
|
2025-01-14 15:27:15 +08:00
|
|
|
t_reactor = nullptr;
|
|
|
|
t_ioThread = nullptr;
|
|
|
|
|
2024-12-25 19:37:28 +08:00
|
|
|
}
|
2025-01-16 14:41:46 +08:00
|
|
|
|
|
|
|
IOThreadPool::IOThreadPool(int size) : m_IOThreads(size, new IOThread){
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
IOThread* IOThreadPool::getIOThread() {
|
|
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(m_mtx);
|
|
|
|
if(m_idx == static_cast<int>(m_IOThreads.size() - 1)) {
|
|
|
|
m_idx = -1;
|
|
|
|
}
|
|
|
|
return m_IOThreads[++m_idx];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
IOThreadPool::~IOThreadPool() {
|
|
|
|
for(auto item : m_IOThreads) {
|
|
|
|
delete item;
|
|
|
|
}
|
|
|
|
}
|
2024-12-25 19:37:28 +08:00
|
|
|
}
|