135 lines
3.9 KiB
C++
135 lines
3.9 KiB
C++
#pragma once
|
|
#include <set>
|
|
#include <string>
|
|
|
|
#include "defines.h"
|
|
#include "timing.h"
|
|
|
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
|
#include <windows.h>
|
|
#else
|
|
#include <semaphore.h>
|
|
#endif
|
|
|
|
#ifndef ACCESSPERMS
|
|
#define ACCESSPERMS (S_IRWXU | S_IRWXG | S_IRWXO)
|
|
#endif
|
|
|
|
#define STAT_EX_SIZE 177
|
|
#define PLAY_EX_SIZE 2 + 6 * SIMUL_TRACKS
|
|
|
|
namespace IPC{
|
|
|
|
///\brief A class used for the abstraction of semaphores
|
|
class semaphore{
|
|
public:
|
|
semaphore();
|
|
semaphore(const char *name, int oflag, mode_t mode = 0, unsigned int value = 0, bool noWait = false);
|
|
~semaphore();
|
|
operator bool() const;
|
|
void open(const char *name, int oflag, mode_t mode = 0, unsigned int value = 0, bool noWait = false);
|
|
int getVal() const;
|
|
void post();
|
|
void wait();
|
|
bool tryWait();
|
|
bool tryWait(uint64_t ms);
|
|
bool tryWaitOneSecond();
|
|
void close();
|
|
void abandon();
|
|
void unlink();
|
|
|
|
private:
|
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
|
///\todo Maybe sometime implement anything else than 777
|
|
static SECURITY_ATTRIBUTES getSecurityAttributes();
|
|
HANDLE mySem;
|
|
#else
|
|
sem_t *mySem;
|
|
#endif
|
|
unsigned int isLocked;
|
|
uint64_t lockTime;
|
|
std::string myName;
|
|
};
|
|
|
|
///\brief A class used as a semaphore guard
|
|
class semGuard{
|
|
public:
|
|
semGuard(semaphore *thisSemaphore);
|
|
~semGuard();
|
|
|
|
private:
|
|
///\brief The semaphore to guard.
|
|
semaphore *mySemaphore;
|
|
};
|
|
|
|
///\brief A class for managing shared files.
|
|
class sharedFile{
|
|
public:
|
|
sharedFile(const std::string &name_ = "", uint64_t len_ = 0, bool master_ = false, bool autoBackoff = true);
|
|
sharedFile(const sharedFile &rhs);
|
|
~sharedFile();
|
|
operator bool() const;
|
|
void init(const std::string &name_, uint64_t len_, bool master_ = false, bool autoBackoff = true);
|
|
void operator=(sharedFile &rhs);
|
|
bool operator<(const sharedFile &rhs) const{return name < rhs.name;}
|
|
void close();
|
|
void unmap();
|
|
bool exists();
|
|
///\brief The fd handle of the opened shared file
|
|
int handle;
|
|
///\brief The name of the opened shared file
|
|
std::string name;
|
|
///\brief The size in bytes of the opened shared file
|
|
uint64_t len;
|
|
///\brief Whether this class should unlink the shared file upon deletion or not
|
|
bool master;
|
|
///\brief A pointer to the payload of the file file
|
|
char *mapped;
|
|
};
|
|
|
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
|
void preservePage(std::string);
|
|
void releasePage(std::string);
|
|
#endif
|
|
|
|
#ifdef SHM_ENABLED
|
|
///\brief A class for managing shared memory pages.
|
|
class sharedPage{
|
|
public:
|
|
sharedPage(const std::string &name_ = "", uint64_t len_ = 0, bool master_ = false, bool autoBackoff = true);
|
|
sharedPage(const sharedPage &rhs);
|
|
~sharedPage();
|
|
operator bool() const;
|
|
void init(const std::string &name_, uint64_t len_, bool master_ = false, bool autoBackoff = true);
|
|
void operator=(sharedPage &rhs);
|
|
bool operator<(const sharedPage &rhs) const{return name < rhs.name;}
|
|
void unmap();
|
|
void close();
|
|
bool exists();
|
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
|
///\brief The handle of the opened shared memory page
|
|
HANDLE handle;
|
|
#else
|
|
///\brief The fd handle of the opened shared memory page
|
|
int handle;
|
|
#endif
|
|
///\brief The name of the opened shared memory page
|
|
std::string name;
|
|
///\brief The size in bytes of the opened shared memory page
|
|
uint64_t len;
|
|
///\brief Whether this class should unlink the shared memory upon deletion or not
|
|
bool master;
|
|
///\brief A pointer to the payload of the page
|
|
char *mapped;
|
|
};
|
|
#else
|
|
///\brief A class for handling shared memory pages.
|
|
/// Uses shared files at its backbone, defined for portability
|
|
class sharedPage : public sharedFile{
|
|
public:
|
|
sharedPage(const std::string &name_ = "", uint64_t len_ = 0, bool master_ = false, bool autoBackoff = true);
|
|
sharedPage(const sharedPage &rhs);
|
|
~sharedPage();
|
|
};
|
|
#endif
|
|
}// namespace IPC
|