| 101 | |
| 102 | public: |
| 103 | int DaemonMain(const std::vector<std::wstring>& cmdline) |
| 104 | { |
| 105 | std::unique_lock ul(m_queueLock); |
| 106 | m_msgQueue.emplace(MessageType::Init, &cmdline); |
| 107 | while (!m_msgQueue.empty()) |
| 108 | { |
| 109 | auto [msgType, msgArg] = m_msgQueue.front(); |
| 110 | m_msgQueue.pop(); |
| 111 | ul.unlock(); |
| 112 | switch (msgType) |
| 113 | { |
| 114 | case MessageType::Init: |
| 115 | OnInit(*std::get<const std::vector<std::wstring>*>(msgArg)); |
| 116 | break; |
| 117 | case MessageType::Exception: |
| 118 | OnException(std::get<std::exception_ptr>(msgArg)); |
| 119 | break; |
| 120 | case MessageType::Exit: |
| 121 | return 0; |
| 122 | case MessageType::Reload: |
| 123 | OnInit(cmdline); |
| 124 | break; |
| 125 | default: |
| 126 | MarkUnreachable(); |
| 127 | } |
| 128 | ul.lock(); |
| 129 | if (m_msgQueue.empty()) |
| 130 | { |
| 131 | m_queueCV.wait(ul, [&]() |
| 132 | { |
| 133 | return !m_msgQueue.empty(); |
| 134 | }); |
| 135 | } |
| 136 | } |
| 137 | MarkUnreachable(); |
| 138 | } |
| 139 | |
| 140 | private: |
| 141 | void OnInit(const std::vector<std::wstring>& cmdline) |
no test coverage detected