]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/ipc/Coordinator.h
Docs: Copyright updates for 2018 (#114)
[thirdparty/squid.git] / src / ipc / Coordinator.h
index f2fd75b71a737ad187f2f979dfb25571ac15b635..a1111c48b9ba74ca608acaac35350f91a54cbbb9 100644 (file)
@@ -1,17 +1,27 @@
 /*
- * $Id$
- *
- * DEBUG: section 54    Interprocess Communication
+ * Copyright (C) 1996-2018 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_IPC_COORDINATOR_H
 #define SQUID_IPC_COORDINATOR_H
 
-
-#include "Array.h"
+#include "ipc/Messages.h"
 #include "ipc/Port.h"
-
+#include "ipc/SharedListen.h"
+#include "ipc/StrandCoords.h"
+#include "ipc/StrandSearch.h"
+#include "mgr/forward.h"
+#if SQUID_SNMP
+#include "snmp/forward.h"
+#endif
+#include <list>
+#include <map>
 
 namespace Ipc
 {
@@ -19,6 +29,8 @@ namespace Ipc
 ///  Coordinates shared activities of Strands (Squid processes or threads)
 class Coordinator: public Port
 {
+    CBDATA_CLASS(Coordinator);
+
 public:
     static Coordinator* Instance();
 
@@ -27,26 +39,49 @@ public:
 
     void broadcastSignal(int sig) const; ///< send sig to registered strands
 
+    const StrandCoords &strands() const; ///< currently registered strands
+
 protected:
     virtual void start(); // Port (AsyncJob) API
-    virtual void receive(const Message& message); // Port API
-
-    StrandData* findStrand(int kidId); ///< registered strand or NULL
-    void registerStrand(const StrandData &); ///< adds or updates existing
-    void handleRegistrationRequest(const StrandData &); ///< registers and ACKs
+    virtual void receive(const TypedMsgHdr& message); // Port API
+
+    StrandCoord* findStrand(int kidId); ///< registered strand or NULL
+    void registerStrand(const StrandCoord &); ///< adds or updates existing
+    void handleRegistrationRequest(const HereIamMessage &); ///< register,ACK
+
+    /// answer the waiting search request
+    void notifySearcher(const StrandSearchRequest &request, const StrandCoord&);
+    /// answers or queues the request if the answer is not yet known
+    void handleSearchRequest(const StrandSearchRequest &request);
+
+    /// returns cached socket or calls openListenSocket()
+    void handleSharedListenRequest(const SharedListenRequest& request);
+    void handleCacheMgrRequest(const Mgr::Request& request);
+    void handleCacheMgrResponse(const Mgr::Response& response);
+#if SQUID_SNMP
+    void handleSnmpRequest(const Snmp::Request& request);
+    void handleSnmpResponse(const Snmp::Response& response);
+#endif
+    /// calls comm_open_listener()
+    Comm::ConnectionPointer openListenSocket(const SharedListenRequest& request, int &errNo);
 
 private:
-    Vector<StrandData> strands; ///< registered processes and threads
-    static Coordinator* TheInstance; ///< the only class instance in existence
+    StrandCoords strands_; ///< registered processes and threads
+
+    typedef std::list<StrandSearchRequest> Searchers; ///< search requests
+    Searchers searchers; ///< yet unanswered search requests in arrival order
+
+    typedef std::map<OpenListenerParams, Comm::ConnectionPointer> Listeners; ///< params:connection map
+    Listeners listeners; ///< cached comm_open_listener() results
 
-    CBDATA_CLASS2(Coordinator);
+    static Coordinator* TheInstance; ///< the only class instance in existence
 
 private:
     Coordinator(const Coordinator&); // not implemented
     Coordinator& operator =(const Coordinator&); // not implemented
 };
 
-
 } // namespace Ipc
 
 #endif /* SQUID_IPC_COORDINATOR_H */
+