github.com/igggame/nebulas-go@v2.1.0+incompatible/nbre/common/ipc/shm_queue_watcher.cpp (about)

     1  // Copyright (C) 2018 go-nebulas authors
     2  //
     3  // This file is part of the go-nebulas library.
     4  //
     5  // the go-nebulas library is free software: you can redistribute it and/or
     6  // modify
     7  // it under the terms of the GNU General Public License as published by
     8  // the Free Software Foundation, either version 3 of the License, or
     9  // (at your option) any later version.
    10  //
    11  // the go-nebulas library is distributed in the hope that it will be useful,
    12  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    14  // GNU General Public License for more details.
    15  //
    16  // You should have received a copy of the GNU General Public License
    17  // along with the go-nebulas library.  If not, see
    18  // <http://www.gnu.org/licenses/>.
    19  //
    20  #include "common/ipc/shm_queue_watcher.h"
    21  #include "core/command.h"
    22  
    23  namespace neb {
    24  namespace ipc {
    25  namespace internal {
    26  shm_queue_watcher::shm_queue_watcher(shm_queue *queue,
    27                                       shm_service_op_queue *op_queue)
    28      : m_queue(queue), m_op_queue(op_queue) {
    29  
    30    neb::core::command_queue::instance().listen_command<neb::core::exit_command>(
    31        this, [this](const std::shared_ptr<neb::core::exit_command> &) {
    32          m_queue->wake_up_if_empty();
    33        });
    34  }
    35  
    36  void shm_queue_watcher::thread_func() {
    37    while (!m_exit_flag) {
    38      std::tuple<void *, shm_type_id_t, shm_queue::element_op_tag> r =
    39          m_queue->pop_front();
    40      if (std::get<0>(r)) {
    41        std::shared_ptr<shm_service_op_recv> p =
    42            std::make_shared<shm_service_op_recv>();
    43        p->m_pointer = std::get<0>(r);
    44        p->m_type_id = std::get<1>(r);
    45        m_op_queue->push_back(p);
    46      }
    47    }
    48  }
    49  } // namespace internal
    50  } // namespace ipc
    51  } // namespace neb