Backported Pro shared_memory edits to OS edition
This commit is contained in:
parent
243595ff4d
commit
0d9108d1d6
2 changed files with 165 additions and 66 deletions
|
@ -12,8 +12,16 @@
|
||||||
#include "shared_memory.h"
|
#include "shared_memory.h"
|
||||||
#include "stream.h"
|
#include "stream.h"
|
||||||
#include "procs.h"
|
#include "procs.h"
|
||||||
|
#include "bitfields.h"
|
||||||
#include "timing.h"
|
#include "timing.h"
|
||||||
|
|
||||||
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
||||||
|
#include <windows.h>
|
||||||
|
#include <aclapi.h>
|
||||||
|
#include <accctrl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
#if defined(__CYGWIN__) || defined(_WIN32)
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
||||||
|
@ -107,7 +115,7 @@ namespace IPC {
|
||||||
#if defined(__CYGWIN__) || defined(_WIN32)
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
||||||
return mySem != 0;
|
return mySem != 0;
|
||||||
#else
|
#else
|
||||||
return mySem != SEM_FAILED;
|
return mySem && mySem != SEM_FAILED;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,16 +136,27 @@ namespace IPC {
|
||||||
if (oflag & O_CREAT) {
|
if (oflag & O_CREAT) {
|
||||||
if (oflag & O_EXCL) {
|
if (oflag & O_EXCL) {
|
||||||
//attempt opening, if succes, close handle and return false;
|
//attempt opening, if succes, close handle and return false;
|
||||||
HANDLE tmpSem = OpenSemaphore(0, false, semaName.c_str());
|
HANDLE tmpSem = OpenMutex(SYNCHRONIZE, false, semaName.c_str());
|
||||||
if (tmpSem) {
|
if (tmpSem) {
|
||||||
CloseHandle(tmpSem);
|
CloseHandle(tmpSem);
|
||||||
mySem = 0;
|
mySem = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mySem = CreateSemaphore(0, value, 1 , semaName.c_str());
|
SECURITY_ATTRIBUTES security = getSecurityAttributes();
|
||||||
|
mySem = CreateMutex(&security, true, semaName.c_str());
|
||||||
|
if (value){
|
||||||
|
ReleaseMutex(mySem);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
mySem = OpenSemaphore(0, false, semaName.c_str());
|
mySem = OpenMutex(SYNCHRONIZE, false, semaName.c_str());
|
||||||
|
}
|
||||||
|
if (!(*this)) {
|
||||||
|
if (GetLastError() == ERROR_FILE_NOT_FOUND){//Error code 2
|
||||||
|
Util::wait(500);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (oflag & O_CREAT) {
|
if (oflag & O_CREAT) {
|
||||||
|
@ -145,7 +164,6 @@ namespace IPC {
|
||||||
} else {
|
} else {
|
||||||
mySem = sem_open(name, oflag);
|
mySem = sem_open(name, oflag);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (!(*this)) {
|
if (!(*this)) {
|
||||||
if (errno == ENOENT) {
|
if (errno == ENOENT) {
|
||||||
Util::wait(500);
|
Util::wait(500);
|
||||||
|
@ -153,9 +171,9 @@ namespace IPC {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (!(*this)) {
|
if (!(*this)) {
|
||||||
DEBUG_MSG(DLVL_VERYHIGH, "Attempt to open semaphore %s: %s", name, strerror(errno));
|
|
||||||
}
|
}
|
||||||
myName = (char *)name;
|
myName = (char *)name;
|
||||||
}
|
}
|
||||||
|
@ -176,7 +194,7 @@ namespace IPC {
|
||||||
void semaphore::post() {
|
void semaphore::post() {
|
||||||
if (*this) {
|
if (*this) {
|
||||||
#if defined(__CYGWIN__) || defined(_WIN32)
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
||||||
ReleaseSemaphore(mySem, 1, 0);
|
ReleaseMutex(mySem);
|
||||||
#else
|
#else
|
||||||
sem_post(mySem);
|
sem_post(mySem);
|
||||||
#endif
|
#endif
|
||||||
|
@ -267,6 +285,32 @@ namespace IPC {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
||||||
|
SECURITY_ATTRIBUTES semaphore::getSecurityAttributes() {
|
||||||
|
///\todo We really should clean this up sometime probably
|
||||||
|
///We currently have everything static, because the result basically depends on everything
|
||||||
|
static SECURITY_ATTRIBUTES result;
|
||||||
|
static bool resultValid = false;
|
||||||
|
static SECURITY_DESCRIPTOR securityDescriptor;
|
||||||
|
if (resultValid) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
InitializeSecurityDescriptor(&securityDescriptor, SECURITY_DESCRIPTOR_REVISION);
|
||||||
|
if (!SetSecurityDescriptorDacl(&securityDescriptor, TRUE, NULL, FALSE)){
|
||||||
|
FAIL_MSG("Failed to set pSecurityDescriptor: %u", GetLastError());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||||
|
result.lpSecurityDescriptor = &securityDescriptor;
|
||||||
|
result.bInheritHandle = FALSE;
|
||||||
|
|
||||||
|
resultValid = true;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
///brief Creates a shared page
|
///brief Creates a shared page
|
||||||
///\param name_ The name of the page to be created
|
///\param name_ The name of the page to be created
|
||||||
///\param len_ The size to make the page
|
///\param len_ The size to make the page
|
||||||
|
@ -910,6 +954,7 @@ namespace IPC {
|
||||||
offsetOnPage = 0;
|
offsetOnPage = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///\brief Copy constructor for sharedClients
|
///\brief Copy constructor for sharedClients
|
||||||
///\param rhs The client ro copy
|
///\param rhs The client ro copy
|
||||||
sharedClient::sharedClient(const sharedClient & rhs) {
|
sharedClient::sharedClient(const sharedClient & rhs) {
|
||||||
|
@ -966,6 +1011,7 @@ namespace IPC {
|
||||||
DEBUG_MSG(DLVL_FAIL, "Creating semaphore %s failed: %s", baseName.c_str(), strerror(errno));
|
DEBUG_MSG(DLVL_FAIL, "Creating semaphore %s failed: %s", baseName.c_str(), strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
//Empty is used to compare for emptyness. This is not needed when the page uses a counter
|
||||||
char * empty = 0;
|
char * empty = 0;
|
||||||
if (!hasCounter) {
|
if (!hasCounter) {
|
||||||
empty = (char *)malloc(payLen * sizeof(char));
|
empty = (char *)malloc(payLen * sizeof(char));
|
||||||
|
@ -1004,8 +1050,10 @@ namespace IPC {
|
||||||
Util::wait(500);
|
Util::wait(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (empty) {
|
||||||
free(empty);
|
free(empty);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
///\brief The deconstructor
|
///\brief The deconstructor
|
||||||
sharedClient::~sharedClient() {
|
sharedClient::~sharedClient() {
|
||||||
|
@ -1055,5 +1103,43 @@ namespace IPC {
|
||||||
}
|
}
|
||||||
return (myPage.mapped + offsetOnPage + (hasCounter ? 1 : 0));
|
return (myPage.mapped + offsetOnPage + (hasCounter ? 1 : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
userConnection::userConnection(char * _data) {
|
||||||
|
data = _data;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long userConnection::getTrackId(size_t offset) const {
|
||||||
|
if (offset >= SIMUL_TRACKS) {
|
||||||
|
WARN_MSG("Trying to get track id for entry %lu, while there are only %d entries allowed", offset, SIMUL_TRACKS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return Bit::btohl(data + (offset * 6));
|
||||||
|
}
|
||||||
|
|
||||||
|
void userConnection::setTrackId(size_t offset, unsigned long trackId) const {
|
||||||
|
if (offset >= SIMUL_TRACKS) {
|
||||||
|
WARN_MSG("Trying to set track id for entry %lu, while there are only %d entries allowed", offset, SIMUL_TRACKS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Bit::htobl(data + (offset * 6), trackId);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long userConnection::getKeynum(size_t offset) const {
|
||||||
|
if (offset >= SIMUL_TRACKS) {
|
||||||
|
WARN_MSG("Trying to get keynum for entry %lu, while there are only %d entries allowed", offset, SIMUL_TRACKS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return Bit::btohs(data + (offset * 6) + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void userConnection::setKeynum(size_t offset, unsigned long keynum) {
|
||||||
|
if (offset >= SIMUL_TRACKS) {
|
||||||
|
WARN_MSG("Trying to set keynum for entry %lu, while there are only %d entries allowed", offset, SIMUL_TRACKS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Bit::htobs(data + (offset * 6) + 4, keynum);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,8 @@ namespace IPC {
|
||||||
void unlink();
|
void unlink();
|
||||||
private:
|
private:
|
||||||
#if defined(__CYGWIN__) || defined(_WIN32)
|
#if defined(__CYGWIN__) || defined(_WIN32)
|
||||||
|
///\todo Maybe sometime implement anything else than 777
|
||||||
|
static SECURITY_ATTRIBUTES getSecurityAttributes();
|
||||||
HANDLE mySem;
|
HANDLE mySem;
|
||||||
#else
|
#else
|
||||||
sem_t * mySem;
|
sem_t * mySem;
|
||||||
|
@ -228,4 +230,15 @@ namespace IPC {
|
||||||
///\brief Whether the payload has a counter, if so, it is added in front of the payload
|
///\brief Whether the payload has a counter, if so, it is added in front of the payload
|
||||||
bool hasCounter;
|
bool hasCounter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class userConnection {
|
||||||
|
public:
|
||||||
|
userConnection(char * _data);
|
||||||
|
unsigned long getTrackId(size_t offset) const;
|
||||||
|
void setTrackId(size_t offset, unsigned long trackId) const;
|
||||||
|
unsigned long getKeynum(size_t offset) const;
|
||||||
|
void setKeynum(size_t offset, unsigned long keynum);
|
||||||
|
private:
|
||||||
|
char * data;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue