/*
- * $Id$
- *
- * DEBUG: section 54 Interprocess Communication
+ * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
*
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
*/
-#include "config.h"
-#include <map>
-#include "comm.h"
+/* DEBUG: section 54 Interprocess Communication */
+
+#include "squid.h"
#include "base/TextException.h"
-#include "ipc/Port.h"
-#include "ipc/Messages.h"
+#include "comm.h"
+#include "comm/Connection.h"
+#include "globals.h"
#include "ipc/Kids.h"
-#include "ipc/TypedMsgHdr.h"
-#include "ipc/StartListening.h"
+#include "ipc/Messages.h"
+#include "ipc/Port.h"
#include "ipc/SharedListen.h"
+#include "ipc/StartListening.h"
+#include "ipc/TypedMsgHdr.h"
+#include "tools.h"
+#include <map>
/// holds information necessary to handle JoinListen response
class PendingOpenRequest
Ipc::OpenListenerParams::OpenListenerParams()
{
- xmemset(this, 0, sizeof(*this));
+ memset(this, 0, sizeof(*this));
}
bool
return addr.compareWhole(p.addr) < 0;
}
-
-
Ipc::SharedListenRequest::SharedListenRequest(): requestorId(-1), mapId(-1)
{
// caller will then set public data members
hdrMsg.putPod(*this);
}
-
Ipc::SharedListenResponse::SharedListenResponse(int aFd, int anErrNo, int aMapId):
- fd(aFd), errNo(anErrNo), mapId(aMapId)
+ fd(aFd), errNo(anErrNo), mapId(aMapId)
{
}
Ipc::SharedListenResponse::SharedListenResponse(const TypedMsgHdr &hdrMsg):
- fd(-1), errNo(0), mapId(-1)
+ fd(-1), errNo(0), mapId(-1)
{
hdrMsg.checkType(mtSharedListenResponse);
hdrMsg.getPod(*this);
fd = hdrMsg.getFd();
+ // other conn details are passed in OpenListenerParams and filled out by SharedListenJoin()
}
void Ipc::SharedListenResponse::pack(TypedMsgHdr &hdrMsg) const
hdrMsg.putFd(fd);
}
-
void Ipc::JoinSharedListen(const OpenListenerParams ¶ms,
AsyncCall::Pointer &callback)
{
TypedMsgHdr message;
request.pack(message);
- SendMessage(coordinatorAddr, message);
+ SendMessage(Ipc::Port::CoordinatorAddr(), message);
}
void Ipc::SharedListenJoined(const SharedListenResponse &response)
{
- const int fd = response.fd;
-
- debugs(54, 3, HERE << "got listening FD " << fd << " errNo=" <<
+ // Dont debugs c fully since only FD is filled right now.
+ debugs(54, 3, HERE << "got listening FD " << response.fd << " errNo=" <<
response.errNo << " mapId=" << response.mapId);
Must(TheSharedListenRequestMap.find(response.mapId) != TheSharedListenRequestMap.end());
Must(por.callback != NULL);
TheSharedListenRequestMap.erase(response.mapId);
- if (fd >= 0) {
+ StartListeningCb *cbd = dynamic_cast<StartListeningCb*>(por.callback->getDialer());
+ assert(cbd && cbd->conn != NULL);
+ Must(cbd && cbd->conn != NULL);
+ cbd->conn->fd = response.fd;
+
+ if (Comm::IsConnOpen(cbd->conn)) {
OpenListenerParams &p = por.params;
+ cbd->conn->local = p.addr;
+ cbd->conn->flags = p.flags;
+ // XXX: leave the comm AI stuff to comm_import_opened()?
struct addrinfo *AI = NULL;
- p.addr.GetAddrInfo(AI);
+ p.addr.getAddrInfo(AI);
AI->ai_socktype = p.sock_type;
AI->ai_protocol = p.proto;
- comm_import_opened(fd, p.addr, p.flags, FdNote(p.fdNote), AI);
- p.addr.FreeAddrInfo(AI);
+ comm_import_opened(cbd->conn, FdNote(p.fdNote), AI);
+ Ip::Address::FreeAddr(AI);
}
- StartListeningCb *cbd =
- dynamic_cast<StartListeningCb*>(por.callback->getDialer());
- Must(cbd);
- cbd->fd = fd;
cbd->errNo = response.errNo;
+ cbd->handlerSubscription = por.params.handlerSubscription;
ScheduleCallHere(por.callback);
}
+