| 12 | } |
| 13 | |
| 14 | void AsyncWorkQueue::WorkerThreadMain() |
| 15 | { |
| 16 | redisServerThreadVars vars; |
| 17 | serverTL = &vars; |
| 18 | |
| 19 | vars.clients_pending_asyncwrite = listCreate(); |
| 20 | |
| 21 | m_mutex.lock(); |
| 22 | m_vecpthreadVars.push_back(&vars); |
| 23 | m_mutex.unlock(); |
| 24 | |
| 25 | while (!m_fQuitting) |
| 26 | { |
| 27 | std::unique_lock<std::mutex> lock(m_mutex); |
| 28 | if (m_workqueue.empty()) |
| 29 | m_cvWakeup.wait(lock); |
| 30 | |
| 31 | aeThreadOnline(); |
| 32 | while (!m_workqueue.empty()) |
| 33 | { |
| 34 | WorkItem task = std::move(m_workqueue.front()); |
| 35 | m_workqueue.pop_front(); |
| 36 | |
| 37 | lock.unlock(); |
| 38 | serverTL->gcEpoch = g_pserver->garbageCollector.startEpoch(); |
| 39 | task.fnAsync(); |
| 40 | g_pserver->garbageCollector.endEpoch(serverTL->gcEpoch); |
| 41 | lock.lock(); |
| 42 | } |
| 43 | |
| 44 | lock.unlock(); |
| 45 | serverTL->gcEpoch = g_pserver->garbageCollector.startEpoch(); |
| 46 | if (listLength(serverTL->clients_pending_asyncwrite)) { |
| 47 | aeAcquireLock(); |
| 48 | ProcessPendingAsyncWrites(); |
| 49 | aeReleaseLock(); |
| 50 | } |
| 51 | g_pserver->garbageCollector.endEpoch(serverTL->gcEpoch); |
| 52 | serverTL->gcEpoch.reset(); |
| 53 | aeThreadOffline(); |
| 54 | } |
| 55 | |
| 56 | listRelease(vars.clients_pending_asyncwrite); |
| 57 | |
| 58 | std::unique_lock<fastlock> lockf(serverTL->lockPendingWrite); |
| 59 | serverTL->vecclientsProcess.clear(); |
| 60 | serverTL->clients_pending_write.clear(); |
| 61 | std::atomic_thread_fence(std::memory_order_seq_cst); |
| 62 | } |
| 63 | |
| 64 | bool AsyncWorkQueue::removeClientAsyncWrites(client *c) |
| 65 | { |
nothing calls this directly
no test coverage detected