]>
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"
19 CBDATA_NAMESPACED_CLASS_INIT(Ipc
, Forwarder
);
21 Ipc::Forwarder::RequestsMap
Ipc::Forwarder::TheRequestsMap
;
22 unsigned int Ipc::Forwarder::LastRequestId
= 0;
24 Ipc::Forwarder::Forwarder(Request::Pointer aRequest
, double aTimeout
):
25 AsyncJob("Ipc::Forwarder"),
26 request(aRequest
), timeout(aTimeout
)
31 Ipc::Forwarder::~Forwarder()
34 Must(request
->requestId
== 0);
38 /// perform cleanup actions
40 Ipc::Forwarder::cleanup()
45 Ipc::Forwarder::start()
49 typedef NullaryMemFunT
<Forwarder
> Dialer
;
50 AsyncCall::Pointer callback
= JobCallback(54, 5, Dialer
, this, Forwarder::handleRemoteAck
);
51 if (++LastRequestId
== 0) // don't use zero value as request->requestId
53 request
->requestId
= LastRequestId
;
54 TheRequestsMap
[request
->requestId
] = callback
;
58 request
->pack(message
);
60 // assume the pack() call failed because the message did not fit
61 // TODO: add a more specific exception?
65 SendMessage(coordinatorAddr
, message
);
66 eventAdd("Ipc::Forwarder::requestTimedOut", &Forwarder::RequestTimedOut
,
67 this, timeout
, 0, false);
71 Ipc::Forwarder::swanSong()
75 if (request
->requestId
> 0) {
76 DequeueRequest(request
->requestId
);
77 request
->requestId
= 0;
83 Ipc::Forwarder::doneAll() const
86 return request
->requestId
== 0;
89 /// called when Coordinator starts processing the request
91 Ipc::Forwarder::handleRemoteAck()
94 request
->requestId
= 0;
95 // Do not clear ENTRY_FWD_HDR_WAIT or do entry->complete() because
96 // it will trigger our client side processing. Let job cleanup close.
99 /// Ipc::Forwarder::requestTimedOut wrapper
101 Ipc::Forwarder::RequestTimedOut(void* param
)
105 Forwarder
* fwdr
= static_cast<Forwarder
*>(param
);
106 // use async call to enable job call protection that time events lack
107 CallJobHere(54, 5, fwdr
, Forwarder
, requestTimedOut
);
110 /// called when Coordinator fails to start processing the request [in time]
112 Ipc::Forwarder::requestTimedOut()
119 Ipc::Forwarder::handleError()
125 Ipc::Forwarder::handleTimeout()
130 /// terminate with an error
132 Ipc::Forwarder::handleException(const std::exception
& e
)
134 debugs(54, 3, HERE
<< e
.what());
135 mustStop("exception");
139 Ipc::Forwarder::callException(const std::exception
& e
)
143 } catch (const std::exception
& ex
) {
144 debugs(54, DBG_CRITICAL
, HERE
<< ex
.what());
146 AsyncJob::callException(e
);
149 /// returns and forgets the right Forwarder callback for the request
151 Ipc::Forwarder::DequeueRequest(unsigned int requestId
)
154 Must(requestId
!= 0);
155 AsyncCall::Pointer call
;
156 RequestsMap::iterator request
= TheRequestsMap
.find(requestId
);
157 if (request
!= TheRequestsMap
.end()) {
158 call
= request
->second
;
160 TheRequestsMap
.erase(request
);
165 /// called when we are no longer waiting for Coordinator to respond
167 Ipc::Forwarder::removeTimeoutEvent()
169 if (eventFind(&Forwarder::RequestTimedOut
, this))
170 eventDelete(&Forwarder::RequestTimedOut
, this);
174 Ipc::Forwarder::HandleRemoteAck(unsigned int requestId
)
177 Must(requestId
!= 0);
179 AsyncCall::Pointer call
= DequeueRequest(requestId
);
181 ScheduleCallHere(call
);