From f180683d453814dcd4a00eb5f0946fd7fc5677c4 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 14 May 2012 04:30:00 +0000 Subject: Remove Thread context stuff and add a thread-specific variable class, ThreadVar, which can be used for this and many other things. ClientBroadcaster => Broadcaster. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4405 a436a847-0d15-0410-975c-d299462d15a1 --- src/server/Broadcaster.cpp | 116 +++++++++++++++++++++++++++++++++ src/server/Broadcaster.hpp | 126 ++++++++++++++++++++++++++++++++++++ src/server/ClientBroadcaster.cpp | 116 --------------------------------- src/server/ClientBroadcaster.hpp | 126 ------------------------------------ src/server/Engine.cpp | 8 +-- src/server/Engine.hpp | 38 +++++------ src/server/EventWriter.cpp | 2 +- src/server/JackDriver.cpp | 3 +- src/server/MessageContext.cpp | 4 +- src/server/NodeImpl.cpp | 1 - src/server/NodeImpl.hpp | 8 +-- src/server/Notification.cpp | 2 +- src/server/ObjectSender.cpp | 2 +- src/server/PatchImpl.cpp | 10 ++- src/server/PatchImpl.hpp | 2 +- src/server/PreProcessor.cpp | 3 +- src/server/ProcessSlave.cpp | 2 + src/server/ProcessSlave.hpp | 2 - src/server/ThreadManager.hpp | 33 ++++++---- src/server/events/Connect.cpp | 2 +- src/server/events/CreateNode.cpp | 2 +- src/server/events/CreatePatch.cpp | 10 +-- src/server/events/CreatePort.cpp | 4 +- src/server/events/Delete.cpp | 6 +- src/server/events/Disconnect.cpp | 2 +- src/server/events/DisconnectAll.cpp | 2 +- src/server/events/Get.cpp | 2 +- src/server/events/Move.cpp | 2 +- src/server/events/SetMetadata.cpp | 2 +- src/server/events/SetPortValue.cpp | 2 +- src/server/ingen_lv2.cpp | 6 +- src/server/wscript | 2 +- 32 files changed, 329 insertions(+), 319 deletions(-) create mode 100644 src/server/Broadcaster.cpp create mode 100644 src/server/Broadcaster.hpp delete mode 100644 src/server/ClientBroadcaster.cpp delete mode 100644 src/server/ClientBroadcaster.hpp (limited to 'src') diff --git a/src/server/Broadcaster.cpp b/src/server/Broadcaster.cpp new file mode 100644 index 00000000..0b4e95d5 --- /dev/null +++ b/src/server/Broadcaster.cpp @@ -0,0 +1,116 @@ +/* + This file is part of Ingen. + Copyright 2007-2012 David Robillard + + 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 . +*/ + +#include +#include + +#include "ingen/Interface.hpp" +#include "raul/log.hpp" + +#include "Broadcaster.hpp" +#include "EdgeImpl.hpp" +#include "EngineStore.hpp" +#include "ObjectSender.hpp" +#include "PluginImpl.hpp" +#include "util.hpp" + +#define LOG(s) (s("[Broadcaster] ")) + +namespace Ingen { +namespace Server { + +/** Register a client to receive messages over the notification band. + */ +void +Broadcaster::register_client(const Raul::URI& uri, + SharedPtr client) +{ + Glib::Mutex::Lock lock(_clients_mutex); + LOG(Raul::info)(Raul::fmt("Registered client <%1%>\n") % uri); + _clients[uri] = client; +} + +/** Remove a client from the list of registered clients. + * + * @return true if client was found and removed. + */ +bool +Broadcaster::unregister_client(const Raul::URI& uri) +{ + Glib::Mutex::Lock lock(_clients_mutex); + const size_t erased = _clients.erase(uri); + + if (erased > 0) { + LOG(Raul::info)(Raul::fmt("Unregistered client <%1%>\n") % uri); + } + + return (erased > 0); +} + +/** Looks up the client with the given source @a uri (which is used as the + * unique identifier for registered clients). + */ +SharedPtr +Broadcaster::client(const Raul::URI& uri) +{ + Glib::Mutex::Lock lock(_clients_mutex); + Clients::iterator i = _clients.find(uri); + if (i != _clients.end()) { + return (*i).second; + } else { + return SharedPtr(); + } +} + +void +Broadcaster::send_plugins(const NodeFactory::Plugins& plugins) +{ + Glib::Mutex::Lock lock(_clients_mutex); + for (Clients::const_iterator c = _clients.begin(); c != _clients.end(); ++c) { + send_plugins_to((*c).second.get(), plugins); + } +} + +void +Broadcaster::send_plugins_to(Interface* client, + const NodeFactory::Plugins& plugins) +{ + client->bundle_begin(); + + for (NodeFactory::Plugins::const_iterator i = plugins.begin(); i != plugins.end(); ++i) { + const PluginImpl* const plugin = i->second; + client->put(plugin->uri(), plugin->properties()); + } + + client->bundle_end(); +} + +/** Send an object to all clients. + * + * @param o Object to send + * @param recursive If true send all children of object + */ +void +Broadcaster::send_object(const GraphObjectImpl* o, bool recursive) +{ + Glib::Mutex::Lock lock(_clients_mutex); + for (Clients::const_iterator i = _clients.begin(); i != _clients.end(); ++i) { + ObjectSender::send_object((*i).second.get(), o, recursive); + } +} + +} // namespace Server +} // namespace Ingen diff --git a/src/server/Broadcaster.hpp b/src/server/Broadcaster.hpp new file mode 100644 index 00000000..6942a578 --- /dev/null +++ b/src/server/Broadcaster.hpp @@ -0,0 +1,126 @@ +/* + This file is part of Ingen. + Copyright 2007-2012 David Robillard + + 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 . +*/ + +#ifndef INGEN_ENGINE_CLIENTBROADCASTER_HPP +#define INGEN_ENGINE_CLIENTBROADCASTER_HPP + +#include +#include +#include + +#include + +#include "raul/SharedPtr.hpp" + +#include "ingen/Interface.hpp" + +#include "NodeFactory.hpp" + +namespace Ingen { +namespace Server { + +class GraphObjectImpl; + +/** Broadcaster for all clients. + * + * This is an Interface that forwards all messages to all registered + * clients (for updating all clients on state changes in the engine). + * + * \ingroup engine + */ +class Broadcaster : public Interface +{ +public: + void register_client(const Raul::URI& uri, SharedPtr client); + bool unregister_client(const Raul::URI& uri); + + SharedPtr client(const Raul::URI& uri); + + void send_plugins(const NodeFactory::Plugins& plugin_list); + void send_plugins_to(Interface*, const NodeFactory::Plugins& plugin_list); + + void send_object(const GraphObjectImpl* p, bool recursive); + +#define BROADCAST(msg, ...) \ + Glib::Mutex::Lock lock(_clients_mutex); \ + for (Clients::const_iterator i = _clients.begin(); i != _clients.end(); ++i) \ + (*i).second->msg(__VA_ARGS__) + + void bundle_begin() { BROADCAST(bundle_begin); } + void bundle_end() { BROADCAST(bundle_end); } + + void put(const Raul::URI& uri, + const Resource::Properties& properties, + Resource::Graph ctx=Resource::DEFAULT) { + BROADCAST(put, uri, properties); + } + + void delta(const Raul::URI& uri, + const Resource::Properties& remove, + const Resource::Properties& add) { + BROADCAST(delta, uri, remove, add); + } + + void move(const Raul::Path& old_path, + const Raul::Path& new_path) { + BROADCAST(move, old_path, new_path); + } + + void del(const Raul::URI& uri) { + BROADCAST(del, uri); + } + + void connect(const Raul::Path& tail, + const Raul::Path& head) { + BROADCAST(connect, tail, head); + } + + void disconnect(const Raul::Path& tail, + const Raul::Path& head) { + BROADCAST(disconnect, tail, head); + } + + void disconnect_all(const Raul::Path& parent_patch_path, + const Raul::Path& path) { + BROADCAST(disconnect_all, parent_patch_path, path); + } + + void set_property(const Raul::URI& subject, + const Raul::URI& predicate, + const Raul::Atom& value) { + BROADCAST(set_property, subject, predicate, value); + } + + Raul::URI uri() const { return "http://drobilla.net/ns/ingen#broadcaster"; } ///< N/A + + void set_response_id(int32_t id) {} ///< N/A + void get(const Raul::URI& uri) {} ///< N/A + void response(int32_t id, Status status) {} ///< N/A + + void error(const std::string& msg) { BROADCAST(error, msg); } + +private: + typedef std::map< Raul::URI, SharedPtr > Clients; + + Glib::Mutex _clients_mutex; + Clients _clients; +}; + +} // namespace Server +} // namespace Ingen + +#endif // INGEN_ENGINE_CLIENTBROADCASTER_HPP + diff --git a/src/server/ClientBroadcaster.cpp b/src/server/ClientBroadcaster.cpp deleted file mode 100644 index 6c81e5de..00000000 --- a/src/server/ClientBroadcaster.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2012 David Robillard - - 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 . -*/ - -#include -#include - -#include "ingen/Interface.hpp" -#include "raul/log.hpp" - -#include "ClientBroadcaster.hpp" -#include "EdgeImpl.hpp" -#include "EngineStore.hpp" -#include "ObjectSender.hpp" -#include "PluginImpl.hpp" -#include "util.hpp" - -#define LOG(s) (s("[ClientBroadcaster] ")) - -namespace Ingen { -namespace Server { - -/** Register a client to receive messages over the notification band. - */ -void -ClientBroadcaster::register_client(const Raul::URI& uri, - SharedPtr client) -{ - Glib::Mutex::Lock lock(_clients_mutex); - LOG(Raul::info)(Raul::fmt("Registered client <%1%>\n") % uri); - _clients[uri] = client; -} - -/** Remove a client from the list of registered clients. - * - * @return true if client was found and removed. - */ -bool -ClientBroadcaster::unregister_client(const Raul::URI& uri) -{ - Glib::Mutex::Lock lock(_clients_mutex); - const size_t erased = _clients.erase(uri); - - if (erased > 0) { - LOG(Raul::info)(Raul::fmt("Unregistered client <%1%>\n") % uri); - } - - return (erased > 0); -} - -/** Looks up the client with the given source @a uri (which is used as the - * unique identifier for registered clients). - */ -SharedPtr -ClientBroadcaster::client(const Raul::URI& uri) -{ - Glib::Mutex::Lock lock(_clients_mutex); - Clients::iterator i = _clients.find(uri); - if (i != _clients.end()) { - return (*i).second; - } else { - return SharedPtr(); - } -} - -void -ClientBroadcaster::send_plugins(const NodeFactory::Plugins& plugins) -{ - Glib::Mutex::Lock lock(_clients_mutex); - for (Clients::const_iterator c = _clients.begin(); c != _clients.end(); ++c) { - send_plugins_to((*c).second.get(), plugins); - } -} - -void -ClientBroadcaster::send_plugins_to(Interface* client, - const NodeFactory::Plugins& plugins) -{ - client->bundle_begin(); - - for (NodeFactory::Plugins::const_iterator i = plugins.begin(); i != plugins.end(); ++i) { - const PluginImpl* const plugin = i->second; - client->put(plugin->uri(), plugin->properties()); - } - - client->bundle_end(); -} - -/** Send an object to all clients. - * - * @param o Object to send - * @param recursive If true send all children of object - */ -void -ClientBroadcaster::send_object(const GraphObjectImpl* o, bool recursive) -{ - Glib::Mutex::Lock lock(_clients_mutex); - for (Clients::const_iterator i = _clients.begin(); i != _clients.end(); ++i) { - ObjectSender::send_object((*i).second.get(), o, recursive); - } -} - -} // namespace Server -} // namespace Ingen diff --git a/src/server/ClientBroadcaster.hpp b/src/server/ClientBroadcaster.hpp deleted file mode 100644 index 88c471c6..00000000 --- a/src/server/ClientBroadcaster.hpp +++ /dev/null @@ -1,126 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2012 David Robillard - - 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 . -*/ - -#ifndef INGEN_ENGINE_CLIENTBROADCASTER_HPP -#define INGEN_ENGINE_CLIENTBROADCASTER_HPP - -#include -#include -#include - -#include - -#include "raul/SharedPtr.hpp" - -#include "ingen/Interface.hpp" - -#include "NodeFactory.hpp" - -namespace Ingen { -namespace Server { - -class GraphObjectImpl; - -/** Broadcaster for all clients. - * - * This is an Interface that forwards all messages to all registered - * clients (for updating all clients on state changes in the engine). - * - * \ingroup engine - */ -class ClientBroadcaster : public Interface -{ -public: - void register_client(const Raul::URI& uri, SharedPtr client); - bool unregister_client(const Raul::URI& uri); - - SharedPtr client(const Raul::URI& uri); - - void send_plugins(const NodeFactory::Plugins& plugin_list); - void send_plugins_to(Interface*, const NodeFactory::Plugins& plugin_list); - - void send_object(const GraphObjectImpl* p, bool recursive); - -#define BROADCAST(msg, ...) \ - Glib::Mutex::Lock lock(_clients_mutex); \ - for (Clients::const_iterator i = _clients.begin(); i != _clients.end(); ++i) \ - (*i).second->msg(__VA_ARGS__) - - void bundle_begin() { BROADCAST(bundle_begin); } - void bundle_end() { BROADCAST(bundle_end); } - - void put(const Raul::URI& uri, - const Resource::Properties& properties, - Resource::Graph ctx=Resource::DEFAULT) { - BROADCAST(put, uri, properties); - } - - void delta(const Raul::URI& uri, - const Resource::Properties& remove, - const Resource::Properties& add) { - BROADCAST(delta, uri, remove, add); - } - - void move(const Raul::Path& old_path, - const Raul::Path& new_path) { - BROADCAST(move, old_path, new_path); - } - - void del(const Raul::URI& uri) { - BROADCAST(del, uri); - } - - void connect(const Raul::Path& tail, - const Raul::Path& head) { - BROADCAST(connect, tail, head); - } - - void disconnect(const Raul::Path& tail, - const Raul::Path& head) { - BROADCAST(disconnect, tail, head); - } - - void disconnect_all(const Raul::Path& parent_patch_path, - const Raul::Path& path) { - BROADCAST(disconnect_all, parent_patch_path, path); - } - - void set_property(const Raul::URI& subject, - const Raul::URI& predicate, - const Raul::Atom& value) { - BROADCAST(set_property, subject, predicate, value); - } - - Raul::URI uri() const { return "http://drobilla.net/ns/ingen#broadcaster"; } ///< N/A - - void set_response_id(int32_t id) {} ///< N/A - void get(const Raul::URI& uri) {} ///< N/A - void response(int32_t id, Status status) {} ///< N/A - - void error(const std::string& msg) { BROADCAST(error, msg); } - -private: - typedef std::map< Raul::URI, SharedPtr > Clients; - - Glib::Mutex _clients_mutex; - Clients _clients; -}; - -} // namespace Server -} // namespace Ingen - -#endif // INGEN_ENGINE_CLIENTBROADCASTER_HPP - diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp index a146743d..69ad435b 100644 --- a/src/server/Engine.cpp +++ b/src/server/Engine.cpp @@ -29,8 +29,8 @@ #include "raul/SharedPtr.hpp" #include "raul/log.hpp" +#include "Broadcaster.hpp" #include "BufferFactory.hpp" -#include "ClientBroadcaster.hpp" #include "ControlBindings.hpp" #include "Driver.hpp" #include "Engine.hpp" @@ -50,11 +50,12 @@ using namespace std; namespace Ingen { namespace Server { -bool ThreadManager::single_threaded = true; +Raul::ThreadVar ThreadManager::flags(0); +bool ThreadManager::single_threaded(true); Engine::Engine(Ingen::Shared::World* a_world) : _world(a_world) - , _broadcaster(new ClientBroadcaster()) + , _broadcaster(new Broadcaster()) , _control_bindings(NULL) , _maid(new Raul::Maid(event_queue_size())) , _node_factory(new NodeFactory(a_world)) @@ -270,7 +271,6 @@ Engine::pending_events() void Engine::enqueue_event(Event* ev) { - ThreadManager::assert_not_thread(THREAD_PROCESS); _pre_processor->event(ev); } diff --git a/src/server/Engine.hpp b/src/server/Engine.hpp index cf16a4b1..8fcb5ce6 100644 --- a/src/server/Engine.hpp +++ b/src/server/Engine.hpp @@ -34,8 +34,8 @@ namespace Shared { class World; } namespace Server { +class Broadcaster; class BufferFactory; -class ClientBroadcaster; class ControlBindings; class Driver; class EngineStore; @@ -91,15 +91,15 @@ public: Ingen::Shared::World* world() const { return _world; } - EventWriter* interface() const { return _event_writer; } - ClientBroadcaster* broadcaster() const { return _broadcaster; } - BufferFactory* buffer_factory() const { return _buffer_factory; } - ControlBindings* control_bindings() const { return _control_bindings; } - Driver* driver() const { return _driver.get(); } - Raul::Maid* maid() const { return _maid; } - NodeFactory* node_factory() const { return _node_factory; } - PostProcessor* post_processor() const { return _post_processor; } - PatchImpl* root_patch() const { return _root_patch; } + EventWriter* interface() const { return _event_writer; } + Broadcaster* broadcaster() const { return _broadcaster; } + BufferFactory* buffer_factory() const { return _buffer_factory; } + ControlBindings* control_bindings() const { return _control_bindings; } + Driver* driver() const { return _driver.get(); } + Raul::Maid* maid() const { return _maid; } + NodeFactory* node_factory() const { return _node_factory; } + PostProcessor* post_processor() const { return _post_processor; } + PatchImpl* root_patch() const { return _root_patch; } MessageContext& message_context() { return _message_context; } ProcessContext& process_context() { return _process_context; } @@ -111,15 +111,15 @@ public: private: Ingen::Shared::World* _world; - ClientBroadcaster* _broadcaster; - BufferFactory* _buffer_factory; - ControlBindings* _control_bindings; - SharedPtr _driver; - Raul::Maid* _maid; - NodeFactory* _node_factory; - PreProcessor* _pre_processor; - PostProcessor* _post_processor; - EventWriter* _event_writer; + Broadcaster* _broadcaster; + BufferFactory* _buffer_factory; + ControlBindings* _control_bindings; + SharedPtr _driver; + Raul::Maid* _maid; + NodeFactory* _node_factory; + PreProcessor* _pre_processor; + PostProcessor* _post_processor; + EventWriter* _event_writer; PatchImpl* _root_patch; diff --git a/src/server/EventWriter.cpp b/src/server/EventWriter.cpp index c839d65e..6fb682c2 100644 --- a/src/server/EventWriter.cpp +++ b/src/server/EventWriter.cpp @@ -20,7 +20,7 @@ #include "ingen/shared/URIs.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "Driver.hpp" #include "Engine.hpp" #include "EventWriter.hpp" diff --git a/src/server/JackDriver.cpp b/src/server/JackDriver.cpp index c5c9abe9..0df49973 100644 --- a/src/server/JackDriver.cpp +++ b/src/server/JackDriver.cpp @@ -432,7 +432,8 @@ JackDriver::_thread_init_cb() { Raul::Thread* thread = &Raul::Thread::get(); thread->set_name("Jack"); - thread->set_context(THREAD_PROCESS); + ThreadManager::set_flag(THREAD_PROCESS); + ThreadManager::set_flag(THREAD_IS_REAL_TIME); _jack_threads.push_back(SharedPtr(thread)); } diff --git a/src/server/MessageContext.cpp b/src/server/MessageContext.cpp index f6e16ebf..d67437ca 100644 --- a/src/server/MessageContext.cpp +++ b/src/server/MessageContext.cpp @@ -38,7 +38,6 @@ MessageContext::MessageContext(Engine& engine) , _requests(engine.event_queue_size()) , _end_time(0) { - Thread::set_context(THREAD_MESSAGE); } void @@ -60,8 +59,9 @@ MessageContext::run(Context& context, NodeImpl* node, FrameTime time) void MessageContext::_run() { - Request req; + ThreadManager::set_flag(THREAD_MESSAGE); + Request req; while (true) { _sem.wait(); diff --git a/src/server/NodeImpl.cpp b/src/server/NodeImpl.cpp index ab0783f4..5e6b203f 100644 --- a/src/server/NodeImpl.cpp +++ b/src/server/NodeImpl.cpp @@ -22,7 +22,6 @@ #include "raul/List.hpp" #include "AudioBuffer.hpp" -#include "ClientBroadcaster.hpp" #include "Engine.hpp" #include "EngineStore.hpp" #include "NodeImpl.hpp" diff --git a/src/server/NodeImpl.hpp b/src/server/NodeImpl.hpp index 7da07dc2..36cc65d3 100644 --- a/src/server/NodeImpl.hpp +++ b/src/server/NodeImpl.hpp @@ -185,10 +185,10 @@ public: /** The Patch this Node belongs to. */ inline PatchImpl* parent_patch() const { return (PatchImpl*)_parent; } - Context::ID context() const { return _context; } - SampleRate sample_rate() const { return _srate; } - virtual uint32_t num_ports() const { return _ports ? _ports->size() : 0; } - virtual uint32_t polyphony() const { return _polyphony; } + Context::ID context() const { return _context; } + SampleRate sample_rate() const { return _srate; } + uint32_t num_ports() const { return _ports ? _ports->size() : 0; } + virtual uint32_t polyphony() const { return _polyphony; } /** Used by the process order finding algorithm (ie during connections) */ bool traversed() const { return _traversed; } diff --git a/src/server/Notification.cpp b/src/server/Notification.cpp index c95311c9..88f67137 100644 --- a/src/server/Notification.cpp +++ b/src/server/Notification.cpp @@ -16,7 +16,7 @@ #include "ingen/shared/URIs.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "Engine.hpp" #include "Notification.hpp" #include "PortImpl.hpp" diff --git a/src/server/ObjectSender.cpp b/src/server/ObjectSender.cpp index 7dc8ca39..9ad206dc 100644 --- a/src/server/ObjectSender.cpp +++ b/src/server/ObjectSender.cpp @@ -81,7 +81,7 @@ ObjectSender::send_patch(Interface* client, } // Send ports - for (uint32_t i=0; i < patch->num_ports(); ++i) { + for (uint32_t i=0; i < patch->num_ports_non_rt(); ++i) { PortImpl* const port = patch->port_impl(i); send_port(client, port, false); } diff --git a/src/server/PatchImpl.cpp b/src/server/PatchImpl.cpp index 9a21ee23..9ba7b6cf 100644 --- a/src/server/PatchImpl.cpp +++ b/src/server/PatchImpl.cpp @@ -324,12 +324,10 @@ PatchImpl::has_edge(const PortImpl* tail, const PortImpl* dst_port) const } uint32_t -PatchImpl::num_ports() const +PatchImpl::num_ports_non_rt() const { - if (ThreadManager::thread_is(THREAD_PROCESS)) - return NodeImpl::num_ports(); - else - return _inputs.size() + _outputs.size(); + ThreadManager::assert_not_thread(THREAD_PROCESS); + return _inputs.size() + _outputs.size(); } /** Create a port. Not realtime safe. @@ -352,7 +350,7 @@ PatchImpl::create_port(BufferFactory& bufs, if (type == PortType::CONTROL || type == PortType::CV) value = bufs.forge().make(0.0f); - return new DuplexPort(bufs, this, name, num_ports(), polyphonic, _polyphony, + return new DuplexPort(bufs, this, name, num_ports_non_rt(), polyphonic, _polyphony, type, buffer_type, value, buffer_size, is_output); } diff --git a/src/server/PatchImpl.hpp b/src/server/PatchImpl.hpp index 02df6fca..557f0343 100644 --- a/src/server/PatchImpl.hpp +++ b/src/server/PatchImpl.hpp @@ -106,7 +106,7 @@ public: const Nodes& nodes() const { return _nodes; } const Edges& edges() const { return _edges; } - uint32_t num_ports() const; + uint32_t num_ports_non_rt() const; PortImpl* create_port(BufferFactory& bufs, const std::string& name, diff --git a/src/server/PreProcessor.cpp b/src/server/PreProcessor.cpp index 435ad77d..9fba676c 100644 --- a/src/server/PreProcessor.cpp +++ b/src/server/PreProcessor.cpp @@ -27,7 +27,6 @@ namespace Server { PreProcessor::PreProcessor() { - Thread::set_context(THREAD_PRE_PROCESS); set_name("PreProcessor"); start(); } @@ -41,6 +40,7 @@ void PreProcessor::event(Event* const ev) { // TODO: Probably possible to make this lock-free with CAS + ThreadManager::assert_not_thread(THREAD_IS_REAL_TIME); Glib::Mutex::Lock lock(_mutex); assert(!ev->is_prepared()); @@ -108,6 +108,7 @@ PreProcessor::process(ProcessContext& context, PostProcessor& dest, bool limit) void PreProcessor::_whipped() { + ThreadManager::set_flag(THREAD_PRE_PROCESS); Event* ev = _prepared_back.get(); if (!ev) return; diff --git a/src/server/ProcessSlave.cpp b/src/server/ProcessSlave.cpp index 57f45693..5be40bb5 100644 --- a/src/server/ProcessSlave.cpp +++ b/src/server/ProcessSlave.cpp @@ -28,6 +28,8 @@ uint32_t ProcessSlave::_next_id = 0; void ProcessSlave::_whipped() { + ThreadManager::set_flag(THREAD_PROCESS); + assert(_compiled_patch); CompiledPatch* const cp = _compiled_patch; diff --git a/src/server/ProcessSlave.hpp b/src/server/ProcessSlave.hpp index d15ff5af..0e866f71 100644 --- a/src/server/ProcessSlave.hpp +++ b/src/server/ProcessSlave.hpp @@ -53,8 +53,6 @@ public: if (realtime) set_scheduling(SCHED_FIFO, 40); - - set_context(THREAD_PROCESS); } ~ProcessSlave() { diff --git a/src/server/ThreadManager.hpp b/src/server/ThreadManager.hpp index 23ff126a..445219ae 100644 --- a/src/server/ThreadManager.hpp +++ b/src/server/ThreadManager.hpp @@ -19,34 +19,45 @@ #include #include "raul/Thread.hpp" +#include "raul/ThreadVar.hpp" namespace Ingen { namespace Server { -enum ThreadID { - THREAD_PRE_PROCESS, - THREAD_PROCESS, - THREAD_MESSAGE, +enum ThreadFlag { + THREAD_IS_REAL_TIME = 1, + THREAD_PRE_PROCESS = 1 << 1, + THREAD_PROCESS = 1 << 2, + THREAD_MESSAGE = 1 << 3, }; class ThreadManager { public: - inline static bool thread_is(ThreadID id) { - return Raul::Thread::get().is_context(id); + static inline void set_flag(ThreadFlag f) { +#ifndef NDEBUG + flags = ((unsigned)flags | f); +#endif } - inline static void assert_thread(ThreadID id) { - assert(single_threaded || Raul::Thread::get().is_context(id)); + static inline void unset_flag(ThreadFlag f) { +#ifndef NDEBUG + flags = ((unsigned)flags & (~f)); +#endif } - inline static void assert_not_thread(ThreadID id) { - assert(single_threaded || !Raul::Thread::get().is_context(id)); + static inline void assert_thread(ThreadFlag f) { + assert(single_threaded || (flags & f)); + } + + static inline void assert_not_thread(ThreadFlag f) { + assert(single_threaded || !(flags & f)); } /** Set to true during initialisation so ensure_thread doesn't fail. * Defined in Engine.cpp */ - static bool single_threaded; + static bool single_threaded; + static Raul::ThreadVar flags; }; } // namespace Server diff --git a/src/server/events/Connect.cpp b/src/server/events/Connect.cpp index e2d6cae7..edea8f15 100644 --- a/src/server/events/Connect.cpp +++ b/src/server/events/Connect.cpp @@ -22,7 +22,7 @@ #include "raul/Maid.hpp" #include "raul/Path.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "Connect.hpp" #include "EdgeImpl.hpp" #include "DuplexPort.hpp" diff --git a/src/server/events/CreateNode.cpp b/src/server/events/CreateNode.cpp index a90979ff..414003d8 100644 --- a/src/server/events/CreateNode.cpp +++ b/src/server/events/CreateNode.cpp @@ -20,7 +20,7 @@ #include "raul/log.hpp" #include "sord/sordmm.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "CreateNode.hpp" #include "Driver.hpp" #include "Engine.hpp" diff --git a/src/server/events/CreatePatch.cpp b/src/server/events/CreatePatch.cpp index 22c4a817..465dbe86 100644 --- a/src/server/events/CreatePatch.cpp +++ b/src/server/events/CreatePatch.cpp @@ -19,13 +19,13 @@ #include "raul/Path.hpp" #include "events/CreatePatch.hpp" -#include "PatchImpl.hpp" -#include "NodeImpl.hpp" -#include "PluginImpl.hpp" -#include "Engine.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "Driver.hpp" +#include "Engine.hpp" #include "EngineStore.hpp" +#include "NodeImpl.hpp" +#include "PatchImpl.hpp" +#include "PluginImpl.hpp" namespace Ingen { namespace Server { diff --git a/src/server/events/CreatePort.cpp b/src/server/events/CreatePort.cpp index 0098ae6a..1cb172d2 100644 --- a/src/server/events/CreatePort.cpp +++ b/src/server/events/CreatePort.cpp @@ -23,7 +23,7 @@ #include "raul/Maid.hpp" #include "raul/Path.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "ControlBindings.hpp" #include "CreatePort.hpp" #include "Driver.hpp" @@ -152,7 +152,7 @@ CreatePort::pre_process() dynamic_cast(_patch_port)); } - assert(_ports_array->size() == _patch->num_ports()); + assert(_ports_array->size() == _patch->num_ports_non_rt()); } else { _status = CREATION_FAILED; diff --git a/src/server/events/Delete.cpp b/src/server/events/Delete.cpp index 4df6efb6..95e63d4d 100644 --- a/src/server/events/Delete.cpp +++ b/src/server/events/Delete.cpp @@ -17,7 +17,7 @@ #include "raul/Maid.hpp" #include "raul/Path.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "ControlBindings.hpp" #include "Delete.hpp" #include "DisconnectAll.hpp" @@ -118,8 +118,8 @@ Delete::pre_process() if (_port->parent_patch()->enabled()) { // FIXME: is this called multiple times? _compiled_patch = _port->parent_patch()->compile(); - _ports_array = _port->parent_patch()->build_ports_array(); - assert(_ports_array->size() == _port->parent_patch()->num_ports()); + _ports_array = _port->parent_patch()->build_ports_array(); + assert(_ports_array->size() == _port->parent_patch()->num_ports_non_rt()); } } diff --git a/src/server/events/Disconnect.cpp b/src/server/events/Disconnect.cpp index 035a6f87..e1a86b13 100644 --- a/src/server/events/Disconnect.cpp +++ b/src/server/events/Disconnect.cpp @@ -23,7 +23,7 @@ #include "raul/log.hpp" #include "AudioBuffer.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "EdgeImpl.hpp" #include "DuplexPort.hpp" #include "Engine.hpp" diff --git a/src/server/events/DisconnectAll.cpp b/src/server/events/DisconnectAll.cpp index 04527212..0a4c2ef1 100644 --- a/src/server/events/DisconnectAll.cpp +++ b/src/server/events/DisconnectAll.cpp @@ -23,7 +23,7 @@ #include "raul/Maid.hpp" #include "raul/Path.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "EdgeImpl.hpp" #include "Engine.hpp" #include "EngineStore.hpp" diff --git a/src/server/events/Get.cpp b/src/server/events/Get.cpp index 503726a3..7e140ae4 100644 --- a/src/server/events/Get.cpp +++ b/src/server/events/Get.cpp @@ -16,7 +16,7 @@ #include "ingen/Interface.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "Driver.hpp" #include "Engine.hpp" #include "EngineStore.hpp" diff --git a/src/server/events/Move.cpp b/src/server/events/Move.cpp index ecfe9508..2451c65e 100644 --- a/src/server/events/Move.cpp +++ b/src/server/events/Move.cpp @@ -18,7 +18,7 @@ #include "raul/Path.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "Driver.hpp" #include "Engine.hpp" #include "EnginePort.hpp" diff --git a/src/server/events/SetMetadata.cpp b/src/server/events/SetMetadata.cpp index 15ed26cc..fa02f220 100644 --- a/src/server/events/SetMetadata.cpp +++ b/src/server/events/SetMetadata.cpp @@ -25,7 +25,7 @@ #include "ingen/shared/URIMap.hpp" #include "ingen/shared/URIs.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "ControlBindings.hpp" #include "CreateNode.hpp" #include "CreatePatch.hpp" diff --git a/src/server/events/SetPortValue.cpp b/src/server/events/SetPortValue.cpp index 1fb02cc4..1a12dcd4 100644 --- a/src/server/events/SetPortValue.cpp +++ b/src/server/events/SetPortValue.cpp @@ -22,7 +22,7 @@ #include "raul/log.hpp" #include "AudioBuffer.hpp" -#include "ClientBroadcaster.hpp" +#include "Broadcaster.hpp" #include "ControlBindings.hpp" #include "Driver.hpp" #include "Engine.hpp" diff --git a/src/server/ingen_lv2.cpp b/src/server/ingen_lv2.cpp index 56e9120e..f394e566 100644 --- a/src/server/ingen_lv2.cpp +++ b/src/server/ingen_lv2.cpp @@ -491,7 +491,7 @@ ingen_instantiate(const LV2_Descriptor* descriptor, plugin->world->set_interface(interface); - Raul::Thread::get().set_context(Server::THREAD_PRE_PROCESS); + Server::ThreadManager::set_flag(Server::THREAD_PRE_PROCESS); Server::ThreadManager::single_threaded = true; // FIXME: fixed (or at least maximum) buffer size @@ -559,8 +559,8 @@ ingen_run(LV2_Handle instance, uint32_t sample_count) Server::Engine* engine = (Server::Engine*)me->world->engine().get(); LV2Driver* driver = (LV2Driver*)engine->driver(); - // FIXME: don't do this every call - Raul::Thread::get().set_context(Ingen::Server::THREAD_PROCESS); + Server::ThreadManager::set_flag(Ingen::Server::THREAD_PROCESS); + Server::ThreadManager::set_flag(Ingen::Server::THREAD_IS_REAL_TIME); driver->run(sample_count); } diff --git a/src/server/wscript b/src/server/wscript index 1d3d8b56..e63b5fa7 100644 --- a/src/server/wscript +++ b/src/server/wscript @@ -4,9 +4,9 @@ from waflib.extras import autowaf as autowaf def build(bld): core_source = ''' AudioBuffer.cpp + Broadcaster.cpp Buffer.cpp BufferFactory.cpp - ClientBroadcaster.cpp ControlBindings.cpp DuplexPort.cpp EdgeImpl.cpp -- cgit v1.2.1