Browse Source

semaphore fixes

tags/1.9.6
falkTX 10 years ago
parent
commit
0587b39564
6 changed files with 37 additions and 11 deletions
  1. +4
    -1
      source/backend/engine/CarlaEngine.cpp
  2. +1
    -0
      source/backend/engine/CarlaEngineBridge.cpp
  3. +3
    -0
      source/backend/plugin/CarlaPluginBridge.cpp
  4. +3
    -2
      source/modules/jackbridge/JackBridge2.cpp
  5. +3
    -0
      source/utils/CarlaBridgeUtils.hpp
  6. +23
    -8
      source/utils/CarlaSemUtils.hpp

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

@@ -1067,7 +1067,10 @@ float CarlaEngine::getOutputPeak(const uint pluginId, const bool isLeft) const n


void CarlaEngine::callback(const EngineCallbackOpcode action, const uint pluginId, const int value1, const int value2, const float value3, const char* const valueStr) noexcept void CarlaEngine::callback(const EngineCallbackOpcode action, const uint pluginId, const int value1, const int value2, const float value3, const char* const valueStr) noexcept
{ {
carla_debug("CarlaEngine::callback(%i:%s, %i, %i, %i, %f, \"%s\")", action, EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr);
#ifdef DEBUG
if (action != ENGINE_CALLBACK_IDLE)
carla_debug("CarlaEngine::callback(%i:%s, %i, %i, %i, %f, \"%s\")", action, EngineCallbackOpcode2Str(action), pluginId, value1, value2, value3, valueStr);
#endif


#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
if (pData->isIdling) if (pData->isIdling)


+ 1
- 0
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -138,6 +138,7 @@ struct BridgeRtControl : public CarlaRingBuffer<StackBuffer> {


if (jackbridge_shm_map2<BridgeRtData>(shm, data)) if (jackbridge_shm_map2<BridgeRtData>(shm, data))
{ {
CARLA_SAFE_ASSERT(data->midiOut[0] == 0);
setRingBuffer(&data->ringBuffer, false); setRingBuffer(&data->ringBuffer, false);
return true; return true;
} }


+ 3
- 0
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -204,6 +204,9 @@ struct BridgeRtControl : public CarlaRingBuffer<StackBuffer> {


if (carla_shm_map<BridgeRtData>(shm, data)) if (carla_shm_map<BridgeRtData>(shm, data))
{ {
carla_zeroStruct(data->sem);
carla_zeroStruct(data->timeInfo);
carla_zeroBytes(data->midiOut, kBridgeRtDataMidiOutSize);
setRingBuffer(&data->ringBuffer, true); setRingBuffer(&data->ringBuffer, true);
return true; return true;
} }


+ 3
- 2
source/modules/jackbridge/JackBridge2.cpp View File

@@ -31,8 +31,9 @@ bool jackbridge_sem_init(void* sem) noexcept
return false; return false;
#else #else
sem_t* const sema(carla_sem_create()); sem_t* const sema(carla_sem_create());
std::memcpy(sem, &sema, sizeof(sem_t*));
//std::memcpy(sem, sema, sizeof(sem_t*));
CARLA_SAFE_ASSERT_RETURN(sema != nullptr, false);

std::memcpy(sem, sema, sizeof(sem_t));
return (sema != nullptr); return (sema != nullptr);
#endif #endif
} }


+ 3
- 0
source/utils/CarlaBridgeUtils.hpp View File

@@ -102,6 +102,8 @@ enum PluginBridgeNonRtOpcode {
const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host configure, tells host GUI is now hidden const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host configure, tells host GUI is now hidden
const char* const CARLA_BRIDGE_MSG_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host configure, tells host state is saved const char* const CARLA_BRIDGE_MSG_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host configure, tells host state is saved


static const std::size_t kBridgeRtDataMidiOutSize = 512*4;

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


struct BridgeSemaphore { struct BridgeSemaphore {
@@ -131,6 +133,7 @@ struct BridgeRtData {
BridgeSemaphore sem; BridgeSemaphore sem;
BridgeTimeInfo timeInfo; BridgeTimeInfo timeInfo;
StackBuffer ringBuffer; StackBuffer ringBuffer;
uint8_t midiOut[kBridgeRtDataMidiOutSize];
}; };


struct BridgeNonRtData { struct BridgeNonRtData {


+ 23
- 8
source/utils/CarlaSemUtils.hpp View File

@@ -53,16 +53,20 @@ sem_t* carla_sem_create() noexcept


return ::sem_open(strBuf, O_CREAT, O_RDWR, 0); return ::sem_open(strBuf, O_CREAT, O_RDWR, 0);
#else #else
sem_t* const sem((sem_t*)std::malloc(sizeof(sem_t)));
CARLA_SAFE_ASSERT_RETURN(sem != nullptr, nullptr);
sem_t sem;


if (::sem_init(sem, 1, 0) != 0)
{
std::free(sem);
if (::sem_init(&sem, 1, 0) != 0)
return nullptr; return nullptr;

// can't return temporary variable, so allocate a new one
if (sem_t* const sem2 = (sem_t*)std::malloc(sizeof(sem_t)))
{
std::memcpy(sem2, &sem, sizeof(sem_t));
return sem2;
} }


return sem;
::sem_destroy(&sem);
return nullptr;
#endif #endif
} }


@@ -77,8 +81,19 @@ void carla_sem_destroy(sem_t* const sem) noexcept
#if defined(CARLA_OS_MAC) #if defined(CARLA_OS_MAC)
::sem_close(sem); ::sem_close(sem);
#else #else
::sem_destroy(sem);
std::free(sem);
// we can't call "sem_destroy(sem)" directly because it will free memory which we allocated during carla_sem_create()
// so we create a temp variable, free our memory, and finally pass the temp variable to sem_destroy()

// temp var
sem_t sem2;
std::memcpy(&sem2, sem, sizeof(sem_t));

// free memory allocated in carla_sem_create()
// FIXME
//std::free(sem);

// destroy semaphore
::sem_destroy(&sem2);
#endif #endif
} }




Loading…
Cancel
Save