Commit 8ddb61d6ea85b17d92c6b6e9ce5ebc84f8f04836
1 parent
260643dc
Fix race condition in thread creation
Showing
3 changed files
with
6 additions
and
5 deletions
mainapp.cpp
| @@ -252,8 +252,7 @@ void MainApp::start() | @@ -252,8 +252,7 @@ void MainApp::start() | ||
| 252 | for (int i = 0; i < NR_OF_THREADS; i++) | 252 | for (int i = 0; i < NR_OF_THREADS; i++) |
| 253 | { | 253 | { |
| 254 | std::shared_ptr<ThreadData> t(new ThreadData(i, subscriptionStore, *confFileParser.get())); | 254 | std::shared_ptr<ThreadData> t(new ThreadData(i, subscriptionStore, *confFileParser.get())); |
| 255 | - std::thread thread(do_thread_work, t.get()); | ||
| 256 | - t->moveThreadHere(std::move(thread)); | 255 | + t->start(&do_thread_work); |
| 257 | threads.push_back(t); | 256 | threads.push_back(t); |
| 258 | } | 257 | } |
| 259 | 258 |
threaddata.cpp
| @@ -13,9 +13,9 @@ ThreadData::ThreadData(int threadnr, std::shared_ptr<SubscriptionStore> &subscri | @@ -13,9 +13,9 @@ ThreadData::ThreadData(int threadnr, std::shared_ptr<SubscriptionStore> &subscri | ||
| 13 | epollfd = check<std::runtime_error>(epoll_create(999)); | 13 | epollfd = check<std::runtime_error>(epoll_create(999)); |
| 14 | } | 14 | } |
| 15 | 15 | ||
| 16 | -void ThreadData::moveThreadHere(std::thread &&thread) | 16 | +void ThreadData::start(thread_f f) |
| 17 | { | 17 | { |
| 18 | - this->thread = std::move(thread); | 18 | + this->thread = std::thread(f, this); |
| 19 | 19 | ||
| 20 | pthread_t native = this->thread.native_handle(); | 20 | pthread_t native = this->thread.native_handle(); |
| 21 | std::ostringstream threadName; | 21 | std::ostringstream threadName; |
threaddata.h
| @@ -20,6 +20,8 @@ | @@ -20,6 +20,8 @@ | ||
| 20 | #include "authplugin.h" | 20 | #include "authplugin.h" |
| 21 | #include "logger.h" | 21 | #include "logger.h" |
| 22 | 22 | ||
| 23 | +typedef void (*thread_f)(ThreadData *); | ||
| 24 | + | ||
| 23 | class ThreadData | 25 | class ThreadData |
| 24 | { | 26 | { |
| 25 | std::unordered_map<int, Client_p> clients_by_fd; | 27 | std::unordered_map<int, Client_p> clients_by_fd; |
| @@ -39,7 +41,7 @@ public: | @@ -39,7 +41,7 @@ public: | ||
| 39 | ThreadData(const ThreadData &other) = delete; | 41 | ThreadData(const ThreadData &other) = delete; |
| 40 | ThreadData(ThreadData &&other) = delete; | 42 | ThreadData(ThreadData &&other) = delete; |
| 41 | 43 | ||
| 42 | - void moveThreadHere(std::thread &&thread); | 44 | + void start(thread_f f); |
| 43 | void quit(); | 45 | void quit(); |
| 44 | void giveClient(Client_p client); | 46 | void giveClient(Client_p client); |
| 45 | Client_p getClient(int fd); | 47 | Client_p getClient(int fd); |