summaryrefslogtreecommitdiffstats
path: root/src/server/BufferFactory.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2016-12-13 20:53:58 -0500
committerDavid Robillard <d@drobilla.net>2016-12-14 14:47:13 -0500
commite7b2f7ee286350bc3bb56b44ed98e4d8bf49af82 (patch)
tree8e5a4e42b36bb5c321f24cdd492cd3dc0a941222 /src/server/BufferFactory.cpp
parent05c55a5be68318d2b7ca861a3012bf4893bcb82d (diff)
downloadingen-e7b2f7ee286350bc3bb56b44ed98e4d8bf49af82.tar.gz
ingen-e7b2f7ee286350bc3bb56b44ed98e4d8bf49af82.tar.bz2
ingen-e7b2f7ee286350bc3bb56b44ed98e4d8bf49af82.zip
Fix real-time issues with buffer allocation
Diffstat (limited to 'src/server/BufferFactory.cpp')
-rw-r--r--src/server/BufferFactory.cpp56
1 files changed, 35 insertions, 21 deletions
diff --git a/src/server/BufferFactory.cpp b/src/server/BufferFactory.cpp
index 749e83d0..2fa98b67 100644
--- a/src/server/BufferFactory.cpp
+++ b/src/server/BufferFactory.cpp
@@ -100,37 +100,51 @@ BufferFactory::default_size(LV2_URID type) const
}
}
+Buffer*
+BufferFactory::try_get_buffer(LV2_URID type)
+{
+ std::atomic<Buffer*>& head_ptr = free_list(type);
+ Buffer* head = NULL;
+ Buffer* next;
+ do {
+ head = head_ptr.load();
+ if (!head) {
+ break;
+ }
+ next = head->_next;
+ } while (!head_ptr.compare_exchange_weak(head, next));
+
+ return head;
+}
+
BufferRef
BufferFactory::get_buffer(LV2_URID type,
LV2_URID value_type,
- uint32_t capacity,
- bool real_time,
- bool force_create)
+ uint32_t capacity)
{
- std::atomic<Buffer*>& head_ptr = free_list(type);
- Buffer* try_head = NULL;
-
- if (!force_create) {
- Buffer* next;
- do {
- try_head = head_ptr.load();
- if (!try_head)
- break;
- next = try_head->_next;
- } while (!head_ptr.compare_exchange_weak(try_head, next));
+ Buffer* try_head = try_get_buffer(type);
+ if (!try_head) {
+ return create(type, value_type, capacity);
}
+ try_head->_next = NULL;
+ try_head->set_type(&BufferFactory::get_buffer, type, value_type);
+ return BufferRef(try_head);
+}
+
+BufferRef
+BufferFactory::claim_buffer(LV2_URID type,
+ LV2_URID value_type,
+ uint32_t capacity)
+{
+ Buffer* try_head = try_get_buffer(type);
if (!try_head) {
- if (!real_time) {
- return create(type, value_type, capacity);
- } else {
- _engine.world()->log().error("Failed to obtain buffer");
- return BufferRef();
- }
+ _engine.world()->log().rt_error("Failed to obtain buffer");
+ return BufferRef();
}
try_head->_next = NULL;
- try_head->set_type(type, value_type);
+ try_head->set_type(&BufferFactory::claim_buffer, type, value_type);
return BufferRef(try_head);
}