From c67392abf59b500fe405101d7ad896d9da869e47 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 5 Jan 2010 03:51:50 +0000 Subject: Realtime safe buffer reference handling. Turns out that dropping a shared_ptr is not realtime safe, even if you use a realtime safe deleter. Instead, instrusive_ptr is used for buffer references, so a buffer reference may safely be dropped in the audio thread (in which case it will be recycled by the BufferFactory). Faster, cleaner, better. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2341 a436a847-0d15-0410-975c-d299462d15a1 --- src/engine/BufferFactory.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/engine/BufferFactory.cpp') diff --git a/src/engine/BufferFactory.cpp b/src/engine/BufferFactory.cpp index aff44254..8a5617fa 100644 --- a/src/engine/BufferFactory.cpp +++ b/src/engine/BufferFactory.cpp @@ -45,7 +45,7 @@ struct BufferDeleter { }; -SharedPtr +BufferFactory::Ref BufferFactory::get(Shared::PortType type, size_t size, bool force_create) { Raul::AtomicPtr& head_ptr = free_list(type); @@ -66,16 +66,16 @@ BufferFactory::get(Shared::PortType type, size_t size, bool force_create) return create(type, size); } else { cerr << "ERROR: Failed to obtain buffer" << endl; - return SharedPtr(); + return Ref(); } } try_head->_next = NULL; - return SharedPtr(try_head, BufferDeleter(*this)); + return Ref(try_head); } -SharedPtr +BufferFactory::Ref BufferFactory::create(Shared::PortType type, size_t size) { assert(ThreadManager::current_thread_id() != THREAD_PROCESS); @@ -85,7 +85,7 @@ BufferFactory::create(Shared::PortType type, size_t size) if (type.is_control()) { if (size == 0) size = sizeof(LV2_Object) + sizeof(float); - AudioBuffer* ret = new AudioBuffer(type, size); + AudioBuffer* ret = new AudioBuffer(*this, type, size); ret->object()->type = _map->object_class_vector; ((LV2_Vector_Body*)ret->object()->body)->elem_type = _map->object_class_float32; buffer = ret; @@ -93,23 +93,23 @@ BufferFactory::create(Shared::PortType type, size_t size) if (size == 0) size = sizeof(LV2_Object) + sizeof(LV2_Vector_Body) + _engine.audio_driver()->buffer_size() * sizeof(float); - AudioBuffer* ret = new AudioBuffer(type, size); + AudioBuffer* ret = new AudioBuffer(*this, type, size); ret->object()->type = _map->object_class_float32; buffer = ret; } else if (type.is_events()) { if (size == 0) size = _engine.audio_driver()->buffer_size() * 4; // FIXME - buffer = new EventBuffer(size); + buffer = new EventBuffer(*this, size); } else if (type.is_value() || type.is_message()) { if (size == 0) size = 32; // FIXME - buffer = new ObjectBuffer(std::max(size, sizeof(LV2_Object) + sizeof(void*))); + buffer = new ObjectBuffer(*this, std::max(size, sizeof(LV2_Object) + sizeof(void*))); } else { cout << "ERROR: Failed to create buffer of unknown type" << endl; - return SharedPtr(); + return Ref(); } - return SharedPtr(buffer, BufferDeleter(*this)); + return Ref(buffer); } void -- cgit v1.2.1