diff --git a/.github/workflows/macos-latest.yml b/.github/workflows/macos-latest.yml index c3382c70a..4a9ae70e7 100644 --- a/.github/workflows/macos-latest.yml +++ b/.github/workflows/macos-latest.yml @@ -1,4 +1,4 @@ -name: C/C++ CI +name: macos latest on: push: diff --git a/.github/workflows/ubuntu-latest.yml b/.github/workflows/ubuntu-latest.yml index c27dba923..7255abd87 100644 --- a/.github/workflows/ubuntu-latest.yml +++ b/.github/workflows/ubuntu-latest.yml @@ -14,7 +14,7 @@ jobs: - name: Install extra dependencies run: | sudo apt-get update - sudo apt-get install libasound2-dev liblo-dev libfluidsynth-dev libgl1-mesa-dev libgtk2.0-dev libgtk-3-dev libmagic-dev libpulse-dev libx11-dev pkg-config pyqt5-dev-tools qtbase5-dev + sudo apt-get install libasound2-dev liblo-dev libfluidsynth-dev libgl1-mesa-dev libgtk2.0-dev libgtk-3-dev libmagic-dev libpulse-dev libsndfile1-dev libx11-dev pkg-config pyqt5-dev-tools qtbase5-dev sudo apt-get install mingw-w64 binutils-mingw-w64-x86-64 g++-mingw-w64-x86-64 - name: make features run: make features diff --git a/source/backend/engine/CarlaEngineRtAudio.cpp b/source/backend/engine/CarlaEngineRtAudio.cpp index 7db0bdb0a..298cf6377 100644 --- a/source/backend/engine/CarlaEngineRtAudio.cpp +++ b/source/backend/engine/CarlaEngineRtAudio.cpp @@ -1073,7 +1073,7 @@ private: RtMidiEvents() : mutex(), - dataPool(512, 512), + dataPool("RtMidiEvents", 512, 512), data(dataPool), dataPending(dataPool) {} diff --git a/source/backend/plugin/CarlaPluginInternal.cpp b/source/backend/plugin/CarlaPluginInternal.cpp index bddc53def..017004a21 100644 --- a/source/backend/plugin/CarlaPluginInternal.cpp +++ b/source/backend/plugin/CarlaPluginInternal.cpp @@ -509,7 +509,7 @@ const MidiProgramData& PluginMidiProgramData::getCurrent() const noexcept CarlaPlugin::ProtectedData::ExternalNotes::ExternalNotes() noexcept : mutex(), - dataPool(32, 152), + dataPool("CarlaPlugin::ProtectedData::ExternalNotes", 32, 152), data(dataPool) {} CarlaPlugin::ProtectedData::ExternalNotes::~ExternalNotes() noexcept @@ -633,28 +633,30 @@ void CarlaPlugin::ProtectedData::Latency::recreateBuffers(const uint32_t newChan // ProtectedData::PostRtEvents CarlaPlugin::ProtectedData::PostRtEvents::PostRtEvents() noexcept - : dataPool(512, 512), + : dataPool("CarlaPlugin::ProtectedData::PostRtEvents", 512, 512), data(dataPool), dataPendingRT(dataPool), dataMutex(), - dataPendingMutex() {} + dataPendingMutex(), + poolMutex() {} CarlaPlugin::ProtectedData::PostRtEvents::~PostRtEvents() noexcept { - dataMutex.lock(); - dataPendingMutex.lock(); + const CarlaMutexLocker cml1(dataMutex); + const CarlaMutexLocker cml2(dataPendingMutex); + const CarlaMutexLocker cml3(poolMutex); data.clear(); dataPendingRT.clear(); - - dataMutex.unlock(); - dataPendingMutex.unlock(); } void CarlaPlugin::ProtectedData::PostRtEvents::appendRT(const PluginPostRtEvent& e) noexcept { CARLA_SAFE_ASSERT_INT_RETURN(dataPendingMutex.tryLock(), e.type,); - dataPendingRT.append(e); + { + const CarlaMutexLocker cml(poolMutex); + dataPendingRT.append(e); + } dataPendingMutex.unlock(); } @@ -664,7 +666,10 @@ void CarlaPlugin::ProtectedData::PostRtEvents::trySplice() noexcept if (cmtl.wasLocked() && dataPendingRT.isNotEmpty() && dataMutex.tryLock()) { - dataPendingRT.moveTo(data, true); + { + const CarlaMutexLocker cml(poolMutex); + dataPendingRT.moveTo(data, true); + } dataMutex.unlock(); } } diff --git a/source/backend/plugin/CarlaPluginInternal.hpp b/source/backend/plugin/CarlaPluginInternal.hpp index dba8f335d..4ffb00af8 100644 --- a/source/backend/plugin/CarlaPluginInternal.hpp +++ b/source/backend/plugin/CarlaPluginInternal.hpp @@ -329,9 +329,11 @@ struct CarlaPlugin::ProtectedData { struct Access { Access(PostRtEvents& e) - : data2(e.dataPool) + : data2(e.dataPool), + poolMutex(e.poolMutex) { - const CarlaMutexLocker cml(e.dataMutex); + const CarlaMutexLocker cml1(e.dataMutex); + const CarlaMutexLocker cml2(e.poolMutex); if (e.data.isNotEmpty()) e.data.moveTo(data2, true); @@ -339,6 +341,8 @@ struct CarlaPlugin::ProtectedData { ~Access() { + const CarlaMutexLocker cml(poolMutex); + data2.clear(); } @@ -354,6 +358,7 @@ struct CarlaPlugin::ProtectedData { private: RtLinkedList data2; + CarlaMutex& poolMutex; }; private: @@ -361,6 +366,7 @@ struct CarlaPlugin::ProtectedData { RtLinkedList data, dataPendingRT; CarlaMutex dataMutex; CarlaMutex dataPendingMutex; + CarlaMutex poolMutex; CARLA_DECLARE_NON_COPY_CLASS(PostRtEvents) diff --git a/source/utils/RtLinkedList.hpp b/source/utils/RtLinkedList.hpp index fc7322429..c1804ab9c 100644 --- a/source/utils/RtLinkedList.hpp +++ b/source/utils/RtLinkedList.hpp @@ -38,8 +38,9 @@ public: class Pool { public: - Pool(const std::size_t minPreallocated, const std::size_t maxPreallocated) noexcept + Pool(const char* const poolName, const std::size_t minPreallocated, const std::size_t maxPreallocated) noexcept : kDataSize(sizeof(typename AbstractLinkedList::Data)), + kPoolName(carla_strdup_safe(poolName)), fHandle(nullptr) { rtsafe_memory_pool_create(&fHandle, nullptr, kDataSize, minPreallocated, maxPreallocated); @@ -50,9 +51,11 @@ public: { if (fHandle != nullptr) { + carla_debug("Destroying %s", kPoolName); rtsafe_memory_pool_destroy(fHandle); fHandle = nullptr; } + delete[] kPoolName; } void* allocate_atomic() const noexcept @@ -84,6 +87,7 @@ public: private: const std::size_t kDataSize; + const char* const kPoolName; mutable RtMemPool_Handle fHandle;