MCPcopy Create free account
hub / github.com/Snapchat/KeyDB / WorkerThreadMain

Method WorkerThreadMain

src/AsyncWorkQueue.cpp:14–62  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

12}
13
14void 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
64bool AsyncWorkQueue::removeClientAsyncWrites(client *c)
65{

Callers

nothing calls this directly

Calls 15

listCreateFunction · 0.85
aeThreadOnlineFunction · 0.85
aeAcquireLockFunction · 0.85
aeReleaseLockFunction · 0.85
aeThreadOfflineFunction · 0.85
listReleaseFunction · 0.85
lockMethod · 0.45
unlockMethod · 0.45
emptyMethod · 0.45
waitMethod · 0.45
startEpochMethod · 0.45

Tested by

no test coverage detected