diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2013-04-02 18:41:01 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2013-04-02 18:41:01 +0200 |
commit | 8303597a865400a363ae574ccde819302495f498 (patch) | |
tree | c83b383b3ec818f610cc6137f2b72ee7b4173b09 /compat | |
parent | 8adf6b1650af6027f28db12ca2b4de92a3fac11d (diff) |
Just put everything new in. Conflict resolution will be later
Diffstat (limited to 'compat')
-rw-r--r-- | compat/compat.cpp | 84 | ||||
-rw-r--r-- | compat/compat.h | 42 |
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 +}; |