summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-05-10 03:23:11 +0000
committerDavid Robillard <d@drobilla.net>2012-05-10 03:23:11 +0000
commitda468f24388d7f0f574c6e4dd4022e05d47a9db2 (patch)
tree32e90d5fa55a35caef43cb69592286fc31c5d4f4 /src/server
parent281bbcc6a7208c28283bc9bdd521c5d6cc48a60f (diff)
downloadingen-da468f24388d7f0f574c6e4dd4022e05d47a9db2.tar.gz
ingen-da468f24388d7f0f574c6e4dd4022e05d47a9db2.tar.bz2
ingen-da468f24388d7f0f574c6e4dd4022e05d47a9db2.zip
Use SharedPtr references to Interfaces to keep things sane.
Fix double register when using GUI with a remote engine. Avoid signal when writing to dead socket by using send with MSG_NOSIGNAL. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4336 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/server')
-rw-r--r--src/server/ClientBroadcaster.cpp10
-rw-r--r--src/server/ClientBroadcaster.hpp6
-rw-r--r--src/server/Engine.cpp2
-rw-r--r--src/server/Engine.hpp3
-rw-r--r--src/server/EventWriter.cpp27
-rw-r--r--src/server/EventWriter.hpp14
-rw-r--r--src/server/ingen_lv2.cpp6
7 files changed, 35 insertions, 33 deletions
diff --git a/src/server/ClientBroadcaster.cpp b/src/server/ClientBroadcaster.cpp
index 46e6fb2f..42aad778 100644
--- a/src/server/ClientBroadcaster.cpp
+++ b/src/server/ClientBroadcaster.cpp
@@ -36,7 +36,7 @@ namespace Server {
/** Register a client to receive messages over the notification band.
*/
void
-ClientBroadcaster::register_client(const URI& uri, Interface* client)
+ClientBroadcaster::register_client(const URI& uri, SharedPtr<Interface> client)
{
Glib::Mutex::Lock lock(_clients_mutex);
LOG(info) << "Registered client: " << uri << endl;
@@ -65,7 +65,7 @@ ClientBroadcaster::unregister_client(const URI& uri)
/** Looks up the client with the given source @a uri (which is used as the
* unique identifier for registered clients).
*/
-Interface*
+SharedPtr<Interface>
ClientBroadcaster::client(const URI& uri)
{
Glib::Mutex::Lock lock(_clients_mutex);
@@ -73,7 +73,7 @@ ClientBroadcaster::client(const URI& uri)
if (i != _clients.end()) {
return (*i).second;
} else {
- return NULL;
+ return SharedPtr<Interface>();
}
}
@@ -82,7 +82,7 @@ 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, plugins);
+ send_plugins_to((*c).second.get(), plugins);
}
}
@@ -109,7 +109,7 @@ 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, o, recursive);
+ ObjectSender::send_object((*i).second.get(), o, recursive);
}
}
diff --git a/src/server/ClientBroadcaster.hpp b/src/server/ClientBroadcaster.hpp
index c095b960..5eea1093 100644
--- a/src/server/ClientBroadcaster.hpp
+++ b/src/server/ClientBroadcaster.hpp
@@ -49,10 +49,10 @@ class ConnectionImpl;
class ClientBroadcaster : public Interface
{
public:
- void register_client(const Raul::URI& uri, Interface* client);
+ void register_client(const Raul::URI& uri, SharedPtr<Interface> client);
bool unregister_client(const Raul::URI& uri);
- Interface* client(const Raul::URI& uri);
+ SharedPtr<Interface> client(const Raul::URI& uri);
void send_plugins(const NodeFactory::Plugins& plugin_list);
void send_plugins_to(Interface*, const NodeFactory::Plugins& plugin_list);
@@ -118,7 +118,7 @@ public:
void error(const std::string& msg) { BROADCAST(error, msg); }
private:
- typedef std::map<Raul::URI, Interface*> Clients;
+ typedef std::map< Raul::URI, SharedPtr<Interface> > Clients;
Glib::Mutex _clients_mutex;
Clients _clients;
diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp
index f2f088f5..f3b5e476 100644
--- a/src/server/Engine.cpp
+++ b/src/server/Engine.cpp
@@ -278,7 +278,7 @@ Engine::process_events(ProcessContext& context)
}
void
-Engine::register_client(const Raul::URI& uri, Interface* client)
+Engine::register_client(const Raul::URI& uri, SharedPtr<Interface> client)
{
_broadcaster->register_client(uri, client);
}
diff --git a/src/server/Engine.hpp b/src/server/Engine.hpp
index 5111f52c..9600e8a2 100644
--- a/src/server/Engine.hpp
+++ b/src/server/Engine.hpp
@@ -69,7 +69,8 @@ public:
virtual void run(uint32_t sample_count);
virtual void quit();
virtual bool main_iteration();
- virtual void register_client(const Raul::URI& uri, Interface* client);
+ virtual void register_client(const Raul::URI& uri,
+ SharedPtr<Interface> client);
virtual bool unregister_client(const Raul::URI& uri);
void set_driver(SharedPtr<Driver> driver);
diff --git a/src/server/EventWriter.cpp b/src/server/EventWriter.cpp
index 19a738b0..4ec0756b 100644
--- a/src/server/EventWriter.cpp
+++ b/src/server/EventWriter.cpp
@@ -36,7 +36,6 @@ namespace Server {
EventWriter::EventWriter(Engine& engine)
: _engine(engine)
- , _respondee(NULL)
, _request_id(-1)
{
}
@@ -59,10 +58,6 @@ EventWriter::now() const
void
EventWriter::set_response_id(int32_t id)
{
- if (!_respondee) { // Kludge
- _respondee = _engine.broadcaster()->client(
- "http://drobilla.net/ns/ingen#internal");
- }
_request_id = id;
}
@@ -72,7 +67,7 @@ EventWriter::put(const URI& uri,
const Resource::Graph ctx)
{
_engine.enqueue_event(
- new Events::SetMetadata(_engine, _respondee, _request_id, now(),
+ new Events::SetMetadata(_engine, _respondee.get(), _request_id, now(),
true, ctx, uri, properties));
}
@@ -82,7 +77,7 @@ EventWriter::delta(const URI& uri,
const Resource::Properties& add)
{
_engine.enqueue_event(
- new Events::SetMetadata(_engine, _respondee, _request_id, now(),
+ new Events::SetMetadata(_engine, _respondee.get(), _request_id, now(),
false, Resource::DEFAULT, uri, add, remove));
}
@@ -91,7 +86,7 @@ EventWriter::move(const Path& old_path,
const Path& new_path)
{
_engine.enqueue_event(
- new Events::Move(_engine, _respondee, _request_id, now(),
+ new Events::Move(_engine, _respondee.get(), _request_id, now(),
old_path, new_path));
}
@@ -105,7 +100,7 @@ EventWriter::del(const URI& uri)
_engine.quit();
} else {
_engine.enqueue_event(
- new Events::Delete(_engine, _respondee, _request_id, now(), uri));
+ new Events::Delete(_engine, _respondee.get(), _request_id, now(), uri));
}
}
@@ -114,7 +109,7 @@ EventWriter::connect(const Path& tail_path,
const Path& head_path)
{
_engine.enqueue_event(
- new Events::Connect(_engine, _respondee, _request_id, now(),
+ new Events::Connect(_engine, _respondee.get(), _request_id, now(),
tail_path, head_path));
}
@@ -130,7 +125,7 @@ EventWriter::disconnect(const Path& src,
}
_engine.enqueue_event(
- new Events::Disconnect(_engine, _respondee, _request_id, now(),
+ new Events::Disconnect(_engine, _respondee.get(), _request_id, now(),
src, dst));
}
@@ -139,7 +134,7 @@ EventWriter::disconnect_all(const Path& patch_path,
const Path& path)
{
_engine.enqueue_event(
- new Events::DisconnectAll(_engine, _respondee, _request_id, now(),
+ new Events::DisconnectAll(_engine, _respondee.get(), _request_id, now(),
patch_path, path));
}
@@ -153,10 +148,10 @@ EventWriter::set_property(const URI& uri,
if (value.get_bool()) {
_engine.activate();
_engine.enqueue_event(
- new Events::Ping(_engine, _respondee, _request_id, now()));
+ new Events::Ping(_engine, _respondee.get(), _request_id, now()));
} else {
_engine.enqueue_event(
- new Events::Deactivate(_engine, _respondee, _request_id, now()));
+ new Events::Deactivate(_engine, _respondee.get(), _request_id, now()));
}
} else {
Resource::Properties remove;
@@ -164,7 +159,7 @@ EventWriter::set_property(const URI& uri,
Resource::Properties add;
add.insert(make_pair(predicate, value));
_engine.enqueue_event(
- new Events::SetMetadata(_engine, _respondee, _request_id, now(),
+ new Events::SetMetadata(_engine, _respondee.get(), _request_id, now(),
false, Resource::DEFAULT, uri, add, remove));
}
}
@@ -173,7 +168,7 @@ void
EventWriter::get(const URI& uri)
{
_engine.enqueue_event(
- new Events::Get(_engine, _respondee, _request_id, now(), uri));
+ new Events::Get(_engine, _respondee.get(), _request_id, now(), uri));
}
} // namespace Server
diff --git a/src/server/EventWriter.hpp b/src/server/EventWriter.hpp
index 9e334f98..2a080be4 100644
--- a/src/server/EventWriter.hpp
+++ b/src/server/EventWriter.hpp
@@ -42,7 +42,13 @@ public:
Raul::URI uri() const { return "http://drobilla.net/ns/ingen#internal"; }
- void set_respondee(Interface* iface) { _respondee = iface; }
+ virtual SharedPtr<Interface> respondee() const {
+ return _respondee;
+ }
+
+ virtual void set_respondee(SharedPtr<Interface> respondee) {
+ _respondee = respondee;
+ }
virtual void set_response_id(int32_t id);
@@ -83,9 +89,9 @@ public:
virtual void error(const std::string& msg) {} ///< N/A
protected:
- Engine& _engine;
- Interface* _respondee;
- int32_t _request_id;
+ Engine& _engine;
+ SharedPtr<Interface> _respondee;
+ int32_t _request_id;
private:
SampleCount now() const;
diff --git a/src/server/ingen_lv2.cpp b/src/server/ingen_lv2.cpp
index 733f7a52..5e21f679 100644
--- a/src/server/ingen_lv2.cpp
+++ b/src/server/ingen_lv2.cpp
@@ -438,9 +438,9 @@ ingen_instantiate(const LV2_Descriptor* descriptor,
LV2Driver* driver = new LV2Driver(*engine.get(), 4096, rate);
engine->set_driver(SharedPtr<Ingen::Server::Driver>(driver));
- interface->set_respondee(&driver->writer());
- engine->register_client("http://drobilla.net/ns/ingen#internal",
- &driver->writer());
+ SharedPtr<Interface> client(&driver->writer(), NullDeleter<Interface>);
+ interface->set_respondee(client);
+ engine->register_client("http://drobilla.net/ns/ingen#internal", client);
engine->activate();
Server::ThreadManager::single_threaded = true;