]> git.ipfire.org Git - thirdparty/squid.git/blame - src/adaptation/Initiate.cc
Updates for running on squid-cache.org
[thirdparty/squid.git] / src / adaptation / Initiate.cc
CommitLineData
2e4a5466 1/*
68854a41 2 * DEBUG: section 93 ICAP (RFC 3507) Client
2e4a5466
AR
3 */
4
5#include "squid.h"
6#include "HttpMsg.h"
7#include "adaptation/Service.h"
8#include "adaptation/Initiator.h"
9#include "adaptation/Initiate.h"
10
11namespace Adaptation {
12
13// AdaptInitiator::noteAdaptionAnswer Dialer locks/unlocks the message in transit
14// TODO: replace HTTPMSGLOCK with general RefCounting and delete this class
15class AnswerDialer: public UnaryMemFunT<Initiator, HttpMsg*>
16{
17public:
18 typedef UnaryMemFunT<Initiator, HttpMsg*> Parent;
19
20 AnswerDialer(Initiator *obj, Parent::Method meth, HttpMsg *msg):
21 Parent(obj, meth, msg) { HTTPMSGLOCK(arg1); }
22 AnswerDialer(const AnswerDialer &d):
23 Parent(d) { HTTPMSGLOCK(arg1); }
24 virtual ~AnswerDialer() { HTTPMSGUNLOCK(arg1); }
25};
26
27} // namespace Adaptation
28
29
30/* Initiate */
31
32Adaptation::Initiate::Initiate(const char *aTypeName,
33 Initiator *anInitiator, ServicePointer aService):
34 AsyncJob(aTypeName), theInitiator(anInitiator), theService(aService)
35{
36 assert(theService != NULL);
37 assert(theInitiator);
38}
39
40Adaptation::Initiate::~Initiate()
41{
b8af5c82
AR
42 // TODO: we cannot assert(!theInitiator) because that fails if a child
43 // constructor fails. AsyncJob should have wasStarted flag so that we
44 // can assert(!(wasStarted && theInitiator)).
2e4a5466
AR
45}
46
47// internal cleanup
48void Adaptation::Initiate::swanSong()
49{
50 debugs(93, 5, HERE << "swan sings" << status());
51
52 if (theInitiator) {
53 debugs(93, 3, HERE << "fatal failure; sending abort notification");
54 tellQueryAborted(true); // final by default
55 }
56
57 debugs(93, 5, HERE << "swan sang" << status());
58}
59
60void Adaptation::Initiate::clearInitiator()
61{
62 if (theInitiator)
63 theInitiator.clear();
64}
65
66void Adaptation::Initiate::sendAnswer(HttpMsg *msg)
67{
68 assert(msg);
69 if (theInitiator.isThere()) {
70 CallJob(93, 5, __FILE__, __LINE__, "Initiator::noteAdaptAnswer",
71 AnswerDialer(theInitiator.ptr(), &Initiator::noteAdaptationAnswer, msg));
72 }
73 clearInitiator();
74}
75
76
77void Adaptation::Initiate::tellQueryAborted(bool final)
78{
79 if (theInitiator.isThere()) {
80 CallJobHere1(93, 5, theInitiator.ptr(),
81 Initiator::noteAdaptationQueryAbort, final);
82 }
83 clearInitiator();
84}
85
86Adaptation::Service &
87Adaptation::Initiate::service()
88{
89 assert(theService != NULL);
90 return *theService;
91}
92
93const char *Adaptation::Initiate::status() const {
a0b91cde 94 return AsyncJob::status(); // for now
2e4a5466
AR
95}
96
97
98/* InitiatorHolder */
99
100Adaptation::InitiatorHolder::InitiatorHolder(Initiator *anInitiator):
101 prime(0), cbdata(0)
102{
103 if (anInitiator) {
104 cbdata = cbdataReference(anInitiator->toCbdata());
105 prime = anInitiator;
106 }
107}
108
109Adaptation::InitiatorHolder::InitiatorHolder(const InitiatorHolder &anInitiator):
110 prime(0), cbdata(0)
111{
112 if (anInitiator != NULL && cbdataReferenceValid(anInitiator.cbdata)) {
113 cbdata = cbdataReference(anInitiator.cbdata);
114 prime = anInitiator.prime;
115 }
116}
117
118Adaptation::InitiatorHolder::~InitiatorHolder()
119{
120 clear();
121}
122
123void Adaptation::InitiatorHolder::clear() {
124 if (prime) {
125 prime = NULL;
126 cbdataReferenceDone(cbdata);
127 }
128}
129
130Adaptation::Initiator *Adaptation::InitiatorHolder::ptr()
131{
132 assert(isThere());
133 return prime;
134}
135
136bool
137Adaptation::InitiatorHolder::isThere() {
138 return prime && cbdataReferenceValid(cbdata);
139}
140
141// should not be used
142Adaptation::InitiatorHolder &
143Adaptation::InitiatorHolder::operator =(const InitiatorHolder &anInitiator)
144{
145 assert(false);
146 return *this;
147}