/ src / common / interop / async_message_queue.h
async_message_queue.h
 1  #pragma once
 2  #include <queue>
 3  #include <thread>
 4  #include <mutex>
 5  #include <condition_variable>
 6  #include <string>
 7  
 8  class AsyncMessageQueue
 9  {
10  private:
11      std::mutex queue_mutex;
12      std::queue<std::wstring> message_queue;
13      std::condition_variable message_ready;
14      bool interrupted = false;
15  
16      //Disable copy
17      AsyncMessageQueue(const AsyncMessageQueue&);
18      AsyncMessageQueue& operator=(const AsyncMessageQueue&);
19  
20  public:
21      AsyncMessageQueue()
22      {
23      }
24      void queue_message(std::wstring message)
25      {
26          this->queue_mutex.lock();
27          this->message_queue.push(message);
28          this->queue_mutex.unlock();
29          this->message_ready.notify_one();
30      }
31      std::wstring pop_message()
32      {
33          std::unique_lock<std::mutex> lock(this->queue_mutex);
34          while (message_queue.empty() && !this->interrupted)
35          {
36              this->message_ready.wait(lock);
37          }
38          if (this->interrupted)
39          {
40              //Just returns a empty string if the queue was interrupted.
41              return std::wstring(L"");
42          }
43          std::wstring message = this->message_queue.front();
44          this->message_queue.pop();
45          return message;
46      }
47      void interrupt()
48      {
49          this->queue_mutex.lock();
50          this->interrupted = true;
51          this->queue_mutex.unlock();
52          this->message_ready.notify_all();
53      }
54  };