Browse Source

Shared memory win32 implementation

tags/1.9.6
falkTX 10 years ago
parent
commit
e0d65117ed
4 changed files with 50 additions and 36 deletions
  1. +4
    -2
      source/backend/engine/CarlaEngine.cpp
  2. +11
    -4
      source/utils/CarlaBridgeUtils.hpp
  3. +1
    -0
      source/utils/CarlaSemUtils.hpp
  4. +34
    -30
      source/utils/CarlaShmUtils.hpp

+ 4
- 2
source/backend/engine/CarlaEngine.cpp View File

@@ -364,13 +364,15 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons


if (bridgeBinary.isNotEmpty()) if (bridgeBinary.isNotEmpty())
{ {
# ifndef CARLA_OS_WIN
if (btype == BINARY_NATIVE) if (btype == BINARY_NATIVE)
{ {
#ifdef CARLA_OS_WIN
bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-native.exe";
#else
bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-native"; bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-native";
#endif
} }
else else
# endif
{ {
switch (btype) switch (btype)
{ {


+ 11
- 4
source/utils/CarlaBridgeUtils.hpp View File

@@ -20,10 +20,17 @@


#include "CarlaRingBuffer.hpp" #include "CarlaRingBuffer.hpp"


#define PLUGIN_BRIDGE_NAMEPREFIX_AUDIO_POOL "/carla-bridge_shm_ap_"
#define PLUGIN_BRIDGE_NAMEPREFIX_RT_CLIENT "/carla-bridge_shm_rtC_"
#define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_CLIENT "/carla-bridge_shm_nonrtC_"
#define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_SERVER "/carla-bridge_shm_nonrtS_"
#ifdef CARLA_OS_WIN
# define PLUGIN_BRIDGE_NAMEPREFIX_AUDIO_POOL "Global\\carla-bridge_shm_ap_"
# define PLUGIN_BRIDGE_NAMEPREFIX_RT_CLIENT "Global\\carla-bridge_shm_rtC_"
# define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_CLIENT "Global\\carla-bridge_shm_nonrtC_"
# define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_SERVER "Global\\carla-bridge_shm_nonrtS_"
#else
# define PLUGIN_BRIDGE_NAMEPREFIX_AUDIO_POOL "/carla-bridge_shm_ap_"
# define PLUGIN_BRIDGE_NAMEPREFIX_RT_CLIENT "/carla-bridge_shm_rtC_"
# define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_CLIENT "/carla-bridge_shm_nonrtC_"
# define PLUGIN_BRIDGE_NAMEPREFIX_NON_RT_SERVER "/carla-bridge_shm_nonrtS_"
#endif


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------




+ 1
- 0
source/utils/CarlaSemUtils.hpp View File

@@ -26,6 +26,7 @@
#include <semaphore.h> #include <semaphore.h>


#if defined(CARLA_OS_MAC) #if defined(CARLA_OS_MAC)
# include <fcntl.h>
extern "C" { extern "C" {
# include "osx_sem_timedwait.c" # include "osx_sem_timedwait.c"
}; };


+ 34
- 30
source/utils/CarlaShmUtils.hpp View File

@@ -21,8 +21,8 @@
#include "CarlaUtils.hpp" #include "CarlaUtils.hpp"


#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
struct shm_t { HANDLE shm; HANDLE map; };
# define shm_t_INIT { nullptr, nullptr }
struct shm_t { HANDLE map; bool isServer; const char* filename; };
# define shm_t_INIT { INVALID_HANDLE_VALUE, true, nullptr }
#else #else
# include <cerrno> # include <cerrno>
# include <fcntl.h> # include <fcntl.h>
@@ -46,7 +46,7 @@ static inline
bool carla_is_shm_valid(const shm_t& shm) noexcept bool carla_is_shm_valid(const shm_t& shm) noexcept
{ {
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
return (shm.shm != nullptr && shm.shm != INVALID_HANDLE_VALUE);
return (shm.filename != nullptr);
#else #else
return (shm.fd >= 0); return (shm.fd >= 0);
#endif #endif
@@ -72,11 +72,12 @@ shm_t carla_shm_create(const char* const filename) noexcept


shm_t ret; shm_t ret;


try {
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
ret.shm = nullptr; // TODO
ret.map = nullptr;
ret.map = INVALID_HANDLE_VALUE;
ret.isServer = true;
ret.filename = carla_strdup_safe(filename);
#else #else
try {
ret.fd = ::shm_open(filename, O_CREAT|O_EXCL|O_RDWR, 0600); ret.fd = ::shm_open(filename, O_CREAT|O_EXCL|O_RDWR, 0600);
ret.filename = (ret.fd >= 0) ? carla_strdup_safe(filename) : nullptr; ret.filename = (ret.fd >= 0) ? carla_strdup_safe(filename) : nullptr;
ret.size = 0; ret.size = 0;
@@ -87,12 +88,9 @@ shm_t carla_shm_create(const char* const filename) noexcept
::shm_unlink(filename); ::shm_unlink(filename);
ret.fd = -1; ret.fd = -1;
} }
#endif
}
catch(...) {
carla_safe_exception("carla_shm_create", __FILE__, __LINE__);
ret = gNullCarlaShm;
} }
CARLA_SAFE_EXCEPTION_RETURN("carla_shm_create", gNullCarlaShm);
#endif


return ret; return ret;
} }
@@ -107,20 +105,18 @@ shm_t carla_shm_attach(const char* const filename) noexcept


shm_t ret; shm_t ret;


try {
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
ret.shm = ::CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);
ret.map = nullptr;
ret.map = INVALID_HANDLE_VALUE;
ret.isServer = false;
ret.filename = carla_strdup_safe(filename);
#else #else
try {
ret.fd = ::shm_open(filename, O_RDWR, 0); ret.fd = ::shm_open(filename, O_RDWR, 0);
ret.filename = nullptr; ret.filename = nullptr;
ret.size = 0; ret.size = 0;
#endif
}
catch(...) {
carla_safe_exception("carla_shm_attach", __FILE__, __LINE__);
ret = gNullCarlaShm;
} }
CARLA_SAFE_EXCEPTION_RETURN("carla_shm_attach", gNullCarlaShm);
#endif


return ret; return ret;
} }
@@ -133,13 +129,14 @@ void carla_shm_close(shm_t& shm) noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(carla_is_shm_valid(shm),); CARLA_SAFE_ASSERT_RETURN(carla_is_shm_valid(shm),);
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
CARLA_SAFE_ASSERT(shm.map == nullptr);
CARLA_SAFE_ASSERT(shm.map == INVALID_HANDLE_VALUE);
#endif #endif


try {
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
::CloseHandle(shm.shm);
if (shm.filename != nullptr)
delete[] shm.filename;
#else #else
try {
::close(shm.fd); ::close(shm.fd);


if (shm.filename != nullptr) if (shm.filename != nullptr)
@@ -147,8 +144,8 @@ void carla_shm_close(shm_t& shm) noexcept
::shm_unlink(shm.filename); ::shm_unlink(shm.filename);
delete[] shm.filename; delete[] shm.filename;
} }
#endif
} CARLA_SAFE_EXCEPTION("carla_shm_close"); } CARLA_SAFE_EXCEPTION("carla_shm_close");
#endif


