handleSharedListenRequest(SharedListenRequest(message));
break;
- case mtDescriptorGet:
- debugs(54, 6, HERE << "Descriptor get request");
- handleDescriptorGet(Descriptor(message));
- break;
-
default:
debugs(54, 1, HERE << "Unhandled message type: " << message.type());
break;
return sock;
}
-void Ipc::Coordinator::handleDescriptorGet(const Descriptor& request)
-{
- // XXX: hack: create descriptor here
- char buffer[64];
- snprintf(buffer, sizeof(buffer), "/tmp/squid_shared_file.txt");
- static int fd = -1;
- if (fd < 0) {
- fd = open(buffer, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
- int n = snprintf(buffer, sizeof(buffer), "coord: created %d\n", fd);
- ssize_t bytes = write(fd, buffer, n);
- Must(bytes == n);
- debugs(54, 6, "Created FD " << fd << " for kid" << request.fromKid);
- } else {
- int n = snprintf(buffer, sizeof(buffer), "coord: updated %d\n", fd);
- ssize_t bytes = write(fd, buffer, n);
- Must(bytes == n);
- }
-
- debugs(54, 6, "Sending FD " << fd << " to kid" << request.fromKid);
-
- Descriptor response(-1, fd);
- TypedMsgHdr message;
- response.pack(message);
- SendMessage(MakeAddr(strandAddrPfx, request.fromKid), message);
-
- // XXX: close(fd); fd should be opened until the message has not reached rec iver
-}
-
void Ipc::Coordinator::broadcastSignal(int sig) const
{
typedef Strands::const_iterator SCI;
/// returns cached socket or calls openListenSocket()
void handleSharedListenRequest(const SharedListenRequest& request);
- void handleDescriptorGet(const Descriptor& request);
/// calls comm_open_listener()
int openListenSocket(const SharedListenRequest& request, int &errNo);
#include "config.h"
-#include "comm.h"
#include "ipc/Messages.h"
#include "ipc/TypedMsgHdr.h"
{
hdrMsg.putData(mtRegistration, this, sizeof(*this));
}
-
-
-Ipc::Descriptor::Descriptor(): fromKid(-1), fd(-1)
-{
-}
-
-Ipc::Descriptor::Descriptor(int aFromKid, int aFd): fromKid(aFromKid), fd(aFd)
-{
-}
-
-Ipc::Descriptor::Descriptor(const TypedMsgHdr &hdrMsg): fromKid(-1), fd(-1)
-{
- if (hdrMsg.type() == mtDescriptorGet) {
- hdrMsg.getData(mtDescriptorGet, this, sizeof(*this));
- fd = -1;
- } else {
- hdrMsg.getData(mtDescriptorPut, this, sizeof(*this));
- fd = hdrMsg.getFd();
- }
-}
-
-void Ipc::Descriptor::pack(TypedMsgHdr &hdrMsg) const
-{
- if (fd >= 0) {
- hdrMsg.putData(mtDescriptorPut, this, sizeof(*this));
- hdrMsg.putFd(fd);
- } else {
- hdrMsg.putData(mtDescriptorGet, this, sizeof(*this));
- }
-}
#define SQUID_IPC_MESSAGES_H
#include <sys/types.h>
-#include <sys/socket.h>
-/// Declare IPC messages. These classes translate between high-level
-/// information and low-level TypedMsgHdr (i.e., struct msghdr) buffers.
+/** Declarations used by varios IPC messages */
namespace Ipc
{
class TypedMsgHdr;
+/// message class identifier
typedef enum { mtNone = 0, mtRegistration,
- mtSharedListenRequest, mtSharedListenResponse,
- mtDescriptorGet, mtDescriptorPut } MessageType;
+ mtSharedListenRequest, mtSharedListenResponse } MessageType;
/// Strand location details
class StrandCoord {
pid_t pid; ///< OS process or thread identifier
};
-/// a [socket] descriptor information
-class Descriptor
-{
-public:
- Descriptor(); ///< unknown descriptor
- Descriptor(int fromKid, int fd); ///< from descriptor sender or requestor
- explicit Descriptor(const TypedMsgHdr &hdrMsg); ///< from recvmsg()
- void pack(TypedMsgHdr &hdrMsg) const; ///< prepare for sendmsg()
-
-public:
- int fromKid; /// the source of this message
- int fd; ///< raw descriptor value
-};
-
-
} // namespace Ipc;
SharedListenJoined(SharedListenResponse(message));
break;
- case mtDescriptorPut:
- putDescriptor(Descriptor(message));
- break;
-
default:
debugs(54, 1, HERE << "Unhandled message type: " << message.type());
break;
if (strand.kidId == KidIdentifier && strand.pid == getpid()) {
debugs(54, 6, "kid" << KidIdentifier << " registered");
clearTimeout(); // we are done
-
- debugs(54, 6, HERE << "requesting FD");
- Descriptor request(KidIdentifier, -1);
- TypedMsgHdr message;
- request.pack(message);
- SendMessage(coordinatorAddr, message);
} else {
// could be an ACK to the registration message of our dead predecessor
debugs(54, 6, "kid" << KidIdentifier << " is not yet registered");
}
}
-/// receive descriptor we asked for
-void Ipc::Strand::putDescriptor(const Descriptor &message)
-{
- debugs(54, 6, HERE << "got FD " << message.fd);
- char buffer[64];
- const int n = snprintf(buffer, sizeof(buffer), "strand: kid%d wrote using FD %d\n", KidIdentifier, message.fd);
- ssize_t bytes = write(message.fd, buffer, n);
- Must(bytes == n);
-}
-
void Ipc::Strand::timedout()
{
debugs(54, 6, HERE << isRegistered);