]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/ipc/Strand.cc
4 * DEBUG: section 54 Interprocess Communication
9 #include "ipc/Strand.h"
10 #include "ipc/Messages.h"
11 #include "ipc/SharedListen.h"
15 CBDATA_NAMESPACED_CLASS_INIT(Ipc
, Strand
);
18 Ipc::Strand::Strand():
19 Port(MakeAddr(strandAddrPfx
, KidIdentifier
)),
24 void Ipc::Strand::start()
30 void Ipc::Strand::registerSelf()
35 StrandCoord(KidIdentifier
, getpid()).pack(message
);
36 SendMessage(coordinatorAddr
, message
);
37 setTimeout(6, "Ipc::Strand::timeoutHandler"); // TODO: make 6 configurable?
40 void Ipc::Strand::receive(const TypedMsgHdr
&message
)
42 debugs(54, 6, HERE
<< message
.type());
43 switch (message
.type()) {
46 handleRegistrationResponse(StrandCoord(message
));
49 case mtSharedListenResponse
:
50 SharedListenJoined(SharedListenResponse(message
));
54 putDescriptor(Descriptor(message
));
58 debugs(54, 1, HERE
<< "Unhandled message type: " << message
.type());
63 void Ipc::Strand::handleRegistrationResponse(const StrandCoord
&strand
)
65 // handle registration response from the coordinator; it could be stale
66 if (strand
.kidId
== KidIdentifier
&& strand
.pid
== getpid()) {
67 debugs(54, 6, "kid" << KidIdentifier
<< " registered");
68 clearTimeout(); // we are done
70 debugs(54, 6, HERE
<< "requesting FD");
71 Descriptor
request(KidIdentifier
, -1);
73 request
.pack(message
);
74 SendMessage(coordinatorAddr
, message
);
76 // could be an ACK to the registration message of our dead predecessor
77 debugs(54, 6, "kid" << KidIdentifier
<< " is not yet registered");
78 // keep listening, with a timeout
82 /// receive descriptor we asked for
83 void Ipc::Strand::putDescriptor(const Descriptor
&message
)
85 debugs(54, 6, HERE
<< "got FD " << message
.fd
);
87 const int n
= snprintf(buffer
, sizeof(buffer
), "strand: kid%d wrote using FD %d\n", KidIdentifier
, message
.fd
);
88 ssize_t bytes
= write(message
.fd
, buffer
, n
);
92 void Ipc::Strand::timedout()
94 debugs(54, 6, HERE
<< isRegistered
);
96 fatalf("kid%d registration timed out", KidIdentifier
);