diff options
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 +}; | 
