Przeglądaj źródła

Really fixed the evil bug.

Michał W. Urbańczyk 17 lat temu
rodzic
commit
f28c76984c
3 zmienionych plików z 10 dodań i 5 usunięć
  1. 4 1
      client/Client.cpp
  2. 5 4
      lib/Interprocess.h
  3. 1 0
      server/CVCMIServer.cpp

+ 4 - 1
client/Client.cpp

@@ -34,7 +34,10 @@ void CClient::init()
 	serv = NULL;
 	gs = NULL;
 	cb = NULL;
-	shared = new SharedMem();
+	try
+	{
+		shared = new SharedMem();
+	} HANDLE_EXCEPTION
 }
 
 CClient::CClient(void)

+ 5 - 4
lib/Interprocess.h

@@ -26,18 +26,19 @@ struct ServerReady
 struct SharedMem 
 {
 	boost::interprocess::shared_memory_object smo;
-	boost::interprocess::mapped_region mr;
+	boost::interprocess::mapped_region *mr;
 	ServerReady *sr;
 	
 	SharedMem()
-		:smo(boost::interprocess::open_or_create,"vcmi_memory",boost::interprocess::read_write), 
-		mr(smo,boost::interprocess::read_write)
+		:smo(boost::interprocess::open_or_create,"vcmi_memory",boost::interprocess::read_write) 
 	{
 		smo.truncate(sizeof(ServerReady));
-		sr = new(mr.get_address())ServerReady();
+		mr = new boost::interprocess::mapped_region(smo,boost::interprocess::read_write);
+		sr = new(mr->get_address())ServerReady();
 	};
 	~SharedMem()
 	{
+		delete mr;
 		boost::interprocess::shared_memory_object::remove("vcmi_memory");
 	}
 };

+ 1 - 0
server/CVCMIServer.cpp

@@ -109,6 +109,7 @@ void CVCMIServer::start()
 	try
 	{
 		intpr::shared_memory_object smo(intpr::open_only,"vcmi_memory",intpr::read_write);
+		smo.truncate(sizeof(ServerReady));
 		mr = new intpr::mapped_region(smo,intpr::read_write);
 		sr = (ServerReady*)mr->get_address();
 	}