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 | |
parent | 0f445ac2661b5454d491936bb780196b13d1f4ea (diff) |
move portability classes to compat library
Diffstat (limited to 'opentrack-compat')
-rw-r--r-- | opentrack-compat/export.hpp | 13 | ||||
-rw-r--r-- | opentrack-compat/mingw-version-script.txt | 8 | ||||
-rw-r--r-- | opentrack-compat/posix-version-script.txt | 8 | ||||
-rw-r--r-- | opentrack-compat/qcopyable-mutex.hpp | 37 | ||||
-rw-r--r-- | opentrack-compat/shm.cpp | 81 | ||||
-rw-r--r-- | opentrack-compat/shm.h | 37 | ||||
-rw-r--r-- | opentrack-compat/sleep.hpp | 22 | ||||
-rw-r--r-- | opentrack-compat/timer.hpp | 75 |
8 files changed, 281 insertions, 0 deletions
diff --git a/opentrack-compat/export.hpp b/opentrack-compat/export.hpp new file mode 100644 index 00000000..f0983b75 --- /dev/null +++ b/opentrack-compat/export.hpp @@ -0,0 +1,13 @@ +#pragma once + +#ifdef _WIN32 +# define OPENTRACK_LINKAGE __declspec(dllexport) +#else +# define OPENTRACK_LINKAGE +#endif + +#ifndef _MSC_VER +# define OPENTRACK_EXPORT __attribute__ ((visibility ("default"))) OPENTRACK_LINKAGE +#else +# define OPENTRACK_EXPORT OPENTRACK_LINKAGE +#endif
\ No newline at end of file diff --git a/opentrack-compat/mingw-version-script.txt b/opentrack-compat/mingw-version-script.txt new file mode 100644 index 00000000..fe20ad37 --- /dev/null +++ b/opentrack-compat/mingw-version-script.txt @@ -0,0 +1,8 @@ +{ + global: + GetDialog?0; + GetConstructor?0; + GetMetadata?0; + local: + *; +}; diff --git a/opentrack-compat/posix-version-script.txt b/opentrack-compat/posix-version-script.txt new file mode 100644 index 00000000..97edb9aa --- /dev/null +++ b/opentrack-compat/posix-version-script.txt @@ -0,0 +1,8 @@ +{ + global: + GetDialog; + GetConstructor; + GetMetadata; + local: + *; +};
\ No newline at end of file diff --git a/opentrack-compat/qcopyable-mutex.hpp b/opentrack-compat/qcopyable-mutex.hpp new file mode 100644 index 00000000..f7f36f93 --- /dev/null +++ b/opentrack-compat/qcopyable-mutex.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include <QMutex> + +class MyMutex { +private: + QMutex inner; + +public: + QMutex* operator->() { return &inner; } + QMutex* operator->() const { return &const_cast<MyMutex*>(this)->inner; } + + MyMutex operator=(const MyMutex& datum) + { + auto mode = + datum->isRecursive() + ? QMutex::Recursive + : QMutex::NonRecursive; + + return MyMutex(mode); + } + + MyMutex(const MyMutex& datum) + { + *this = datum; + } + + MyMutex(QMutex::RecursionMode mode = QMutex::NonRecursive) : + inner(mode) + { + } + + QMutex* operator&() + { + return &inner; + } +}; 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 +} diff --git a/opentrack-compat/shm.h b/opentrack-compat/shm.h new file mode 100644 index 00000000..17a0d843 --- /dev/null +++ b/opentrack-compat/shm.h @@ -0,0 +1,37 @@ +/* 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. + */ +#pragma once + +#if defined(_WIN32) +#include <windows.h> +#else +#include <stdio.h> +#include <string.h> +#include <sys/file.h> +#include <sys/mman.h> +#include <fcntl.h> +#include <limits.h> +#include <unistd.h> +#include <sys/types.h> +#endif + +class PortableLockedShm { +public: + PortableLockedShm(const char *shmName, const char *mutexName, int mapSize); + ~PortableLockedShm(); + void lock(); + void unlock(); + bool success(); + inline void* ptr() { return mem; } +private: + void* mem; +#if defined(_WIN32) + HANDLE hMutex, hMapFile; +#else + int fd, size; +#endif +}; diff --git a/opentrack-compat/sleep.hpp b/opentrack-compat/sleep.hpp new file mode 100644 index 00000000..27920842 --- /dev/null +++ b/opentrack-compat/sleep.hpp @@ -0,0 +1,22 @@ +#pragma once + +namespace portable +{ +#ifdef _WIN32 + #include <windows.h> + + template<typename = void> + void sleep(unsigned milliseconds) + { + Sleep(milliseconds); + } +#else + #include <unistd.h> + + template<typename = void> + void sleep(unsigned milliseconds) + { + usleep(milliseconds * 1000U); // takes microseconds + } +#endif +} diff --git a/opentrack-compat/timer.hpp b/opentrack-compat/timer.hpp new file mode 100644 index 00000000..fd710499 --- /dev/null +++ b/opentrack-compat/timer.hpp @@ -0,0 +1,75 @@ +/* Copyright (c) 2014-2015, Stanislaw 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. + */ + +#pragma once +#include <ctime> +#if defined (_WIN32) +# include <windows.h> +# ifndef CLOCK_MONOTONIC +# define CLOCK_MONOTONIC -1 +# endif +static inline void opentrack_clock_gettime(int, struct timespec* ts) +{ + static LARGE_INTEGER freq; + + if (!freq.QuadPart) + (void) QueryPerformanceFrequency(&freq); + + LARGE_INTEGER d; + + (void) QueryPerformanceCounter(&d); + + d.QuadPart *= 1000000000L; + d.QuadPart /= freq.QuadPart; + + ts->tv_sec = d.QuadPart / 1000000000L; + ts->tv_nsec = d.QuadPart % 1000000000L; +} +# define clock_gettime opentrack_clock_gettime +#else +# if defined(__MACH__) +# define CLOCK_MONOTONIC 0 +# include <inttypes.h> +# include <mach/mach_time.h> +static inline void clock_gettime(int, struct timespec* ts) +{ + static mach_timebase_info_data_t sTimebaseInfo; + uint64_t state, nsec; + if ( sTimebaseInfo.denom == 0 ) { + (void) mach_timebase_info(&sTimebaseInfo); + } + state = mach_absolute_time(); + nsec = state * sTimebaseInfo.numer / sTimebaseInfo.denom; + ts->tv_sec = nsec / 1000000000L; + ts->tv_nsec = nsec % 1000000000L; +} +# endif +#endif +class Timer { +private: + struct timespec state; + long conv(const struct timespec& cur) + { + return (cur.tv_sec - state.tv_sec) * 1000000000L + (cur.tv_nsec - state.tv_nsec); + } +public: + Timer() { + start(); + } + void start() { + (void) clock_gettime(CLOCK_MONOTONIC, &state); + } + long elapsed() { + struct timespec cur; + (void) clock_gettime(CLOCK_MONOTONIC, &cur); + return conv(cur); + } + long elapsed_ms() { + return elapsed() / 1000000L; + } +}; |