summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2010-08-25 18:45:03 +0000
committerrandomdan <randomdan@localhost>2010-08-25 18:45:03 +0000
commitab3b50c08f34dd2ec2121dc62188c39396f9019a (patch)
treef3ef78118d6f35398736199cec2dc3fabf323ef8
parentWhole new low dependency object loader (diff)
downloadproject2-ab3b50c08f34dd2ec2121dc62188c39396f9019a.tar.bz2
project2-ab3b50c08f34dd2ec2121dc62188c39396f9019a.tar.xz
project2-ab3b50c08f34dd2ec2121dc62188c39396f9019a.zip
Don't create the SHM session mapping until something tries to use it
-rw-r--r--project2/sessionShm.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/project2/sessionShm.cpp b/project2/sessionShm.cpp
index e4c9d16..8064142 100644
--- a/project2/sessionShm.cpp
+++ b/project2/sessionShm.cpp
@@ -24,13 +24,14 @@ class SessionShmData {
SessionValues svs;
time_t expiryTime;
- static boost::interprocess::managed_mapped_file shm;
+ static boost::interprocess::managed_mapped_file & shm();
+ static boost::shared_ptr<boost::interprocess::managed_mapped_file> _shm;
friend class SessionContainerShm;
};
const char * shmFile = "/tmp/project2.sessions";
-boost::interprocess::managed_mapped_file SessionShmData::shm(open_or_create, shmFile, 1024 * 1024);
+boost::shared_ptr<boost::interprocess::managed_mapped_file> SessionShmData::_shm;
SessionContainerShm::SessionContainerShm()
{
@@ -44,8 +45,8 @@ void
SessionContainerShm::CleanUp()
{
std::set<std::string> toDelete;
- for (managed_mapped_file::const_named_iterator i = SessionShmData::shm.named_begin();
- i != SessionShmData::shm.named_end(); i++) {
+ for (managed_mapped_file::const_named_iterator i = SessionShmData::shm().named_begin();
+ i != SessionShmData::shm().named_end(); i++) {
const SessionShmData * s = static_cast<const SessionShmData *>(i->value());
if (s) {
if (s->expiryTime < time(NULL)) {
@@ -54,7 +55,7 @@ SessionContainerShm::CleanUp()
}
}
for(std::set<std::string>::const_iterator s = toDelete.begin(); s != toDelete.end(); s++) {
- SessionShmData::shm.destroy<const SessionShmData>(s->c_str());
+ SessionShmData::shm().destroy<const SessionShmData>(s->c_str());
}
}
@@ -65,7 +66,7 @@ SessionContainerShm::getSession(boost::uuids::uuid & sid)
sid = boost::uuids::random_generator()();
}
return SessionPtr(new SessionShm(
- SessionShmData::shm.find_or_construct<SessionShmData>(boost::lexical_cast<std::string>(sid).c_str())()));
+ SessionShmData::shm().find_or_construct<SessionShmData>(boost::lexical_cast<std::string>(sid).c_str())()));
}
SessionShm::SessionShm(SessionShmData * d) : data(d)
@@ -89,7 +90,7 @@ SessionShm::ExpiryTime() const
}
SessionShmData::SessionShmData() :
- svs(std::less<SKey>(), AllocatorValueType(shm.get_segment_manager()))
+ svs(std::less<SKey>(), AllocatorValueType(shm().get_segment_manager()))
{
}
@@ -97,6 +98,16 @@ SessionShmData::~SessionShmData()
{
}
+boost::interprocess::managed_mapped_file &
+SessionShmData::shm()
+{
+ if (!_shm) {
+ _shm = boost::shared_ptr<boost::interprocess::managed_mapped_file>(
+ new boost::interprocess::managed_mapped_file(open_or_create, shmFile, 1024 * 1024));
+ }
+ return *_shm;
+}
+
Glib::ustring
SessionShm::GetValue(const Glib::ustring & name) const
{