asyncdispatcher.cpp

main 72 lines · 2 KB Raw
Alex Alex Commit Client Upload Part 2 19/10/2026 00:06
1/*
2 * Copyright (c) 2010-2017 OTClient <https://github.com/edubart/otclient>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22
23#include "asyncdispatcher.h"
24
25AsyncDispatcher g_asyncDispatcher;
26
27void AsyncDispatcher::init()
28{
29 spawn_thread();
30}
31
32void AsyncDispatcher::terminate()
33{
34 stop();
35 m_tasks.clear();
36}
37
38void AsyncDispatcher::spawn_thread()
39{
40 m_running = true;
41 m_threads.push_back(std::thread(std::bind(&AsyncDispatcher::exec_loop, this)));
42}
43
44void AsyncDispatcher::stop()
45{
46 m_mutex.lock();
47 m_running = false;
48 m_condition.notify_all();
49 m_mutex.unlock();
50 for(std::thread& thread : m_threads)
51 thread.join();
52 m_threads.clear();
53};
54
55void AsyncDispatcher::exec_loop() {
56 std::unique_lock<std::mutex> lock(m_mutex);
57 while(true) {
58 while(m_tasks.size() == 0 && m_running)
59 m_condition.wait(lock);
60
61 if(!m_running)
62 return;
63
64 std::function<void()> task = m_tasks.front();
65 m_tasks.pop_front();
66
67 lock.unlock();
68 task();
69 lock.lock();
70 }
71}
72
Top