summaryrefslogtreecommitdiffhomepage
path: root/compat
diff options
context:
space:
mode:
Diffstat (limited to 'compat')
-rw-r--r--compat/compat.cpp84
-rw-r--r--compat/compat.h42
2 files changed, 126 insertions, 0 deletions
diff --git a/compat/compat.cpp b/compat/compat.cpp
new file mode 100644
index 00000000..2263ea11
--- /dev/null
+++ b/compat/compat.cpp
@@ -0,0 +1,84 @@
+/* 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.
+ */
+#define IN_FTNOIR_COMPAT
+#include "compat.h"
+
+#if defined(_WIN32) || 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_READ | 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
+PortableLockedShm::PortableLockedShm(const char *shmName, const char *mutexName, int mapSize) : size(mapSize)
+{
+ char shm_filename[NAME_MAX];
+ shm_filename[0] = '/';
+ strncpy(shm_filename+1, shmName, NAME_MAX-2);
+ sprintf(shm_filename + strlen(shm_filename), "%ld\n", (long) getuid());
+ shm_filename[NAME_MAX-1] = '\0';
+
+ //(void) shm_unlink(shm_filename);
+
+ fd = shm_open(shm_filename, O_RDWR | O_CREAT, 0600);
+ if (ftruncate(fd, mapSize) == 0)
+ mem = mmap(NULL, mapSize, PROT_READ|PROT_WRITE, MAP_SHARED, fd, (off_t)0);
+ else
+ mem = (void*) -1;
+}
+
+PortableLockedShm::~PortableLockedShm()
+{
+ //(void) shm_unlink(shm_filename);
+
+ (void) munmap(mem, size);
+ (void) close(fd);
+}
+
+void PortableLockedShm::lock()
+{
+ flock(fd, LOCK_EX);
+}
+
+void PortableLockedShm::unlock()
+{
+ flock(fd, LOCK_UN);
+}
+
+
+
+#endif
diff --git a/compat/compat.h b/compat/compat.h
new file mode 100644
index 00000000..7692b38a
--- /dev/null
+++ b/compat/compat.h
@@ -0,0 +1,42 @@
+/* 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) || 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
+
+#if defined(IN_FTNOIR_COMPAT) && (defined(_WIN32) || defined(__WIN32))
+# define COMPAT_EXPORT __declspec(dllexport)
+#else
+# define COMPAT_EXPORT
+#endif
+
+class COMPAT_EXPORT PortableLockedShm {
+public:
+ PortableLockedShm(const char *shmName, const char *mutexName, int mapSize);
+ ~PortableLockedShm();
+ void lock();
+ void unlock();
+ void* mem;
+private:
+#if defined(_WIN32) || defined(__WIN32)
+ HANDLE hMutex, hMapFile;
+#else
+ int fd, size;
+ //char shm_filename[NAME_MAX];
+#endif
+};