Browse Source

Better bridge wait code (server-side)

tags/1.9.6
falkTX 10 years ago
parent
commit
55d786cf24
1 changed files with 37 additions and 14 deletions
  1. +37
    -14
      source/backend/plugin/CarlaPluginBridge.cpp

+ 37
- 14
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -40,6 +40,7 @@ using juce::File;
using juce::ScopedPointer;
using juce::String;
using juce::StringArray;
using juce::Time;

CARLA_BACKEND_START_NAMESPACE

@@ -742,7 +743,7 @@ public:
fSaved(true),
fTimedOut(false),
fTimedError(false),
fLastPongCounter(-1),
fLastPongTime(-1),
fBridgeBinary(),
fBridgeThread(engine, this),
fShmAudioPool(),
@@ -932,15 +933,19 @@ public:
if (fSaved)
return;

const uint32_t timeoutEnd(Time::getMillisecondCounter() + 3000);

carla_stdout("CarlaPluginBridge::waitForSaved() - now waiting...");

for (int i=0; i < 300; ++i)
for (; Time::getMillisecondCounter() < timeoutEnd && fBridgeThread.isThreadRunning();)
{
if (fSaved || ! fBridgeThread.isThreadRunning())
break;
carla_msleep(20);
pData->engine->callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr);
pData->engine->idle();

if (fSaved)
break;

carla_msleep(20);
}

if (! fSaved)
@@ -1897,8 +1902,8 @@ public:
carla_debug("CarlaPluginBridge::handleNonRtData() - got opcode: %s", PluginBridgeNonRtServerOpcode2str(opcode));
}
#endif
if (opcode != kPluginBridgeNonRtServerNull && fLastPongCounter > 0)
fLastPongCounter = 0;
if (opcode != kPluginBridgeNonRtServerNull && fLastPongTime > 0)
fLastPongTime = Time::currentTimeMillis();

switch (opcode)
{
@@ -2427,19 +2432,37 @@ public:
}

fInitiated = false;
fLastPongCounter = 0;
fLastPongTime = Time::currentTimeMillis();
CARLA_SAFE_ASSERT(fLastPongTime > 0);

static bool sFirstInit = true;

for (; fLastPongCounter++ < 500;)
int64_t timeoutEnd = 5000;

if (sFirstInit)
timeoutEnd *= 2;
#ifndef CARLA_OS_WIN
if (fBinaryType == BINARY_WIN32 || fBinaryType == BINARY_WIN64)
timeoutEnd *= 2;
#endif
sFirstInit = false;

carla_stdout("plugin bridge starting, current time: " P_INT64 "; max wait time: " P_INT64, fLastPongTime, timeoutEnd);

for (; Time::currentTimeMillis() < fLastPongTime + timeoutEnd && fBridgeThread.isThreadRunning();)
{
if (fInitiated || ! fBridgeThread.isThreadRunning())
break;
carla_msleep(20);
pData->engine->callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr);
pData->engine->idle();
idle();

if (fInitiated)
break;

carla_msleep(20);
carla_stdout("plugin bridge waiting 20ms, remainig time: " P_INT64, fLastPongTime + timeoutEnd - Time::currentTimeMillis());
}

fLastPongCounter = -1;
fLastPongTime = -1;

if (fInitError || ! fInitiated)
{
@@ -2483,7 +2506,7 @@ private:
bool fTimedOut;
bool fTimedError;

int32_t fLastPongCounter;
int64_t fLastPongTime;

CarlaString fBridgeBinary;
CarlaPluginBridgeThread fBridgeThread;


Loading…
Cancel
Save