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
{
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
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))
{
CARLA_SAFE_ASSERT(data->midiOut[0] == 0);
setRingBuffer(&data->ringBuffer, false);
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))
{
carla_zeroStruct(data->sem);
carla_zeroStruct(data->timeInfo);
carla_zeroBytes(data->midiOut, kBridgeRtDataMidiOutSize);
setRingBuffer(&data->ringBuffer, 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;
#else
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);
#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_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host configure, tells host state is saved

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

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

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

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);
#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;

// 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
}

@@ -77,8 +81,19 @@ void carla_sem_destroy(sem_t* const sem) noexcept
#if defined(CARLA_OS_MAC)
::sem_close(sem);
#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
}



Loading…
Cancel
Save