diff options
author | David Robillard <d@drobilla.net> | 2018-11-24 13:44:03 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2018-11-24 13:44:03 +0100 |
commit | a7d83f19b08eb4c6f79a82fe60c2b86db13f4420 (patch) | |
tree | d9b620bfba1e7462df4ddb3f6225cc5216c0ca81 /src/server/RunContext.cpp | |
parent | d63edc742cebd685f8a05936682210aa5c1e69a9 (diff) | |
download | ingen-a7d83f19b08eb4c6f79a82fe60c2b86db13f4420.tar.gz ingen-a7d83f19b08eb4c6f79a82fe60c2b86db13f4420.tar.bz2 ingen-a7d83f19b08eb4c6f79a82fe60c2b86db13f4420.zip |
Squashed 'waflib/' changes from 6e726eb1..5ea8f99f
5ea8f99f Improve test output spacing
0e23b29f Raise exception when test suite fails to ensure non-zero exit status
d6de073b Show run time of unit tests
5b655541 Add short configure option for ultra-strict flags
4687ba6d Use gtest-like test output
258903d9 Fix failure count in test group summaries
da07e738 Fix verbose tests with Python 3
git-subtree-dir: waflib
git-subtree-split: 5ea8f99f6e1246079c1fe6bb590c38a53aadd40d
Diffstat (limited to 'src/server/RunContext.cpp')
-rw-r--r-- | src/server/RunContext.cpp | 195 |
1 files changed, 0 insertions, 195 deletions
diff --git a/src/server/RunContext.cpp b/src/server/RunContext.cpp deleted file mode 100644 index 3ab9d15c..00000000 --- a/src/server/RunContext.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2016 David Robillard <http://drobilla.net/> - - Ingen is free software: you can redistribute it and/or modify it under the - terms of the GNU Affero General Public License as published by the Free - Software Foundation, either version 3 of the License, or any later version. - - Ingen is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU Affero General Public License for details. - - You should have received a copy of the GNU Affero General Public License - along with Ingen. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include "ingen/Forge.hpp" -#include "ingen/Log.hpp" -#include "ingen/URIMap.hpp" - -#include "Broadcaster.hpp" -#include "BufferFactory.hpp" -#include "Engine.hpp" -#include "PortImpl.hpp" -#include "RunContext.hpp" -#include "Task.hpp" - -namespace Ingen { -namespace Server { - -struct Notification -{ - inline Notification(PortImpl* p = nullptr, - FrameTime f = 0, - LV2_URID k = 0, - uint32_t s = 0, - LV2_URID t = 0) - : port(p), time(f), key(k), size(s), type(t) - {} - - PortImpl* port; - FrameTime time; - LV2_URID key; - uint32_t size; - LV2_URID type; -}; - -RunContext::RunContext(Engine& engine, - Raul::RingBuffer* event_sink, - unsigned id, - bool threaded) - : _engine(engine) - , _event_sink(event_sink) - , _task(nullptr) - , _thread(threaded ? new std::thread(&RunContext::run, this) : nullptr) - , _id(id) - , _start(0) - , _end(0) - , _offset(0) - , _nframes(0) - , _realtime(true) -{} - -RunContext::RunContext(const RunContext& copy) - : _engine(copy._engine) - , _event_sink(copy._event_sink) - , _task(nullptr) - , _thread(nullptr) - , _id(copy._id) - , _start(copy._start) - , _end(copy._end) - , _offset(copy._offset) - , _nframes(copy._nframes) - , _realtime(copy._realtime) -{} - -bool -RunContext::must_notify(const PortImpl* port) const -{ - return (port->is_monitored() || _engine.broadcaster()->must_broadcast()); -} - -bool -RunContext::notify(LV2_URID key, - FrameTime time, - PortImpl* port, - uint32_t size, - LV2_URID type, - const void* body) -{ - const Notification n(port, time, key, size, type); - if (_event_sink->write_space() < sizeof(n) + size) { - return false; - } - if (_event_sink->write(sizeof(n), &n) != sizeof(n)) { - _engine.log().rt_error("Error writing header to notification ring\n"); - } else if (_event_sink->write(size, body) != size) { - _engine.log().rt_error("Error writing body to notification ring\n"); - } else { - return true; - } - return false; -} - -void -RunContext::emit_notifications(FrameTime end) -{ - const URIs& uris = _engine.buffer_factory()->uris(); - const uint32_t read_space = _event_sink->read_space(); - Notification note; - for (uint32_t i = 0; i < read_space; i += sizeof(note)) { - if (_event_sink->peek(sizeof(note), ¬e) != sizeof(note) || - note.time >= end) { - return; - } - if (_event_sink->read(sizeof(note), ¬e) == sizeof(note)) { - Atom value = _engine.world()->forge().alloc( - note.size, note.type, nullptr); - if (_event_sink->read(note.size, value.get_body()) == note.size) { - i += note.size; - const char* key = _engine.world()->uri_map().unmap_uri(note.key); - if (key) { - _engine.broadcaster()->set_property( - note.port->uri(), URI(key), value); - if (note.port->is_input() && - (note.key == uris.ingen_value || - note.key == uris.midi_binding)) { - // FIXME: not thread safe - note.port->set_property(URI(key), value); - } - } else { - _engine.log().rt_error("Error unmapping notification key URI\n"); - } - } else { - _engine.log().rt_error("Error reading body from notification ring\n"); - } - } else { - _engine.log().rt_error("Error reading header from notification ring\n"); - } - } -} - -void -RunContext::claim_task(Task* task) -{ - if ((_task = task)) { - _engine.signal_tasks_available(); - } -} - -Task* -RunContext::steal_task() const -{ - return _engine.steal_task(_id + 1); -} - -void -RunContext::set_priority(int priority) -{ - if (_thread) { - pthread_t pthread = _thread->native_handle(); - const int policy = (priority > 0) ? SCHED_FIFO : SCHED_OTHER; - sched_param sp; - sp.sched_priority = (priority > 0) ? priority : 0; - if (pthread_setschedparam(pthread, policy, &sp)) { - _engine.log().error( - fmt("Failed to set real-time priority of run thread (%s)\n") - % strerror(errno)); - } - } -} - -void -RunContext::join() -{ - if (_thread) { - if (_thread->joinable()) { - _thread->join(); - } - delete _thread; - } -} - -void -RunContext::run() -{ - while (_engine.wait_for_tasks()) { - for (Task* t; (t = _engine.steal_task(0));) { - t->run(*this); - } - } -} - -} // namespace Server -} // namespace Ingen |