summaryrefslogtreecommitdiffhomepage
path: root/opentrack-compat
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2015-07-25 07:27:03 +0200
committerStanislaw Halik <sthalik@misaki.pl>2015-07-25 07:49:19 +0200
commit24538cf3a3a91481851618791b11be81437563e4 (patch)
tree4bcc9b97721170829038fe778633382c3e8754bc /opentrack-compat
parent0f445ac2661b5454d491936bb780196b13d1f4ea (diff)
move portability classes to compat library
Diffstat (limited to 'opentrack-compat')
-rw-r--r--opentrack-compat/export.hpp13
-rw-r--r--opentrack-compat/mingw-version-script.txt8
-rw-r--r--opentrack-compat/posix-version-script.txt8
-rw-r--r--opentrack-compat/qcopyable-mutex.hpp37
-rw-r--r--opentrack-compat/shm.cpp81
-rw-r--r--opentrack-compat/shm.h37
-rw-r--r--opentrack-compat/sleep.hpp22
-rw-r--r--opentrack-compat/timer.hpp75
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;
+ }
+};