]> git.ipfire.org Git - thirdparty/squid.git/blob - src/base/AsyncCallQueue.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / base / AsyncCallQueue.cc
1 /*
2 * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9 /* DEBUG: section 41 Event Processing */
10
11 #include "squid.h"
12 #include "base/AsyncCall.h"
13 #include "base/AsyncCallQueue.h"
14 #include "Debug.h"
15
16 AsyncCallQueue *AsyncCallQueue::TheInstance = 0;
17
18 AsyncCallQueue::AsyncCallQueue(): theHead(NULL), theTail(NULL)
19 {
20 }
21
22 void AsyncCallQueue::schedule(AsyncCall::Pointer &call)
23 {
24 assert(call != NULL);
25 assert(!call->theNext);
26 if (theHead != NULL) { // append
27 assert(!theTail->theNext);
28 theTail->theNext = call;
29 theTail = call;
30 } else { // create queue from cratch
31 theHead = theTail = call;
32 }
33 }
34
35 // Fire all scheduled calls; returns true if at least one call was fired.
36 // The calls may be added while the current call is in progress.
37 bool
38 AsyncCallQueue::fire()
39 {
40 const bool made = theHead != NULL;
41 while (theHead != NULL)
42 fireNext();
43 return made;
44 }
45
46 void
47 AsyncCallQueue::fireNext()
48 {
49 AsyncCall::Pointer call = theHead;
50 theHead = call->theNext;
51 call->theNext = NULL;
52 if (theTail == call)
53 theTail = NULL;
54
55 debugs(call->debugSection, call->debugLevel, "entering " << *call);
56 call->make();
57 debugs(call->debugSection, call->debugLevel, "leaving " << *call);
58 }
59
60 AsyncCallQueue &
61 AsyncCallQueue::Instance()
62 {
63 // TODO: how to remove this frequent check while supporting early calls?
64 if (!TheInstance)
65 TheInstance = new AsyncCallQueue();
66
67 return *TheInstance;
68 }
69