ceph通信(3)——AsyncMessenger启动接收线程

OSD::init
|---client_messenger->add_dispatcher_head(this) // Messenger.h void add_dispatcher_head(Dispatcher *d) 
    |---bool first = dispatchers.empty()  // 初始化时dispatcher为空,list<Dispatcher*> dispatchers
    |---dispatchers.push_front(d);
    |---ready() // void AsyncMessenger::ready()
        |---stack->ready() // PosixNetworkStack : public NetworkStack 的ready
        |---for (auto &&p : processors)
            |---p->start();  // void Processor::start()  启动work
                |---worker->center.submit_to(worker->center.get_id(), 
                           [this]() { worker->center.create_file_event(listen_socket.fd(), EVENT_READABLE, listen_handler); }, false);
                    // 执行EventCenter::create_file_event
                    |---EventCenter::FileEvent *event = _get_file_event(fd);
                    |---r = driver->add_event(fd, event->mask, mask);  // int EpollDriver::add_event(int fd, int cur_mask, int add_mask)
                        |---if (epoll_ctl(epfd, op, fd, &ee) == -1)   // 唤醒 EventCenter::process_events 
                    |---if (mask & EVENT_READABLE)  
                        |---event->read_cb = ctxt  // 读回调
                    |---if (mask & EVENT_WRITABLE) 
                        |---event->write_cb = ctxt // 写回调
        |---dispatch_queue.start()  // DispatchQueue::start()
            |---dispatch_thread.create("ms_dispatch")  // 启动线程 DispatchQueue::entry()
                |---while (true) {
                    |---while (!mqueue.empty()) {
                        |---if (qitem.is_code())
                            |---local_delivery_cond.Wait(local_delivery_lock);  
                        |---else
                            |---Message *m = qitem.get_message();
                            |---msgr->ms_deliver_dispatch(m)  // Messenger.h  ms_deliver_dispatch
                                |---for (list<Dispatcher*>::iterator p = dispatchers.begin()
                                    |---if ((*p)->ms_dispatch(m))  // OSD::ms_dispatch(Message *m) 对应的类处理函数的入口
                            |---post_dispatch(m, msize);
                                |---dispatch_throttle_release(msize)
                                    |---cond.front()->SignalOne();   //唤醒线程
                    |---cond.Wait(lock)
            |---local_delivery_thread.create("ms_local")  // 启动线程 DispatchQueue::run_local_delivery()
                |---while (true) {
                    |---if (local_messages.empty()) {
                        |---local_delivery_cond.Wait(local_delivery_lock)
                    |---fast_preprocess(m);
                        |---msgr->ms_fast_preprocess(m)
                            |---for (list<Dispatcher*>::iterator p = fast_dispatchers.begin()
                                |---(*p)->ms_fast_preprocess(m)   // OSD::ms_fast_preprocess(Message *m)
                    |---if (can_fast_dispatch(m))
                        |---msgr->ms_fast_dispatch(m)
                            |---for (list<Dispatcher*>::iterator p = fast_dispatchers.begin()
                                |---if ((*p)->ms_can_fast_dispatch(m)) 
                                    |---(*p)->ms_fast_dispatch(m)   // OSD::ms_fast_dispatch(Message *m)
                        |---post_dispatch(m, msize)
                    |---else
                        |---enqueue(m, priority, 0);  // 加入队列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值