Shared memory runners do two main things:
* create shared memory segments
* open shared memory segments created earlier
Each runner has to decide whether it needs to create and/or open
shared memory segments. Common runners share (some) logic in making
this decisions. The purpose of this patch is to implement this logic
in a single place to allow easy reuse and avoid duplication.
--- src/ipc/mem/Segment.cc | 20 ++++++++++++++++++++ src/ipc/mem/Segment.h | 17 +++++++++++++++++ src/tests/stub_tools.cc | 7 +++++++ 3 files changed, 44 insertions(+), 0 deletions(-) diff --git src/ipc/mem/Segment.cc src/ipc/mem/Segment.cc index 5702fd0..ca31f3c 100644 --- src/ipc/mem/Segment.cc +++ src/ipc/mem/Segment.cc @@ -256,3 +256,23 @@ Ipc::Mem::Segment::checkSupport(const char *const context) } #endif // HAVE_SHM + +void +Ipc::Mem::RegisteredRunner::run(const RunnerRegistry &r) +{ + // If Squid is built with real segments, we create() real segments + // in the master process only. Otherwise, we create() fake + // segments in each worker process. We assume that only workers + // need and can work with fake segments. +#if HAVE_SHM + if (IamMasterProcess()) +#else + if (IamWorker()) +#endif + create(r); + + // we assume that master process does not need shared segments + // unless it is also a worker + if (!InDaemonMode() || !IamMasterProcess()) + open(r); +} diff --git src/ipc/mem/Segment.h src/ipc/mem/Segment.h index b82ac4f..28966f2 100644 --- src/ipc/mem/Segment.h +++ src/ipc/mem/Segment.h @@ -6,6 +6,7 @@ #ifndef SQUID_IPC_MEM_SEGMENT_H #define SQUID_IPC_MEM_SEGMENT_H +#include "base/RunnersRegistry.h" #include "SquidString.h" namespace Ipc @@ -65,6 +66,22 @@ private: bool doUnlink; ///< whether the segment should be unlinked on destruction }; +/// Base class for runners that create and open shared memory segments. +/// First may run create() method and then open(). +class RegisteredRunner: public ::RegisteredRunner +{ +public: + /* RegisteredRunner API */ + virtual void run(const RunnerRegistry &r); + +protected: + /// called when the runner should create a new memory segment + virtual void create(const RunnerRegistry &) = 0; + /// called when the runner should open a previously created segment, + /// not needed if segments are opened in constructor or init methods + virtual void open(const RunnerRegistry &) {} +}; + } // namespace Mem } // namespace Ipc diff --git src/tests/stub_tools.cc src/tests/stub_tools.cc index 014b561..f86d0d7 100644 --- src/tests/stub_tools.cc +++ src/tests/stub_tools.cc @@ -76,6 +76,13 @@ IamMasterProcess() } bool +InDaemonMode() +{ + fprintf(stderr, "Not implemented"); + return false; +} + +bool UsingSmp() { fprintf(stderr, "Not implemented"); -- 1.7.6.3Received on Wed Sep 28 2011 - 23:07:13 MDT
This archive was generated by hypermail 2.2.0 : Thu Sep 29 2011 - 12:00:03 MDT