mistserver/lib/shared_memory.h
2014-04-18 16:29:58 +02:00

129 lines
3.4 KiB
C++

#pragma once
#include <string>
#include <set>
#include <semaphore.h>
#include "timing.h"
namespace IPC {
class statExchange {
public:
statExchange(char * _data);
void now(long long int time);
long long int now();
void time(long time);
long time();
void lastSecond(long time);
long lastSecond();
void down(long long int bytes);
long long int down();
void up(long long int bytes);
long long int up();
void host(std::string name);
std::string host();
void streamName(std::string name);
std::string streamName();
void connector(std::string name);
std::string connector();
private:
char * data;
};
class semGuard {
public:
semGuard(sem_t * semaphore);
~semGuard();
private:
sem_t * mySemaphore;
};
#if !defined __APPLE__ && !defined __CYGWIN__
class sharedPage{
public:
sharedPage(std::string name_ = "", unsigned int len_ = 0, bool master_ = false, bool autoBackoff = true);
sharedPage(const sharedPage & rhs);
~sharedPage();
operator bool() const;
void init(std::string name_, unsigned int len_, bool master_ = false, bool autoBackoff = true);
void operator =(sharedPage & rhs);
bool operator < (const sharedPage & rhs) const {
return name < rhs.name;
}
int handle;
std::string name;
long long int len;
bool master;
char * mapped;
};
#else
class sharedPage;
#endif
class sharedFile{
public:
sharedFile(std::string name_ = "", unsigned int len_ = 0, bool master_ = false, bool autoBackoff = true);
sharedFile(const sharedPage & rhs);
~sharedFile();
operator bool() const;
void init(std::string name_, unsigned int len_, bool master_ = false, bool autoBackoff = true);
void operator =(sharedFile & rhs);
bool operator < (const sharedFile & rhs) const {
return name < rhs.name;
}
int handle;
std::string name;
long long int len;
bool master;
char * mapped;
};
#if defined __APPLE__ || defined __CYGWIN__
class sharedPage: public sharedFile{
public:
sharedPage(std::string name_ = "", unsigned int len_ = 0, bool master_ = false, bool autoBackoff = true);
sharedPage(const sharedPage & rhs);
~sharedPage();
};
#endif
class sharedServer{
public:
sharedServer();
sharedServer(std::string name, int len, bool withCounter = false);
void init(std::string name, int len, bool withCounter = false);
~sharedServer();
void parseEach(void (*callback)(char * data, size_t len, unsigned int id));
operator bool() const;
unsigned int amount;
private:
bool isInUse(unsigned int id);
void newPage();
void deletePage();
std::string baseName;
unsigned int payLen;
std::set<sharedPage> myPages;
sem_t * mySemaphore;
bool hasCounter;
};
class sharedClient{
public:
sharedClient();
sharedClient(const sharedClient & rhs);
sharedClient(std::string name, int len, bool withCounter = false);
void operator = (const sharedClient & rhs);
~sharedClient();
void write(char * data, int len);
void finish();
void keepAlive();
char * getData();
private:
std::string baseName;
sharedPage myPage;
sem_t * mySemaphore;
int payLen;
int offsetOnPage;
bool hasCounter;
};
}