daemon: set proper state after JACK server stop is detected in the hard way

This commit is contained in:
Nedko Arnaudov 2009-12-08 20:30:52 +02:00
parent 0f36602240
commit 760fd1bd67
5 changed files with 102 additions and 36 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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,

View File

@ -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);

View File

@ -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);