From d321f5f15070ff7d0349c5c2386f78954db69de1 Mon Sep 17 00:00:00 2001 From: bsp2 Date: Tue, 23 Apr 2019 20:59:35 +0200 Subject: [PATCH] replace std::mutex by std::recursive_mutex + protect setProgramChunk() by engine.mutex --- include/global.hpp | 3 ++- src/engine.cpp | 21 ++++++++++++++------- src/vst2_main.cpp | 3 ++- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/include/global.hpp b/include/global.hpp index 256ba790..6adfd16e 100644 --- a/include/global.hpp +++ b/include/global.hpp @@ -55,7 +55,8 @@ struct Global { float sampleRate; float sampleTime; - std::mutex mutex; + // std::mutex mutex; + std::recursive_mutex mutex; std::thread thread; VIPMutex vipMutex; diff --git a/src/engine.cpp b/src/engine.cpp index 2b164426..73997c40 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -146,7 +146,8 @@ static void engineRun() { global->engine.vipMutex.wait(); if (!global->gPaused) { - std::lock_guard lock(global->engine.mutex); + // std::lock_guard lock(global->engine.mutex); + std::lock_guard lock(global->engine.mutex); for (int i = 0; i < mutexSteps; i++) { engineStep(); } @@ -182,7 +183,8 @@ void engineStop() { void engineAddModule(Module *module) { assert(module); VIPLock vipLock(global->engine.vipMutex); - std::lock_guard lock(global->engine.mutex); + // std::lock_guard lock(global->engine.mutex); + std::lock_guard lock(global->engine.mutex); // Check that the module is not already added auto it = std::find(global->gModules.begin(), global->gModules.end(), module); assert(it == global->gModules.end()); @@ -196,7 +198,8 @@ void engineAddModule(Module *module) { void engineRemoveModule(Module *module) { assert(module); VIPLock vipLock(global->engine.vipMutex); - std::lock_guard lock(global->engine.mutex); + // std::lock_guard lock(global->engine.mutex); + std::lock_guard lock(global->engine.mutex); // If a param is being smoothed on this module, stop smoothing it immediately if (module == global->engine.smoothModule) { global->engine.smoothModule = NULL; @@ -233,7 +236,8 @@ static void updateActive() { void engineAddWire(Wire *wire) { assert(wire); VIPLock vipLock(global->engine.vipMutex); - std::lock_guard lock(global->engine.mutex); + // std::lock_guard lock(global->engine.mutex); + std::lock_guard lock(global->engine.mutex); // Check wire properties assert(wire->outputModule); assert(wire->inputModule); @@ -250,7 +254,8 @@ void engineAddWire(Wire *wire) { void engineRemoveWire(Wire *wire) { assert(wire); VIPLock vipLock(global->engine.vipMutex); - std::lock_guard lock(global->engine.mutex); + // std::lock_guard lock(global->engine.mutex); + std::lock_guard lock(global->engine.mutex); // Check that the wire is already added auto it = std::find(global->gWires.begin(), global->gWires.end(), wire); assert(it != global->gWires.end()); @@ -454,7 +459,8 @@ namespace rack { void engineSetParamSmooth(Module *module, int paramId, float value) { VIPLock vipLock(global->engine.vipMutex); - std::lock_guard lock(global->engine.mutex); + // std::lock_guard lock(global->engine.mutex); + std::lock_guard lock(global->engine.mutex); // Since only one param can be smoothed at a time, if another param is currently being smoothed, skip to its final state if (global->engine.smoothModule && !(global->engine.smoothModule == module && global->engine.smoothParamId == paramId)) { global->engine.smoothModule->params[global->engine.smoothParamId].value = global->engine.smoothValue; @@ -466,7 +472,8 @@ void engineSetParamSmooth(Module *module, int paramId, float value) { void engineSetSampleRate(float newSampleRate) { VIPLock vipLock(global->engine.vipMutex); - std::lock_guard lock(global->engine.mutex); + // std::lock_guard lock(global->engine.mutex); + std::lock_guard lock(global->engine.mutex); global->engine.sampleRate = newSampleRate; global->engine.sampleTime = 1.0 / global->engine.sampleRate; // onSampleRateChange diff --git a/src/vst2_main.cpp b/src/vst2_main.cpp index a42e4d87..742adbad 100644 --- a/src/vst2_main.cpp +++ b/src/vst2_main.cpp @@ -957,7 +957,6 @@ public: void setEnableProcessingActive(bool _bEnable) { lockAudio(); b_processing = _bEnable; - unlockAudio(); } @@ -1096,6 +1095,8 @@ public: // Dprintf("xxx vstrack_plugin:setProgramChunk: 3\n"); vst2_set_shared_plugin_tls_globals(); // Dprintf("xxx vstrack_plugin:setProgramChunk: 4\n"); + // std::lock_guard lock(rack::global->engine.mutex); + std::lock_guard lock(rack::global->engine.mutex); #if 0 Dprintf("xxx vstrack_plugin:setProgramChunk: size=%u\n", _size); #endif