@@ -1270,8 +1270,8 @@ private: | |||||
RtMidiEvents() | RtMidiEvents() | ||||
: dataPool(512, 512), | : dataPool(512, 512), | ||||
data(&dataPool), | |||||
dataPending(&dataPool) {} | |||||
data(dataPool), | |||||
dataPending(dataPool) {} | |||||
~RtMidiEvents() | ~RtMidiEvents() | ||||
{ | { | ||||
@@ -58,7 +58,7 @@ void CarlaEngineThread::stopNow() | |||||
fStopNow = true; | fStopNow = true; | ||||
const CarlaMutex::ScopedLocker sl(&fMutex); | |||||
const CarlaMutex::ScopedLocker sl(fMutex); | |||||
if (isRunning() && ! wait(500)) | if (isRunning() && ! wait(500)) | ||||
terminate(); | terminate(); | ||||
@@ -77,7 +77,7 @@ void CarlaEngineThread::run() | |||||
while (kEngine->isRunning() && ! fStopNow) | while (kEngine->isRunning() && ! fStopNow) | ||||
{ | { | ||||
const CarlaMutex::ScopedLocker sl(&fMutex); | |||||
const CarlaMutex::ScopedLocker sl(fMutex); | |||||
#ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
oscRegisted = kEngine->isOscBridgeRegistered(); | oscRegisted = kEngine->isOscBridgeRegistered(); | ||||
@@ -160,7 +160,7 @@ public: | |||||
if (isRunning() && ! wait(1000)) | if (isRunning() && ! wait(1000)) | ||||
terminate(); | terminate(); | ||||
const CarlaMutex::ScopedLocker sl(&fMutex); | |||||
const CarlaMutex::ScopedLocker sl(fMutex); | |||||
fPool.reset(); | fPool.reset(); | ||||
} | } | ||||
@@ -290,7 +290,7 @@ public: | |||||
i = j = 0; | i = j = 0; | ||||
// lock, and put data asap | // lock, and put data asap | ||||
const CarlaMutex::ScopedLocker sl(&fMutex); | |||||
const CarlaMutex::ScopedLocker sl(fMutex); | |||||
for (; i < fPool.size && j < rv; ++j) | for (; i < fPool.size && j < rv; ++j) | ||||
{ | { | ||||
@@ -197,7 +197,7 @@ public: | |||||
void clear() | void clear() | ||||
{ | { | ||||
const CarlaMutex::ScopedLocker sl(&fMutex); | |||||
const CarlaMutex::ScopedLocker sl(fMutex); | |||||
fData.clear(); | fData.clear(); | ||||
} | } | ||||
@@ -214,7 +214,7 @@ private: | |||||
{ | { | ||||
if (fData.isEmpty()) | if (fData.isEmpty()) | ||||
{ | { | ||||
const CarlaMutex::ScopedLocker sl(&fMutex); | |||||
const CarlaMutex::ScopedLocker sl(fMutex); | |||||
fData.append(event); | fData.append(event); | ||||
return; | return; | ||||
} | } | ||||
@@ -226,12 +226,12 @@ private: | |||||
if (event->time >= oldEvent->time) | if (event->time >= oldEvent->time) | ||||
continue; | continue; | ||||
const CarlaMutex::ScopedLocker sl(&fMutex); | |||||
const CarlaMutex::ScopedLocker sl(fMutex); | |||||
fData.insertAt(event, it); | fData.insertAt(event, it); | ||||
return; | return; | ||||
} | } | ||||
const CarlaMutex::ScopedLocker sl(&fMutex); | |||||
const CarlaMutex::ScopedLocker sl(fMutex); | |||||
fData.append(event); | fData.append(event); | ||||
} | } | ||||
}; | }; | ||||
@@ -198,8 +198,8 @@ private: | |||||
InRtEvents() | InRtEvents() | ||||
: dataPool(MIN_PREALLOCATED_EVENT_COUNT, MAX_PREALLOCATED_EVENT_COUNT), | : dataPool(MIN_PREALLOCATED_EVENT_COUNT, MAX_PREALLOCATED_EVENT_COUNT), | ||||
data(&dataPool), | |||||
dataPendingRT(&dataPool) {} | |||||
data(dataPool), | |||||
dataPendingRT(dataPool) {} | |||||
~InRtEvents() | ~InRtEvents() | ||||
{ | { | ||||
@@ -54,7 +54,7 @@ public: | |||||
if (filename == nullptr) | if (filename == nullptr) | ||||
return nullptr; | return nullptr; | ||||
const CarlaMutex::ScopedLocker sl(&mutex); | |||||
const CarlaMutex::ScopedLocker sl(mutex); | |||||
for (NonRtList<Lib>::Itenerator it = libs.begin(); it.valid(); it.next()) | for (NonRtList<Lib>::Itenerator it = libs.begin(); it.valid(); it.next()) | ||||
{ | { | ||||
@@ -89,7 +89,7 @@ public: | |||||
if (libPtr == nullptr) | if (libPtr == nullptr) | ||||
return false; | return false; | ||||
const CarlaMutex::ScopedLocker sl(&mutex); | |||||
const CarlaMutex::ScopedLocker sl(mutex); | |||||
for (NonRtList<Lib>::Itenerator it = libs.begin(); it.valid(); it.next()) | for (NonRtList<Lib>::Itenerator it = libs.begin(); it.valid(); it.next()) | ||||
{ | { | ||||
@@ -1952,7 +1952,7 @@ void CarlaPlugin::postponeRtEvent(const PluginPostRtEventType type, const int32_ | |||||
void CarlaPlugin::postRtEventsRun() | void CarlaPlugin::postRtEventsRun() | ||||
{ | { | ||||
const CarlaMutex::ScopedLocker sl(&kData->postRtEvents.mutex); | |||||
const CarlaMutex::ScopedLocker sl(kData->postRtEvents.mutex); | |||||
while (! kData->postRtEvents.data.isEmpty()) | while (! kData->postRtEvents.data.isEmpty()) | ||||
{ | { | ||||
@@ -429,7 +429,7 @@ struct CarlaPluginProtectedData { | |||||
ExternalNotes() | ExternalNotes() | ||||
: dataPool(32, 152), | : dataPool(32, 152), | ||||
data(&dataPool) {} | |||||
data(dataPool) {} | |||||
~ExternalNotes() | ~ExternalNotes() | ||||
{ | { | ||||
@@ -457,8 +457,8 @@ struct CarlaPluginProtectedData { | |||||
PostRtEvents() | PostRtEvents() | ||||
: dataPool(128, 128), | : dataPool(128, 128), | ||||
data(&dataPool), | |||||
dataPendingRT(&dataPool) {} | |||||
data(dataPool), | |||||
dataPendingRT(dataPool) {} | |||||
~PostRtEvents() | ~PostRtEvents() | ||||
{ | { | ||||
@@ -38,7 +38,7 @@ public: | |||||
Widget(Window* parent); | Widget(Window* parent); | ||||
virtual ~Widget(); | virtual ~Widget(); | ||||
bool isVisible(); | |||||
bool isVisible() const; | |||||
void setVisible(bool yesNo); | void setVisible(bool yesNo); | ||||
void show() | void show() | ||||
@@ -39,7 +39,7 @@ Widget::~Widget() | |||||
fParent->removeWidget(this); | fParent->removeWidget(this); | ||||
} | } | ||||
bool Widget::isVisible() | |||||
bool Widget::isVisible() const | |||||
{ | { | ||||
return fVisible; | return fVisible; | ||||
} | } | ||||
@@ -163,17 +163,17 @@ typedef struct _jack_latency_range jack_latency_range_t; | |||||
typedef struct _jack_position jack_position_t; | typedef struct _jack_position jack_position_t; | ||||
typedef struct _jack_midi_event jack_midi_event_t; | typedef struct _jack_midi_event jack_midi_event_t; | ||||
typedef void (*JackLatencyCallback)(jack_latency_callback_mode_t mode, void *arg); | |||||
typedef int (*JackProcessCallback)(jack_nframes_t nframes, void *arg); | |||||
typedef int (*JackBufferSizeCallback)(jack_nframes_t nframes, void *arg); | |||||
typedef int (*JackSampleRateCallback)(jack_nframes_t nframes, void *arg); | |||||
typedef void (*JackPortRegistrationCallback)(jack_port_id_t port, int register_, void *arg); | |||||
typedef void (*JackClientRegistrationCallback)(const char* name, int register_, void *arg); | |||||
typedef void (*JackLatencyCallback)(jack_latency_callback_mode_t mode, void* arg); | |||||
typedef int (*JackProcessCallback)(jack_nframes_t nframes, void* arg); | |||||
typedef int (*JackBufferSizeCallback)(jack_nframes_t nframes, void* arg); | |||||
typedef int (*JackSampleRateCallback)(jack_nframes_t nframes, void* arg); | |||||
typedef void (*JackPortRegistrationCallback)(jack_port_id_t port, int register_, void* arg); | |||||
typedef void (*JackClientRegistrationCallback)(const char* name, int register_, void* arg); | |||||
typedef void (*JackPortConnectCallback)(jack_port_id_t a, jack_port_id_t b, int connect, void* arg); | typedef void (*JackPortConnectCallback)(jack_port_id_t a, jack_port_id_t b, int connect, void* arg); | ||||
typedef int (*JackPortRenameCallback)(jack_port_id_t port, const char* old_name, const char* new_name, void *arg); | |||||
typedef void (*JackFreewheelCallback)(int starting, void *arg); | |||||
typedef int (*JackPortRenameCallback)(jack_port_id_t port, const char* old_name, const char* new_name, void* arg); | |||||
typedef void (*JackFreewheelCallback)(int starting, void* arg); | |||||
typedef int (*JackXRunCallback)(void* arg); | typedef int (*JackXRunCallback)(void* arg); | ||||
typedef void (*JackShutdownCallback)(void *arg); | |||||
typedef void (*JackShutdownCallback)(void* arg); | |||||
#endif // ! JACKBRIDGE_DIRECT | #endif // ! JACKBRIDGE_DIRECT | ||||
@@ -2,7 +2,7 @@ | |||||
#ifndef _LILV_CONFIG_H_ | #ifndef _LILV_CONFIG_H_ | ||||
#define _LILV_CONFIG_H_ | #define _LILV_CONFIG_H_ | ||||
#define LILV_VERSION "0.14.4" | |||||
#define LILV_VERSION "0.16.0" | |||||
#define LILV_NEW_LV2 1 | #define LILV_NEW_LV2 1 | ||||
#define HAVE_LV2 1 | #define HAVE_LV2 1 | ||||
@@ -2,7 +2,7 @@ | |||||
#ifndef _SRATOM_CONFIG_H_ | #ifndef _SRATOM_CONFIG_H_ | ||||
#define _SRATOM_CONFIG_H_ | #define _SRATOM_CONFIG_H_ | ||||
#define SRATOM_VERSION "0.4.0" | |||||
#define SRATOM_VERSION "0.4.2" | |||||
#define HAVE_LV2 1 | #define HAVE_LV2 1 | ||||
#define HAVE_SERD 1 | #define HAVE_SERD 1 | ||||
@@ -48,8 +48,8 @@ struct PostRtEvents { | |||||
PostRtEvents() | PostRtEvents() | ||||
: dataPool(MIN_RT_EVENTS, MAX_RT_EVENTS), | : dataPool(MIN_RT_EVENTS, MAX_RT_EVENTS), | ||||
data(&dataPool), | |||||
dataPendingRT(&dataPool) {} | |||||
data(dataPool), | |||||
dataPendingRT(dataPool) {} | |||||
~PostRtEvents() | ~PostRtEvents() | ||||
{ | { | ||||
@@ -54,8 +54,8 @@ const LADSPA_RDF_Descriptor* ladspa_rdf_dup(const LADSPA_RDF_Descriptor* const o | |||||
for (unsigned long i=0; i < newDescriptor->PortCount; ++i) | for (unsigned long i=0; i < newDescriptor->PortCount; ++i) | ||||
{ | { | ||||
LADSPA_RDF_Port* const oldPort = &oldDescriptor->Ports[i]; | |||||
LADSPA_RDF_Port* const newPort = &newDescriptor->Ports[i]; | |||||
LADSPA_RDF_Port* const oldPort(&oldDescriptor->Ports[i]); | |||||
LADSPA_RDF_Port* const newPort(&newDescriptor->Ports[i]); | |||||
newPort->Type = oldPort->Type; | newPort->Type = oldPort->Type; | ||||
newPort->Hints = oldPort->Hints; | newPort->Hints = oldPort->Hints; | ||||
@@ -72,8 +72,8 @@ const LADSPA_RDF_Descriptor* ladspa_rdf_dup(const LADSPA_RDF_Descriptor* const o | |||||
for (unsigned long j=0; j < oldPort->ScalePointCount; ++j) | for (unsigned long j=0; j < oldPort->ScalePointCount; ++j) | ||||
{ | { | ||||
LADSPA_RDF_ScalePoint* const oldScalePoint = &oldPort->ScalePoints[j]; | |||||
LADSPA_RDF_ScalePoint* const newScalePoint = &newPort->ScalePoints[j]; | |||||
LADSPA_RDF_ScalePoint* const oldScalePoint(&oldPort->ScalePoints[j]); | |||||
LADSPA_RDF_ScalePoint* const newScalePoint(&newPort->ScalePoints[j]); | |||||
newScalePoint->Value = oldScalePoint->Value; | newScalePoint->Value = oldScalePoint->Value; | ||||
@@ -77,13 +77,13 @@ const char* lib_error(const char* const filename) | |||||
#ifdef CARLA_OS_WIN | #ifdef CARLA_OS_WIN | ||||
static char libError[2048]; | static char libError[2048]; | ||||
carla_zeroMem(libError, sizeof(char)*2048); | |||||
//carla_fill<char>(libError, 2048, '\0'); | |||||
LPVOID winErrorString; | LPVOID winErrorString; | ||||
DWORD winErrorCode = GetLastError(); | DWORD winErrorCode = GetLastError(); | ||||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, winErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&winErrorString, 0, nullptr); | |||||
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, winErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&winErrorString, 0, nullptr); | |||||
snprintf(libError, 2048, "%s: error code %li: %s", filename, winErrorCode, (const char*)winErrorString); | |||||
std::snprintf(libError, 2048, "%s: error code %li: %s", filename, winErrorCode, (const char*)winErrorString); | |||||
LocalFree(winErrorString); | LocalFree(winErrorString); | ||||
return libError; | return libError; | ||||
@@ -390,10 +390,10 @@ public: | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
if (const LilvState* state = lilv_state_new_from_world(this->me, uridMap, uriNode)) | |||||
if (const LilvState* cState = lilv_state_new_from_world(this->me, uridMap, uriNode)) | |||||
{ | { | ||||
lilv_node_free(uriNode); | lilv_node_free(uriNode); | ||||
return state; | |||||
return cState; | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -567,7 +567,7 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
const QString replaceId(replaceURI.split(":").last()); | const QString replaceId(replaceURI.split(":").last()); | ||||
bool ok; | bool ok; | ||||
ulong uniqueId = replaceId.toULong(&ok); | |||||
const ulong uniqueId(replaceId.toULong(&ok)); | |||||
if (ok && uniqueId != 0) | if (ok && uniqueId != 0) | ||||
rdfDescriptor->UniqueID = uniqueId; | rdfDescriptor->UniqueID = uniqueId; | ||||
@@ -587,7 +587,7 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
for (uint32_t j = 0; j < rdfDescriptor->PortCount; ++j) | for (uint32_t j = 0; j < rdfDescriptor->PortCount; ++j) | ||||
{ | { | ||||
Lilv::Port lilvPort(lilvPlugin.get_port_by_index(j)); | Lilv::Port lilvPort(lilvPlugin.get_port_by_index(j)); | ||||
LV2_RDF_Port* const rdfPort = &rdfDescriptor->Ports[j]; | |||||
LV2_RDF_Port* const rdfPort(&rdfDescriptor->Ports[j]); | |||||
// -------------------------------------- | // -------------------------------------- | ||||
// Set Port Information | // Set Port Information | ||||
@@ -605,23 +605,24 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
// Input or Output | // Input or Output | ||||
if (lilvPort.is_a(gLv2World.port_input)) | if (lilvPort.is_a(gLv2World.port_input)) | ||||
rdfPort->Types |= LV2_PORT_INPUT; | rdfPort->Types |= LV2_PORT_INPUT; | ||||
else if (lilvPort.is_a(gLv2World.port_output)) | else if (lilvPort.is_a(gLv2World.port_output)) | ||||
rdfPort->Types |= LV2_PORT_OUTPUT; | rdfPort->Types |= LV2_PORT_OUTPUT; | ||||
else | else | ||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' is not input or output", uri, rdfPort->Name); | carla_stderr("lv2_rdf_new(\"%s\") - port '%s' is not input or output", uri, rdfPort->Name); | ||||
// Data Type | // Data Type | ||||
if (lilvPort.is_a(gLv2World.port_control)) | if (lilvPort.is_a(gLv2World.port_control)) | ||||
{ | |||||
rdfPort->Types |= LV2_PORT_CONTROL; | rdfPort->Types |= LV2_PORT_CONTROL; | ||||
} | |||||
else if (lilvPort.is_a(gLv2World.port_audio)) | else if (lilvPort.is_a(gLv2World.port_audio)) | ||||
{ | |||||
rdfPort->Types |= LV2_PORT_AUDIO; | rdfPort->Types |= LV2_PORT_AUDIO; | ||||
} | |||||
else if (lilvPort.is_a(gLv2World.port_cv)) | else if (lilvPort.is_a(gLv2World.port_cv)) | ||||
{ | |||||
rdfPort->Types |= LV2_PORT_CV; | rdfPort->Types |= LV2_PORT_CV; | ||||
} | |||||
else if (lilvPort.is_a(gLv2World.port_atom)) | else if (lilvPort.is_a(gLv2World.port_atom)) | ||||
{ | { | ||||
rdfPort->Types |= LV2_PORT_ATOM; | rdfPort->Types |= LV2_PORT_ATOM; | ||||
@@ -655,7 +656,6 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
if (! supported) | if (! supported) | ||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' is of atom type but has unsupported data", uri, rdfPort->Name); | carla_stderr("lv2_rdf_new(\"%s\") - port '%s' is of atom type but has unsupported data", uri, rdfPort->Name); | ||||
} | } | ||||
else if (lilvPort.is_a(gLv2World.port_event)) | else if (lilvPort.is_a(gLv2World.port_event)) | ||||
{ | { | ||||
rdfPort->Types |= LV2_PORT_EVENT; | rdfPort->Types |= LV2_PORT_EVENT; | ||||
@@ -680,13 +680,11 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
if (! supported) | if (! supported) | ||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' is of event type but has unsupported data", uri, rdfPort->Name); | carla_stderr("lv2_rdf_new(\"%s\") - port '%s' is of event type but has unsupported data", uri, rdfPort->Name); | ||||
} | } | ||||
else if (lilvPort.is_a(gLv2World.port_midi)) | else if (lilvPort.is_a(gLv2World.port_midi)) | ||||
{ | { | ||||
rdfPort->Types |= LV2_PORT_MIDI_LL; | rdfPort->Types |= LV2_PORT_MIDI_LL; | ||||
rdfPort->Types |= LV2_PORT_DATA_MIDI_EVENT; | rdfPort->Types |= LV2_PORT_DATA_MIDI_EVENT; | ||||
} | } | ||||
else | else | ||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' is of unkown data type", uri, rdfPort->Name); | carla_stderr("lv2_rdf_new(\"%s\") - port '%s' is of unkown data type", uri, rdfPort->Name); | ||||
} | } | ||||
@@ -726,6 +724,66 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
if (lilvPort.has_property(gLv2World.reportsLatency)) | if (lilvPort.has_property(gLv2World.reportsLatency)) | ||||
rdfPort->Designation = LV2_PORT_DESIGNATION_LATENCY; | rdfPort->Designation = LV2_PORT_DESIGNATION_LATENCY; | ||||
// no port properties, check if port uses old ones | |||||
if (rdfPort->Properties == 0x0) | |||||
{ | |||||
static const Lilv::Node oldPropArtifacts(gLv2World.new_uri("http://lv2plug.in/ns/dev/extportinfo#causesArtifacts")); | |||||
static const Lilv::Node oldPropContinuousCV(gLv2World.new_uri("http://lv2plug.in/ns/dev/extportinfo#continuousCV")); | |||||
static const Lilv::Node oldPropDiscreteCV(gLv2World.new_uri("http://lv2plug.in/ns/dev/extportinfo#discreteCV")); | |||||
static const Lilv::Node oldPropExpensive(gLv2World.new_uri("http://lv2plug.in/ns/dev/extportinfo#expensive")); | |||||
static const Lilv::Node oldPropStrictBounds(gLv2World.new_uri("http://lv2plug.in/ns/dev/extportinfo#hasStrictBounds")); | |||||
static const Lilv::Node oldPropLogarithmic(gLv2World.new_uri("http://lv2plug.in/ns/dev/extportinfo#logarithmic")); | |||||
static const Lilv::Node oldPropNotAutomatic(gLv2World.new_uri("http://lv2plug.in/ns/dev/extportinfo#notAutomatic")); | |||||
static const Lilv::Node oldPropNotOnGUI(gLv2World.new_uri("http://lv2plug.in/ns/dev/extportinfo#notOnGUI")); | |||||
static const Lilv::Node oldPropTrigger(gLv2World.new_uri("http://lv2plug.in/ns/dev/extportinfo#trigger")); | |||||
if (lilvPort.has_property(oldPropArtifacts)) | |||||
{ | |||||
rdfPort->Properties |= LV2_PORT_CAUSES_ARTIFACTS; | |||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' uses old/broken LV2 property for 'causesArtifacts'", uri, rdfPort->Name); | |||||
} | |||||
if (lilvPort.has_property(oldPropContinuousCV)) | |||||
{ | |||||
rdfPort->Properties |= LV2_PORT_CONTINUOUS_CV; | |||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' uses old/broken LV2 property for 'continuousCV'", uri, rdfPort->Name); | |||||
} | |||||
if (lilvPort.has_property(oldPropDiscreteCV)) | |||||
{ | |||||
rdfPort->Properties |= LV2_PORT_DISCRETE_CV; | |||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' uses old/broken LV2 property for 'discreteCV'", uri, rdfPort->Name); | |||||
} | |||||
if (lilvPort.has_property(oldPropExpensive)) | |||||
{ | |||||
rdfPort->Properties |= LV2_PORT_EXPENSIVE; | |||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' uses old/broken LV2 property for 'expensive'", uri, rdfPort->Name); | |||||
} | |||||
if (lilvPort.has_property(oldPropStrictBounds)) | |||||
{ | |||||
rdfPort->Properties |= LV2_PORT_STRICT_BOUNDS; | |||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' uses old/broken LV2 property for 'hasStrictBounds'", uri, rdfPort->Name); | |||||
} | |||||
if (lilvPort.has_property(oldPropLogarithmic)) | |||||
{ | |||||
rdfPort->Properties |= LV2_PORT_LOGARITHMIC; | |||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' uses old/broken LV2 property for 'logarithmic'", uri, rdfPort->Name); | |||||
} | |||||
if (lilvPort.has_property(oldPropNotAutomatic)) | |||||
{ | |||||
rdfPort->Properties |= LV2_PORT_NOT_AUTOMATIC; | |||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' uses old/broken LV2 property for 'notAutomatic'", uri, rdfPort->Name); | |||||
} | |||||
if (lilvPort.has_property(oldPropNotOnGUI)) | |||||
{ | |||||
rdfPort->Properties |= LV2_PORT_NOT_ON_GUI; | |||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' uses old/broken LV2 property for 'notOnGUI'", uri, rdfPort->Name); | |||||
} | |||||
if (lilvPort.has_property(oldPropTrigger)) | |||||
{ | |||||
rdfPort->Properties |= LV2_PORT_TRIGGER; | |||||
carla_stderr("lv2_rdf_new(\"%s\") - port '%s' uses old/broken LV2 property for 'trigger'", uri, rdfPort->Name); | |||||
} | |||||
} | |||||
} | } | ||||
// -------------------------------------- | // -------------------------------------- | ||||
@@ -946,8 +1004,10 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
uint32_t h = 0; | uint32_t h = 0; | ||||
LILV_FOREACH(scale_points, j, lilvScalePoints) | LILV_FOREACH(scale_points, j, lilvScalePoints) | ||||
{ | { | ||||
CARLA_ASSERT(h < rdfPort->ScalePointCount); | |||||
Lilv::ScalePoint lilvScalePoint(lilvScalePoints.get(j)); | Lilv::ScalePoint lilvScalePoint(lilvScalePoints.get(j)); | ||||
LV2_RDF_PortScalePoint* const rdfScalePoint = &rdfPort->ScalePoints[h++]; | |||||
LV2_RDF_PortScalePoint* const rdfScalePoint(&rdfPort->ScalePoints[h++]); | |||||
if (const char* const label = Lilv::Node(lilvScalePoint.get_label()).as_string()) | if (const char* const label = Lilv::Node(lilvScalePoint.get_label()).as_string()) | ||||
rdfScalePoint->Label = carla_strdup(label); | rdfScalePoint->Label = carla_strdup(label); | ||||
@@ -971,7 +1031,7 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
LILV_FOREACH(nodes, j, presetNodes) | LILV_FOREACH(nodes, j, presetNodes) | ||||
{ | { | ||||
Lilv::Node presetNode(presetNodes.get(j)); | Lilv::Node presetNode(presetNodes.get(j)); | ||||
// FIXME - check appliesTo | |||||
// FIXME - check appliesTo? | |||||
QString presetURI(presetNode.as_uri()); | QString presetURI(presetNode.as_uri()); | ||||
@@ -995,12 +1055,14 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
if (const char* const presetURI = presetNode.as_uri()) | if (const char* const presetURI = presetNode.as_uri()) | ||||
{ | { | ||||
int32_t index = presetListURIs.indexOf(QString(presetURI)); | |||||
const int index(presetListURIs.indexOf(QString(presetURI))); | |||||
CARLA_ASSERT(index >= 0); | |||||
if (index < 0) | if (index < 0) | ||||
continue; | continue; | ||||
LV2_RDF_Preset* const rdfPreset = &rdfDescriptor->Presets[index]; | |||||
LV2_RDF_Preset* const rdfPreset(&rdfDescriptor->Presets[index]); | |||||
// -------------------------------------- | // -------------------------------------- | ||||
// Set Preset Information | // Set Preset Information | ||||
@@ -1036,9 +1098,10 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
LILV_FOREACH(nodes, j, lilvFeatureNodes) | LILV_FOREACH(nodes, j, lilvFeatureNodes) | ||||
{ | { | ||||
CARLA_ASSERT(h < rdfDescriptor->FeatureCount); | CARLA_ASSERT(h < rdfDescriptor->FeatureCount); | ||||
Lilv::Node lilvFeatureNode(lilvFeatureNodes.get(j)); | Lilv::Node lilvFeatureNode(lilvFeatureNodes.get(j)); | ||||
LV2_RDF_Feature* const rdfFeature(&rdfDescriptor->Features[h++]); | |||||
LV2_RDF_Feature* const rdfFeature = &rdfDescriptor->Features[h++]; | |||||
rdfFeature->Type = lilvFeatureNodesR.contains(lilvFeatureNode) ? LV2_FEATURE_REQUIRED : LV2_FEATURE_OPTIONAL; | rdfFeature->Type = lilvFeatureNodesR.contains(lilvFeatureNode) ? LV2_FEATURE_REQUIRED : LV2_FEATURE_OPTIONAL; | ||||
if (const char* const featureURI = lilvFeatureNode.as_uri()) | if (const char* const featureURI = lilvFeatureNode.as_uri()) | ||||
@@ -1061,9 +1124,9 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
LILV_FOREACH(nodes, j, lilvExtensionDataNodes) | LILV_FOREACH(nodes, j, lilvExtensionDataNodes) | ||||
{ | { | ||||
CARLA_ASSERT(h < rdfDescriptor->ExtensionCount); | CARLA_ASSERT(h < rdfDescriptor->ExtensionCount); | ||||
Lilv::Node lilvExtensionDataNode(lilvExtensionDataNodes.get(j)); | |||||
LV2_URI* const rdfExtension = &rdfDescriptor->Extensions[h++]; | |||||
Lilv::Node lilvExtensionDataNode(lilvExtensionDataNodes.get(j)); | |||||
LV2_URI* const rdfExtension(&rdfDescriptor->Extensions[h++]); | |||||
if (const char* const extURI = lilvExtensionDataNode.as_uri()) | if (const char* const extURI = lilvExtensionDataNode.as_uri()) | ||||
*rdfExtension = carla_strdup(extURI); | *rdfExtension = carla_strdup(extURI); | ||||
@@ -1085,9 +1148,9 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
LILV_FOREACH(uis, j, lilvUIs) | LILV_FOREACH(uis, j, lilvUIs) | ||||
{ | { | ||||
CARLA_ASSERT(h < rdfDescriptor->UICount); | CARLA_ASSERT(h < rdfDescriptor->UICount); | ||||
Lilv::UI lilvUI(lilvUIs.get(j)); | |||||
LV2_RDF_UI* const rdfUI = &rdfDescriptor->UIs[h++]; | |||||
Lilv::UI lilvUI(lilvUIs.get(j)); | |||||
LV2_RDF_UI* const rdfUI(&rdfDescriptor->UIs[h++]); | |||||
// -------------------------------------- | // -------------------------------------- | ||||
// Set UI Type | // Set UI Type | ||||
@@ -1142,9 +1205,10 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
LILV_FOREACH(nodes, k, lilvFeatureNodes) | LILV_FOREACH(nodes, k, lilvFeatureNodes) | ||||
{ | { | ||||
CARLA_ASSERT(x < rdfUI->FeatureCount); | CARLA_ASSERT(x < rdfUI->FeatureCount); | ||||
Lilv::Node lilvFeatureNode(lilvFeatureNodes.get(k)); | Lilv::Node lilvFeatureNode(lilvFeatureNodes.get(k)); | ||||
LV2_RDF_Feature* const rdfFeature(&rdfUI->Features[x++]); | |||||
LV2_RDF_Feature* const rdfFeature = &rdfUI->Features[x++]; | |||||
rdfFeature->Type = lilvFeatureNodesR.contains(lilvFeatureNode) ? LV2_FEATURE_REQUIRED : LV2_FEATURE_OPTIONAL; | rdfFeature->Type = lilvFeatureNodesR.contains(lilvFeatureNode) ? LV2_FEATURE_REQUIRED : LV2_FEATURE_OPTIONAL; | ||||
if (const char* const featureURI = lilvFeatureNode.as_uri()) | if (const char* const featureURI = lilvFeatureNode.as_uri()) | ||||
@@ -1167,9 +1231,9 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri) | |||||
LILV_FOREACH(nodes, k, lilvExtensionDataNodes) | LILV_FOREACH(nodes, k, lilvExtensionDataNodes) | ||||
{ | { | ||||
CARLA_ASSERT(x < rdfUI->ExtensionCount); | CARLA_ASSERT(x < rdfUI->ExtensionCount); | ||||
Lilv::Node lilvExtensionDataNode(lilvExtensionDataNodes.get(k)); | |||||
LV2_URI* const rdfExtension = &rdfUI->Extensions[x++]; | |||||
Lilv::Node lilvExtensionDataNode(lilvExtensionDataNodes.get(k)); | |||||
LV2_URI* const rdfExtension(&rdfUI->Extensions[x++]); | |||||
if (const char* const extURI = lilvExtensionDataNode.as_uri()) | if (const char* const extURI = lilvExtensionDataNode.as_uri()) | ||||
*rdfExtension = carla_strdup(extURI); | *rdfExtension = carla_strdup(extURI); | ||||
@@ -1269,10 +1333,10 @@ bool is_lv2_ui_feature_supported(const LV2_URI uri) | |||||
return true; | return true; | ||||
if (std::strcmp(uri, LV2_INSTANCE_ACCESS_URI) == 0) | if (std::strcmp(uri, LV2_INSTANCE_ACCESS_URI) == 0) | ||||
return true; | return true; | ||||
if (std::strcmp(uri, LV2_UI__idle) == 0) | |||||
return true; | |||||
if (std::strcmp(uri, LV2_UI__fixedSize) == 0) | if (std::strcmp(uri, LV2_UI__fixedSize) == 0) | ||||
return true; | return true; | ||||
if (std::strcmp(uri, LV2_UI__idle) == 0) | |||||
return true; | |||||
if (std::strcmp(uri, LV2_UI__makeResident) == 0) | if (std::strcmp(uri, LV2_UI__makeResident) == 0) | ||||
return true; | return true; | ||||
if (std::strcmp(uri, LV2_UI__noUserResize) == 0) | if (std::strcmp(uri, LV2_UI__noUserResize) == 0) | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla Mutex | * Carla Mutex | ||||
* Copyright (C) 2011-2013 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2013 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -35,7 +35,7 @@ class CarlaMutex | |||||
{ | { | ||||
public: | public: | ||||
CarlaMutex() | CarlaMutex() | ||||
: fTryLockCalled(false) | |||||
: fTryLockWasCalled(false) | |||||
{ | { | ||||
#ifndef CPP11_MUTEX | #ifndef CPP11_MUTEX | ||||
pthread_mutex_init(&pmutex, nullptr); | pthread_mutex_init(&pmutex, nullptr); | ||||
@@ -60,7 +60,7 @@ public: | |||||
bool tryLock() | bool tryLock() | ||||
{ | { | ||||
fTryLockCalled = true; | |||||
fTryLockWasCalled = true; | |||||
#ifdef CPP11_MUTEX | #ifdef CPP11_MUTEX | ||||
return cmutex.try_lock(); | return cmutex.try_lock(); | ||||
@@ -80,27 +80,27 @@ public: | |||||
bool wasTryLockCalled() | bool wasTryLockCalled() | ||||
{ | { | ||||
const bool ret = fTryLockCalled; | |||||
fTryLockCalled = false; | |||||
const bool ret = fTryLockWasCalled; | |||||
fTryLockWasCalled = false; | |||||
return ret; | return ret; | ||||
} | } | ||||
class ScopedLocker | class ScopedLocker | ||||
{ | { | ||||
public: | public: | ||||
ScopedLocker(CarlaMutex* const mutex) | |||||
ScopedLocker(CarlaMutex& mutex) | |||||
: fMutex(mutex) | : fMutex(mutex) | ||||
{ | { | ||||
fMutex->lock(); | |||||
fMutex.lock(); | |||||
} | } | ||||
~ScopedLocker() | ~ScopedLocker() | ||||
{ | { | ||||
fMutex->unlock(); | |||||
fMutex.unlock(); | |||||
} | } | ||||
private: | private: | ||||
CarlaMutex* const fMutex; | |||||
CarlaMutex& fMutex; | |||||
CARLA_PREVENT_HEAP_ALLOCATION | CARLA_PREVENT_HEAP_ALLOCATION | ||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ScopedLocker) | CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ScopedLocker) | ||||
@@ -112,7 +112,7 @@ private: | |||||
#else | #else | ||||
pthread_mutex_t pmutex; | pthread_mutex_t pmutex; | ||||
#endif | #endif | ||||
bool fTryLockCalled; | |||||
bool fTryLockWasCalled; | |||||
CARLA_PREVENT_HEAP_ALLOCATION | CARLA_PREVENT_HEAP_ALLOCATION | ||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaMutex) | CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaMutex) | ||||
@@ -138,7 +138,7 @@ public: | |||||
{ | { | ||||
std::memcpy(&data->value, &value, sizeof(T)); | std::memcpy(&data->value, &value, sizeof(T)); | ||||
list_add_tail(&data->siblings, &fQueue); | list_add_tail(&data->siblings, &fQueue); | ||||
fCount++; | |||||
++fCount; | |||||
return true; | return true; | ||||
} | } | ||||
@@ -151,7 +151,7 @@ public: | |||||
{ | { | ||||
std::memcpy(&data->value, &value, sizeof(T)); | std::memcpy(&data->value, &value, sizeof(T)); | ||||
list_add_tail(&data->siblings, it.fEntry->next); | list_add_tail(&data->siblings, it.fEntry->next); | ||||
fCount++; | |||||
++fCount; | |||||
return true; | return true; | ||||
} | } | ||||
@@ -164,7 +164,7 @@ public: | |||||
{ | { | ||||
std::memcpy(&data->value, &value, sizeof(T)); | std::memcpy(&data->value, &value, sizeof(T)); | ||||
list_add(&data->siblings, &fQueue); | list_add(&data->siblings, &fQueue); | ||||
fCount++; | |||||
++fCount; | |||||
return true; | return true; | ||||
} | } | ||||
@@ -177,7 +177,7 @@ public: | |||||
{ | { | ||||
std::memcpy(&data->value, &value, sizeof(T)); | std::memcpy(&data->value, &value, sizeof(T)); | ||||
list_add(&data->siblings, it.fEntry->prev); | list_add(&data->siblings, it.fEntry->prev); | ||||
fCount++; | |||||
++fCount; | |||||
return true; | return true; | ||||
} | } | ||||
@@ -203,7 +203,7 @@ public: | |||||
if (remove) | if (remove) | ||||
{ | { | ||||
fCount--; | |||||
--fCount; | |||||
list_del(entry); | list_del(entry); | ||||
if (data != nullptr) | if (data != nullptr) | ||||
@@ -235,7 +235,7 @@ public: | |||||
if (it.fEntry != nullptr && it.fData != nullptr) | if (it.fEntry != nullptr && it.fData != nullptr) | ||||
{ | { | ||||
fCount--; | |||||
--fCount; | |||||
list_del(it.fEntry); | list_del(it.fEntry); | ||||
_deallocate(it.fData); | _deallocate(it.fData); | ||||
} | } | ||||
@@ -255,7 +255,7 @@ public: | |||||
if (data != nullptr && data->value == value) | if (data != nullptr && data->value == value) | ||||
{ | { | ||||
fCount--; | |||||
--fCount; | |||||
list_del(entry); | list_del(entry); | ||||
_deallocate(data); | _deallocate(data); | ||||
break; | break; | ||||
@@ -269,9 +269,9 @@ public: | |||||
{ | { | ||||
Data* data; | Data* data; | ||||
k_list_head* entry; | k_list_head* entry; | ||||
k_list_head* tmp; | |||||
k_list_head* entry2; | |||||
list_for_each_safe(entry, tmp, &fQueue) | |||||
list_for_each_safe(entry, entry2, &fQueue) | |||||
{ | { | ||||
data = list_entry(entry, Data, siblings); | data = list_entry(entry, Data, siblings); | ||||
@@ -279,14 +279,14 @@ public: | |||||
if (data != nullptr && data->value == value) | if (data != nullptr && data->value == value) | ||||
{ | { | ||||
fCount--; | |||||
--fCount; | |||||
list_del(entry); | list_del(entry); | ||||
_deallocate(data); | _deallocate(data); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
virtual void spliceAppend(List& list, const bool init = false) | |||||
void spliceAppend(List& list, const bool init = false) | |||||
{ | { | ||||
if (init) | if (init) | ||||
{ | { | ||||
@@ -301,7 +301,7 @@ public: | |||||
} | } | ||||
} | } | ||||
virtual void spliceInsert(List& list, const bool init = false) | |||||
void spliceInsert(List& list, const bool init = false) | |||||
{ | { | ||||
if (init) | if (init) | ||||
{ | { | ||||
@@ -348,7 +348,7 @@ private: | |||||
if (data != nullptr && remove) | if (data != nullptr && remove) | ||||
{ | { | ||||
fCount--; | |||||
--fCount; | |||||
list_del(entry); | list_del(entry); | ||||
_deallocate(data); | _deallocate(data); | ||||
} | } | ||||
@@ -358,7 +358,6 @@ private: | |||||
T& _getEmpty() | T& _getEmpty() | ||||
{ | { | ||||
// FIXME ? | |||||
static T value; | static T value; | ||||
static bool reset = true; | static bool reset = true; | ||||
@@ -391,14 +390,16 @@ public: | |||||
: fHandle(nullptr), | : fHandle(nullptr), | ||||
kDataSize(sizeof(typename List<T>::Data)) | kDataSize(sizeof(typename List<T>::Data)) | ||||
{ | { | ||||
rtsafe_memory_pool_create(&fHandle, nullptr, kDataSize, minPreallocated, maxPreallocated); | |||||
CARLA_ASSERT(fHandle != nullptr); | |||||
resize(minPreallocated, maxPreallocated); | |||||
} | } | ||||
~Pool() | ~Pool() | ||||
{ | { | ||||
if (fHandle != nullptr) | if (fHandle != nullptr) | ||||
{ | |||||
rtsafe_memory_pool_destroy(fHandle); | rtsafe_memory_pool_destroy(fHandle); | ||||
fHandle = nullptr; | |||||
} | |||||
} | } | ||||
void* allocate_atomic() | void* allocate_atomic() | ||||
@@ -418,8 +419,6 @@ public: | |||||
void resize(const size_t minPreallocated, const size_t maxPreallocated) | void resize(const size_t minPreallocated, const size_t maxPreallocated) | ||||
{ | { | ||||
CARLA_ASSERT(this->fCount == 0); | |||||
if (fHandle != nullptr) | if (fHandle != nullptr) | ||||
{ | { | ||||
rtsafe_memory_pool_destroy(fHandle); | rtsafe_memory_pool_destroy(fHandle); | ||||
@@ -430,6 +429,16 @@ public: | |||||
CARLA_ASSERT(fHandle != nullptr); | CARLA_ASSERT(fHandle != nullptr); | ||||
} | } | ||||
bool operator==(const Pool& pool) const | |||||
{ | |||||
return (fHandle == pool.fHandle && kDataSize == pool.kDataSize); | |||||
} | |||||
bool operator!=(const Pool& pool) const | |||||
{ | |||||
return (fHandle != pool.fHandle || kDataSize != pool.kDataSize); | |||||
} | |||||
private: | private: | ||||
RtMemPool_Handle fHandle; | RtMemPool_Handle fHandle; | ||||
const size_t kDataSize; | const size_t kDataSize; | ||||
@@ -438,10 +447,9 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Now the actual list code | // Now the actual list code | ||||
RtList(Pool* const memPool) | |||||
: kMemPool(memPool) | |||||
RtList(Pool& memPool) | |||||
: fMemPool(memPool) | |||||
{ | { | ||||
CARLA_ASSERT(kMemPool != nullptr); | |||||
} | } | ||||
~RtList() override | ~RtList() override | ||||
@@ -454,7 +462,7 @@ public: | |||||
{ | { | ||||
std::memcpy(&data->value, &value, sizeof(T)); | std::memcpy(&data->value, &value, sizeof(T)); | ||||
list_add_tail(&data->siblings, &this->fQueue); | list_add_tail(&data->siblings, &this->fQueue); | ||||
this->fCount++; | |||||
++this->fCount; | |||||
} | } | ||||
} | } | ||||
@@ -464,7 +472,7 @@ public: | |||||
{ | { | ||||
std::memcpy(&data->value, &value, sizeof(T)); | std::memcpy(&data->value, &value, sizeof(T)); | ||||
list_add(&data->siblings, &this->fQueue); | list_add(&data->siblings, &this->fQueue); | ||||
this->fCount++; | |||||
++this->fCount; | |||||
} | } | ||||
} | } | ||||
@@ -472,25 +480,25 @@ public: | |||||
{ | { | ||||
this->clear(); | this->clear(); | ||||
kMemPool->resize(minPreallocated, maxPreallocated); | |||||
fMemPool.resize(minPreallocated, maxPreallocated); | |||||
} | } | ||||
void spliceAppend(RtList& list, const bool init = false) | void spliceAppend(RtList& list, const bool init = false) | ||||
{ | { | ||||
CARLA_ASSERT(kMemPool == list.kMemPool); | |||||
CARLA_ASSERT(fMemPool == list.fMemPool); | |||||
List<T>::spliceAppend(list, init); | List<T>::spliceAppend(list, init); | ||||
} | } | ||||
void spliceInsert(RtList& list, const bool init = false) | void spliceInsert(RtList& list, const bool init = false) | ||||
{ | { | ||||
CARLA_ASSERT(kMemPool == list.kMemPool); | |||||
CARLA_ASSERT(fMemPool == list.fMemPool); | |||||
List<T>::spliceInsert(list, init); | List<T>::spliceInsert(list, init); | ||||
} | } | ||||
private: | private: | ||||
Pool* const kMemPool; | |||||
Pool& fMemPool; | |||||
typename List<T>::Data* _allocate() override | typename List<T>::Data* _allocate() override | ||||
{ | { | ||||
@@ -499,17 +507,17 @@ private: | |||||
typename List<T>::Data* _allocate_atomic() | typename List<T>::Data* _allocate_atomic() | ||||
{ | { | ||||
return (typename List<T>::Data*)kMemPool->allocate_atomic(); | |||||
return (typename List<T>::Data*)fMemPool.allocate_atomic(); | |||||
} | } | ||||
typename List<T>::Data* _allocate_sleepy() | typename List<T>::Data* _allocate_sleepy() | ||||
{ | { | ||||
return (typename List<T>::Data*)kMemPool->allocate_sleepy(); | |||||
return (typename List<T>::Data*)fMemPool.allocate_sleepy(); | |||||
} | } | ||||
void _deallocate(typename List<T>::Data* const dataPtr) override | void _deallocate(typename List<T>::Data* const dataPtr) override | ||||
{ | { | ||||
kMemPool->deallocate(dataPtr); | |||||
fMemPool.deallocate(dataPtr); | |||||
} | } | ||||
LIST_DECLARATIONS(RtList) | LIST_DECLARATIONS(RtList) | ||||
@@ -526,7 +534,7 @@ public: | |||||
{ | { | ||||
} | } | ||||
~NonRtList() | |||||
~NonRtList() override | |||||
{ | { | ||||
} | } | ||||