From 760fd1bd677c8d0d5aca0bd621ea374a76345643 Mon Sep 17 00:00:00 2001 From: Nedko Arnaudov Date: Tue, 8 Dec 2009 20:30:52 +0200 Subject: [PATCH] daemon: set proper state after JACK server stop is detected in the hard way --- daemon/cmd_start_studio.c | 1 + daemon/cmd_stop_studio.c | 4 ++ daemon/graph.c | 120 ++++++++++++++++++++++++++------------ daemon/graph.h | 1 + daemon/studio_internal.h | 12 ++++ 5 files changed, 102 insertions(+), 36 deletions(-) diff --git a/daemon/cmd_start_studio.c b/daemon/cmd_start_studio.c index 0a9b3827..8cd31b5c 100644 --- a/daemon/cmd_start_studio.c +++ b/daemon/cmd_start_studio.c @@ -38,6 +38,7 @@ static bool run(void * context) case LADISH_COMMAND_STATE_PENDING: if (studio_is_started()) { + log_info("Ignoring start request because studio is already started."); /* nothing to do, studio is already running */ cmd_ptr->state = LADISH_COMMAND_STATE_DONE; return true; diff --git a/daemon/cmd_stop_studio.c b/daemon/cmd_stop_studio.c index f83d903e..c6994134 100644 --- a/daemon/cmd_stop_studio.c +++ b/daemon/cmd_stop_studio.c @@ -46,6 +46,7 @@ static bool run(void * context) case LADISH_COMMAND_STATE_PENDING: if (!studio_is_started()) { + log_info("Ignoring stop request because studio is already stopped."); /* nothing to do, studio is not running */ cmd_ptr->command.state = LADISH_COMMAND_STATE_DONE; return true; @@ -82,6 +83,7 @@ static bool run(void * context) if (!jack_server_started) { + ladish_environment_reset_stealth(&g_studio.env_store, ladish_environment_jack_server_started); goto done; } @@ -106,6 +108,8 @@ static bool run(void * context) done: log_info("Wait for JACK server stop complete."); + ladish_graph_hide_all(g_studio.jack_graph); + ladish_graph_hide_all(g_studio.studio_graph); ASSERT(!jack_server_started); ladish_graph_dump(g_studio.studio_graph); diff --git a/daemon/graph.c b/daemon/graph.c index b732b6b1..b057b6ec 100644 --- a/daemon/graph.c +++ b/daemon/graph.c @@ -710,6 +710,7 @@ ladish_graph_find_client_port( static void ladish_graph_hide_connection_internal(struct ladish_graph * graph_ptr, struct ladish_graph_connection * connection_ptr) { + ASSERT(!connection_ptr->hidden); connection_ptr->hidden = true; graph_ptr->graph_version++; @@ -734,6 +735,48 @@ static void ladish_graph_hide_connection_internal(struct ladish_graph * graph_pt } } +void ladish_graph_hide_port_internal(struct ladish_graph * graph_ptr, struct ladish_graph_port * port_ptr) +{ + ASSERT(!port_ptr->hidden); + port_ptr->hidden = true; + graph_ptr->graph_version++; + + if (graph_ptr->opath != NULL) + { + dbus_signal_emit( + g_dbus_connection, + graph_ptr->opath, + JACKDBUS_IFACE_PATCHBAY, + "PortDisappeared", + "ttsts", + &graph_ptr->graph_version, + &port_ptr->client_ptr->id, + &port_ptr->client_ptr->name, + &port_ptr->id, + &port_ptr->name); + } +} + +void ladish_graph_hide_client_internal(struct ladish_graph * graph_ptr, struct ladish_graph_client * client_ptr) +{ + ASSERT(!client_ptr->hidden); + client_ptr->hidden = true; + graph_ptr->graph_version++; + + if (graph_ptr->opath != NULL) + { + dbus_signal_emit( + g_dbus_connection, + graph_ptr->opath, + JACKDBUS_IFACE_PATCHBAY, + "ClientDisappeared", + "tts", + &graph_ptr->graph_version, + &client_ptr->id, + &client_ptr->name); + } +} + void ladish_hide_connections(struct ladish_graph * graph_ptr, struct ladish_graph_port * port_ptr) { struct list_head * node_ptr; @@ -746,9 +789,7 @@ void ladish_hide_connections(struct ladish_graph * graph_ptr, struct ladish_grap list_for_each(node_ptr, &graph_ptr->connections) { connection_ptr = list_entry(node_ptr, struct ladish_graph_connection, siblings); - if (!connection_ptr->hidden && - (connection_ptr->port1_ptr == port_ptr || connection_ptr->port2_ptr == port_ptr) && - (connection_ptr->port1_ptr->hidden || connection_ptr->port2_ptr->hidden)) + if (!connection_ptr->hidden && (connection_ptr->port1_ptr == port_ptr || connection_ptr->port2_ptr == port_ptr)) { log_info("hidding connection between ports %"PRIu64" and %"PRIu64, connection_ptr->port1_ptr->id, connection_ptr->port2_ptr->id); ladish_graph_hide_connection_internal(graph_ptr, connection_ptr); @@ -1026,29 +1067,13 @@ void ladish_graph_hide_port(ladish_graph_handle graph_handle, ladish_port_handle log_info("Hidding port %"PRIu64, port_ptr->id); ASSERT(!port_ptr->hidden); - port_ptr->hidden = true; if (graph_ptr->opath != NULL) { ladish_hide_connections(graph_ptr, port_ptr); } - graph_ptr->graph_version++; - - if (graph_ptr->opath != NULL) - { - dbus_signal_emit( - g_dbus_connection, - graph_ptr->opath, - JACKDBUS_IFACE_PATCHBAY, - "PortDisappeared", - "ttsts", - &graph_ptr->graph_version, - &port_ptr->client_ptr->id, - &port_ptr->client_ptr->name, - &port_ptr->id, - &port_ptr->name); - } + ladish_graph_hide_port_internal(graph_ptr, port_ptr); } void ladish_graph_hide_client(ladish_graph_handle graph_handle, ladish_client_handle client_handle) @@ -1064,22 +1089,7 @@ void ladish_graph_hide_client(ladish_graph_handle graph_handle, ladish_client_ha return; } - ASSERT(!client_ptr->hidden); - client_ptr->hidden = true; - graph_ptr->graph_version++; - - if (graph_ptr->opath != NULL) - { - dbus_signal_emit( - g_dbus_connection, - graph_ptr->opath, - JACKDBUS_IFACE_PATCHBAY, - "ClientDisappeared", - "tts", - &graph_ptr->graph_version, - &client_ptr->id, - &client_ptr->name); - } + ladish_graph_hide_client_internal(graph_ptr, client_ptr); } void ladish_graph_show_client(ladish_graph_handle graph_handle, ladish_client_handle client_handle) @@ -1720,6 +1730,44 @@ void ladish_try_connect_hidden_connections(ladish_graph_handle graph_handle) } } +void ladish_graph_hide_all(ladish_graph_handle graph_handle) +{ + struct list_head * node_ptr; + struct ladish_graph_connection * connection_ptr; + struct ladish_graph_port * port_ptr; + struct ladish_graph_client * client_ptr; + + list_for_each(node_ptr, &graph_ptr->connections) + { + connection_ptr = list_entry(node_ptr, struct ladish_graph_connection, siblings); + if (!connection_ptr->hidden) + { + log_debug("hidding connection between ports %"PRIu64" and %"PRIu64, connection_ptr->port1_ptr->id, connection_ptr->port2_ptr->id); + ladish_graph_hide_connection_internal(graph_ptr, connection_ptr); + } + } + + list_for_each(node_ptr, &graph_ptr->ports) + { + port_ptr = list_entry(node_ptr, struct ladish_graph_port, siblings_graph); + if (!port_ptr->hidden) + { + ladish_port_set_jack_id(port_ptr->port, 0); + ladish_graph_hide_port_internal(graph_ptr, port_ptr); + } + } + + list_for_each(node_ptr, &graph_ptr->clients) + { + client_ptr = list_entry(node_ptr, struct ladish_graph_client, siblings); + if (!client_ptr->hidden) + { + ladish_client_set_jack_id(client_ptr->client, 0); + ladish_graph_hide_client_internal(graph_ptr, client_ptr); + } + } +} + bool ladish_graph_iterate_nodes( ladish_graph_handle graph_handle, diff --git a/daemon/graph.h b/daemon/graph.h index 8557cf2b..e320616d 100644 --- a/daemon/graph.h +++ b/daemon/graph.h @@ -130,6 +130,7 @@ void ladish_graph_hide_client(ladish_graph_handle graph_handle, ladish_client_ha void ladish_graph_adjust_port(ladish_graph_handle graph_handle, ladish_port_handle port_handle, uint32_t type, uint32_t flags); void ladish_graph_show_connection(ladish_graph_handle graph_handle, uint64_t connection_id); void ladish_try_connect_hidden_connections(ladish_graph_handle graph_handle); +void ladish_graph_hide_all(ladish_graph_handle graph_handle); void ladish_graph_dump(ladish_graph_handle graph_handle); diff --git a/daemon/studio_internal.h b/daemon/studio_internal.h index 269569d6..9326a0e0 100644 --- a/daemon/studio_internal.h +++ b/daemon/studio_internal.h @@ -66,6 +66,12 @@ static inline void ladish_environment_set(ladish_environment_store * store_ptr, store_ptr->changed |= state; } +static inline void ladish_environment_set_stealth(ladish_environment_store * store_ptr, ladish_environment_id id) +{ + uint64_t state = ladish_environment_state(id); + store_ptr->state |= state; +} + static inline void ladish_environment_reset(ladish_environment_store * store_ptr, ladish_environment_id id) { uint64_t state = ladish_environment_state(id); @@ -73,6 +79,12 @@ static inline void ladish_environment_reset(ladish_environment_store * store_ptr store_ptr->changed |= state; } +static inline void ladish_environment_reset_stealth(ladish_environment_store * store_ptr, ladish_environment_id id) +{ + uint64_t state = ladish_environment_state(id); + store_ptr->state &= ~state; +} + static inline bool ladish_environment_get(ladish_environment_store * store_ptr, ladish_environment_id id) { uint64_t state = ladish_environment_state(id);