]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/ipc/Forwarder.cc
4 * DEBUG: section 54 Interprocess Communication
9 #include "base/AsyncJobCalls.h"
10 #include "base/TextException.h"
11 #include "errorpage.h"
12 #include "HttpReply.h"
13 #include "HttpRequest.h"
14 #include "ipc/Forwarder.h"
16 #include "ipc/TypedMsgHdr.h"
18 CBDATA_NAMESPACED_CLASS_INIT(Ipc
, Forwarder
);
20 Ipc::Forwarder::RequestsMap
Ipc::Forwarder::TheRequestsMap
;
21 unsigned int Ipc::Forwarder::LastRequestId
= 0;
23 Ipc::Forwarder::Forwarder(Request::Pointer aRequest
, double aTimeout
):
24 AsyncJob("Ipc::Forwarder"),
25 request(aRequest
), timeout(aTimeout
)
30 Ipc::Forwarder::~Forwarder()
33 Must(request
->requestId
== 0);
37 /// perform cleanup actions
39 Ipc::Forwarder::cleanup()
44 Ipc::Forwarder::start()
48 typedef NullaryMemFunT
<Forwarder
> Dialer
;
49 AsyncCall::Pointer callback
= JobCallback(54, 5, Dialer
, this, Forwarder::handleRemoteAck
);
50 if (++LastRequestId
== 0) // don't use zero value as request->requestId
52 request
->requestId
= LastRequestId
;
53 TheRequestsMap
[request
->requestId
] = callback
;
57 request
->pack(message
);
59 // assume the pack() call failed because the message did not fit
60 // TODO: add a more specific exception?
64 SendMessage(coordinatorAddr
, message
);
65 eventAdd("Ipc::Forwarder::requestTimedOut", &Forwarder::RequestTimedOut
,
66 this, timeout
, 0, false);
70 Ipc::Forwarder::swanSong()
74 if (request
->requestId
> 0) {
75 DequeueRequest(request
->requestId
);
76 request
->requestId
= 0;
82 Ipc::Forwarder::doneAll() const
85 return request
->requestId
== 0;
88 /// called when Coordinator starts processing the request
90 Ipc::Forwarder::handleRemoteAck()
93 request
->requestId
= 0;
94 // Do not clear ENTRY_FWD_HDR_WAIT or do entry->complete() because
95 // it will trigger our client side processing. Let job cleanup close.
98 /// Ipc::Forwarder::requestTimedOut wrapper
100 Ipc::Forwarder::RequestTimedOut(void* param
)
104 Forwarder
* fwdr
= static_cast<Forwarder
*>(param
);
105 // use async call to enable job call protection that time events lack
106 CallJobHere(54, 5, fwdr
, Forwarder
, requestTimedOut
);
109 /// called when Coordinator fails to start processing the request [in time]
111 Ipc::Forwarder::requestTimedOut()
118 Ipc::Forwarder::handleError()
124 Ipc::Forwarder::handleTimeout()
129 /// terminate with an error
131 Ipc::Forwarder::handleException(const std::exception
& e
)
133 debugs(54, 3, HERE
<< e
.what());
134 mustStop("exception");
138 Ipc::Forwarder::callException(const std::exception
& e
)
142 } catch (const std::exception
& ex
) {
143 debugs(54, DBG_CRITICAL
, HERE
<< ex
.what());
145 AsyncJob::callException(e
);
148 /// returns and forgets the right Forwarder callback for the request
150 Ipc::Forwarder::DequeueRequest(unsigned int requestId
)
153 Must(requestId
!= 0);
154 AsyncCall::Pointer call
;
155 RequestsMap::iterator request
= TheRequestsMap
.find(requestId
);
156 if (request
!= TheRequestsMap
.end()) {
157 call
= request
->second
;
159 TheRequestsMap
.erase(request
);
164 /// called when we are no longer waiting for Coordinator to respond
166 Ipc::Forwarder::removeTimeoutEvent()
168 if (eventFind(&Forwarder::RequestTimedOut
, this))
169 eventDelete(&Forwarder::RequestTimedOut
, this);
173 Ipc::Forwarder::HandleRemoteAck(unsigned int requestId
)
176 Must(requestId
!= 0);
178 AsyncCall::Pointer call
= DequeueRequest(requestId
);
180 ScheduleCallHere(call
);