File: Interprocess.h

package info (click to toggle)
vcmi 0.99%2Bdfsg%2Bgit20190113.f06c8a87-2
  • links: PTS, VCS
  • area: contrib
  • in suites: bullseye
  • size: 11,136 kB
  • sloc: cpp: 142,615; sh: 315; objc: 248; makefile: 32; ansic: 28; python: 13
file content (80 lines) | stat: -rw-r--r-- 2,111 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
 * Interprocess.h, part of VCMI engine
 *
 * Authors: listed in file AUTHORS in main folder
 *
 * License: GNU General Public License v2.0 or later
 * Full text of license available in license.txt file, in main folder
 *
 */
#pragma once

#include <boost/interprocess/sync/scoped_lock.hpp>
#include <boost/interprocess/sync/interprocess_mutex.hpp>
#include <boost/interprocess/sync/interprocess_condition.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/shared_memory_object.hpp>

struct ServerReady
{
	bool ready;
	uint16_t port; //ui16?
	boost::interprocess::interprocess_mutex mutex;
	boost::interprocess::interprocess_condition cond;

	ServerReady()
	{
		ready = false;
		port = 0;
	}

	void waitTillReady()
	{
		boost::interprocess::scoped_lock<boost::interprocess::interprocess_mutex> slock(mutex);
		while(!ready)
		{
			cond.wait(slock);
		}
	}

	void setToReadyAndNotify(const uint16_t Port)
	{
		{
			boost::unique_lock<boost::interprocess::interprocess_mutex> lock(mutex);
			ready = true;
			port = Port;
		}
		cond.notify_all();
	}
};

struct SharedMemory
{
	std::string name;
	boost::interprocess::shared_memory_object smo;
	boost::interprocess::mapped_region * mr;
	ServerReady * sr;

	SharedMemory(const std::string & Name, bool initialize = false)
		: name(Name)
	{
		if(initialize)
		{
			//if the application has previously crashed, the memory may not have been removed. to avoid problems - try to destroy it
			boost::interprocess::shared_memory_object::remove(name.c_str());
		}
		smo = boost::interprocess::shared_memory_object(boost::interprocess::open_or_create, name.c_str(), boost::interprocess::read_write);
		smo.truncate(sizeof(ServerReady));
		mr = new boost::interprocess::mapped_region(smo,boost::interprocess::read_write);
		if(initialize)
			sr = new(mr->get_address())ServerReady();
		else
			sr = reinterpret_cast<ServerReady*>(mr->get_address());
	};

	~SharedMemory()
	{
		delete mr;
		boost::interprocess::shared_memory_object::remove(name.c_str());
	}
};