// // Created by cleon on 22-9-25. // #include "EventLoopThreadPool.h" #include "EventLoopThread.h" #include EventLoopThreadPool::EventLoopThreadPool(EventLoop* baseLoop, const std::string& nameArg) : baseLoop_(baseLoop) , name_(nameArg) , started_(false) , numThreads_(0) , next_(0) { } EventLoopThreadPool::~EventLoopThreadPool() { } void EventLoopThreadPool::start(const ThreadInitCallback& cb) { started_ = true; for (int i = 0; i < numThreads_; i++) { char buf[name_.size() + 32]; snprintf(buf, sizeof buf, "%s%d", name_.c_str(), i); EventLoopThread* t = new EventLoopThread(cb, buf); threads_.push_back((std::unique_ptr(t))); loops_.push_back(t->startLoop()); } if (numThreads_ == 0 && cb) { cb(baseLoop_); } } EventLoop* EventLoopThreadPool::getNextLoop() { EventLoop* loop = nullptr; if (!loops_.empty()) { loop = loops_[next_]; ++next_; if (next_ >= loops_.size()) { next_ = 0; } } return loop; } std::vector EventLoopThreadPool::getAllLoops() { if (loops_.empty()) { return std::vector(1, baseLoop_); } else { return loops_; } }