Lv2Proc: Delay setting worker iface (Fixes #6946) (#6947)

* Lv2Proc: Delay worker iface (Fixes #6946) (#6947)

This delays passing the `LV2_Worker_Interface` to the `Lv2Worker` class,
because prior to the patch, the instance, which provides the interface,
has not been initialized yet, which resulted in a segfault.

* Update src/core/lv2/Lv2Worker.cpp

Co-authored-by: Dalton Messmer <33463986+messmerd@users.noreply.github.com>

* setIface -> setInterface

* `if(` -> `if (`

* Update src/core/lv2/Lv2Proc.cpp

Co-authored-by: saker <sakertooth@gmail.com>

* Rework, editorial, from @sakertooth

* Fixup: `interface` is reserved on MSVC

https://stackoverflow.com/a/25234279

* Apply suggestions from code review

Co-authored-by: saker <sakertooth@gmail.com>

* Initialize handle/interface as nullptr

---------

Co-authored-by: Dalton Messmer <33463986+messmerd@users.noreply.github.com>
Co-authored-by: saker <sakertooth@gmail.com>
This commit is contained in:
Johannes Lorenz
2023-10-28 00:51:00 +02:00
committed by GitHub
parent 63d03fa3a7
commit d5e6ac6dc5
3 changed files with 50 additions and 22 deletions

View File

@@ -47,16 +47,17 @@ class Lv2Worker
{
public:
// CTOR/DTOR/feature access
Lv2Worker(const LV2_Worker_Interface* iface, Semaphore* common_work_lock, bool threaded);
Lv2Worker(Semaphore* commonWorkLock, bool threaded);
~Lv2Worker();
void setHandle(LV2_Handle handle) { m_handle = handle; }
void setHandle(LV2_Handle handle);
void setInterface(const LV2_Worker_Interface* newInterface);
LV2_Worker_Schedule* feature() { return &m_scheduleFeature; }
// public API
void emitResponses();
void notifyPluginThatRunFinished()
{
if(m_iface->end_run) { m_iface->end_run(m_scheduleFeature.handle); }
if(m_interface->end_run) { m_interface->end_run(m_scheduleFeature.handle); }
}
// to be called only by static functions
@@ -69,9 +70,9 @@ private:
std::size_t bufferSize() const; //!< size of internal buffers
// parameters
const LV2_Worker_Interface* m_iface;
bool m_threaded;
LV2_Handle m_handle;
const bool m_threaded;
const LV2_Worker_Interface* m_interface = nullptr;
LV2_Handle m_handle = nullptr;
LV2_Worker_Schedule m_scheduleFeature;
// threading/synchronization