/* * Copyright (C) 1996-2023 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. */ /* DEBUG: section 54 Interprocess Communication */ #ifndef SQUID_SRC_IPC_PORT_H #define SQUID_SRC_IPC_PORT_H #include "ipc/UdsOp.h" #include "SquidString.h" namespace Ipc { /// Waits for and receives incoming IPC messages; kids handle the messages class Port: public UdsOp { public: Port(const String &aListenAddr); /// calculates IPC message address for strand #id of processLabel type static String MakeAddr(const char *proccessLabel, int id); /// get the IPC message address for coordinator process static String CoordinatorAddr(); protected: void start() override = 0; // UdsOp (AsyncJob) API; has body bool doneAll() const override; // UdsOp (AsyncJob) API /// read the next incoming message void doListen(); /// handle IPC message just read /// kids must call parent method when they do not recognize the message type virtual void receive(const TypedMsgHdr &) = 0; private: void noteRead(const CommIoCbParams ¶ms); // Comm callback API void receiveOrIgnore(const TypedMsgHdr& ); private: TypedMsgHdr buf; ///< msghdr struct filled by Comm }; extern const char strandAddrLabel[]; ///< strand's listening address unique label } // namespace Ipc #endif /* SQUID_SRC_IPC_PORT_H */