shm = gNullCarlaShm; shm = gNullCarlaShm;
} }
@@ -163,17 +160,23 @@ void* carla_shm_map(shm_t& shm, const std::size_t size) noexcept
CARLA_SAFE_ASSERT_RETURN(carla_is_shm_valid(shm), nullptr); CARLA_SAFE_ASSERT_RETURN(carla_is_shm_valid(shm), nullptr);
CARLA_SAFE_ASSERT_RETURN(size > 0, nullptr); CARLA_SAFE_ASSERT_RETURN(size > 0, nullptr);
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
CARLA_SAFE_ASSERT_RETURN(shm.map == nullptr, nullptr);
CARLA_SAFE_ASSERT_RETURN(shm.map == INVALID_HANDLE_VALUE, nullptr);
#else #else
CARLA_SAFE_ASSERT_RETURN(shm.size == 0, nullptr); CARLA_SAFE_ASSERT_RETURN(shm.size == 0, nullptr);
#endif #endif


try { try {
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
const HANDLE map(::CreateFileMapping(shm.shm, nullptr, PAGE_READWRITE, size, size, nullptr));
CARLA_SAFE_ASSERT_RETURN(map != nullptr, nullptr);
HANDLE map;

if (shm.isServer)
map = ::CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE|SEC_COMMIT, 0, size, shm.filename);
else
map = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm.filename);


void* const ptr(::MapViewOfFile(map, FILE_MAP_COPY, 0, 0, size));
CARLA_SAFE_ASSERT_RETURN(map != INVALID_HANDLE_VALUE, nullptr);

void* const ptr(::MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, size));


if (ptr == nullptr) if (ptr == nullptr)
{ {
@@ -214,7 +217,7 @@ void carla_shm_unmap(shm_t& shm, void* const ptr) noexcept
CARLA_SAFE_ASSERT_RETURN(carla_is_shm_valid(shm),); CARLA_SAFE_ASSERT_RETURN(carla_is_shm_valid(shm),);
CARLA_SAFE_ASSERT_RETURN(ptr != nullptr,); CARLA_SAFE_ASSERT_RETURN(ptr != nullptr,);
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
CARLA_SAFE_ASSERT_RETURN(shm.map != nullptr,);
CARLA_SAFE_ASSERT_RETURN(shm.map != INVALID_HANDLE_VALUE,);
#else #else
CARLA_SAFE_ASSERT_RETURN(shm.size > 0,); CARLA_SAFE_ASSERT_RETURN(shm.size > 0,);
#endif #endif
@@ -222,7 +225,7 @@ void carla_shm_unmap(shm_t& shm, void* const ptr) noexcept
try { try {
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
const HANDLE map(shm.map); const HANDLE map(shm.map);
shm.map = nullptr;
shm.map = INVALID_HANDLE_VALUE;


::UnmapViewOfFile(ptr); ::UnmapViewOfFile(ptr);
::CloseHandle(map); ::CloseHandle(map);
@@ -276,7 +279,8 @@ shm_t carla_shm_create_temp(char* const fileBase) noexcept


// file already exists, keep trying // file already exists, keep trying
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
// TODO
if (::GetLastError() == ERROR_ALREADY_EXISTS)
continue;
#else #else
if (errno == EEXIST) if (errno == EEXIST)
continue; continue;


Loading…
Cancel
Save