diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2015-07-25 07:27:03 +0200 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2015-07-25 07:49:19 +0200 | 
| commit | 24538cf3a3a91481851618791b11be81437563e4 (patch) | |
| tree | 4bcc9b97721170829038fe778633382c3e8754bc /opentrack-compat/shm.cpp | |
| parent | 0f445ac2661b5454d491936bb780196b13d1f4ea (diff) | |
move portability classes to compat library
Diffstat (limited to 'opentrack-compat/shm.cpp')
| -rw-r--r-- | opentrack-compat/shm.cpp | 81 | 
1 files changed, 81 insertions, 0 deletions
diff --git a/opentrack-compat/shm.cpp b/opentrack-compat/shm.cpp new file mode 100644 index 00000000..b18a9933 --- /dev/null +++ b/opentrack-compat/shm.cpp @@ -0,0 +1,81 @@ +/* Copyright (c) 2013 Stanisław Halik <sthalik@misaki.pl> + + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + */ + +#include <cstring> +#include "shm.h" + +#if defined(_WIN32) +PortableLockedShm::PortableLockedShm(const char* shmName, const char* mutexName, int mapSize) +{ +    hMutex = CreateMutexA(NULL, false, mutexName); +    hMapFile = CreateFileMappingA( +                 INVALID_HANDLE_VALUE, +                 NULL, +                 PAGE_READWRITE, +                 0, +                 mapSize, +                 shmName); +    mem = MapViewOfFile(hMapFile, +                        FILE_MAP_WRITE, +                        0, +                        0, +                        mapSize); +} + +PortableLockedShm::~PortableLockedShm() +{ +    UnmapViewOfFile(mem); +    CloseHandle(hMapFile); +    CloseHandle(hMutex); +} + +void PortableLockedShm::lock() +{ +    (void) WaitForSingleObject(hMutex, INFINITE); +} + +void PortableLockedShm::unlock() +{ +    (void) ReleaseMutex(hMutex); +} +#else +#pragma GCC diagnostic ignored "-Wunused-result" +PortableLockedShm::PortableLockedShm(const char *shmName, const char* /*mutexName*/, int mapSize) : size(mapSize) +{ +    char filename[512] = {0}; +    strcpy(filename, "/"); +    strcat(filename, shmName); +    fd = shm_open(filename, O_RDWR | O_CREAT, 0600); +    (void) ftruncate(fd, mapSize); +    mem = mmap(NULL, mapSize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, (off_t)0); +} + +PortableLockedShm::~PortableLockedShm() +{ +    (void) munmap(mem, size); +    (void) close(fd); +} + +void PortableLockedShm::lock() +{ +    flock(fd, LOCK_EX); +} + +void PortableLockedShm::unlock() +{ +    flock(fd, LOCK_UN); +} +#endif + +bool PortableLockedShm::success() +{ +#ifndef _WIN32 +    return (void*) mem != (void*) -1; +#else +    return (void*) mem != NULL; +#endif +}  | 
