From 2d65cb5384e15ab1fe817fc69f4a54697206a305 Mon Sep 17 00:00:00 2001 From: Torben Hohn Date: Sat, 28 Nov 2009 15:19:00 +0100 Subject: [PATCH] save uuid, reservations code, and --renames option --- python/libjack.py | 38 +++++++++++++++++++++++++++++--------- python/sessionmanager.py | 22 +++++++++++++++++----- python/state.py | 19 +++++++++++++++++++ 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/python/libjack.py b/python/libjack.py index b03967b..799386b 100644 --- a/python/libjack.py +++ b/python/libjack.py @@ -53,6 +53,10 @@ rename_client = libjack.jack_rename_client rename_client.argtypes = [ client_p, c_char_p, c_char_p ] rename_client.restype = c_int +reserve_client_name = libjack.jack_reserve_client_name +reserve_client_name.argtypes = [ client_p, c_char_p, c_char_p ] +reserve_client_name.restype = c_int + class jack_session_command_t( Structure ): _fields_ = [ ("uuid", 16*c_char ), ("clientname", 33*c_char), ("command", 256*c_char ) ] @@ -163,6 +167,7 @@ class Client( object ): self.ports = [] self.commandline = None self.isinfra = False + self.uuid = None def get_commandline( self ): if self.commandline: @@ -173,6 +178,12 @@ class Client( object ): def set_commandline( self, cmdline ): self.commandline = cmdline + def get_uuid( self ): + return self.uuid + + def set_uuid( self, uuid ): + self.uuid = uuid + def add_port( self, portname ): self.ports.append( Port( self.client, portname ) ) @@ -199,6 +210,7 @@ class JackGraph( object ): def __init__( self, client, ports, uuids=[] ): self.client = client self.clients = {} + self.reserved_names = [] i=0 while(ports[i]): @@ -226,23 +238,23 @@ class JackGraph( object ): return oldname = client.name - cname_split = client.name.split('-') + newname = self.get_free_name( client.name ) + + client.rename( newname ) + del self.clients[oldname] + self.clients[newname] = client + + def get_free_name( self, oldname, other_names=[] ): + cname_split = oldname.split('-') if len(cname_split) == 1: cname_prefix = cname_split[0] else: cname_prefix = string.join( cname_split[:-1], '-' ) num = 1 - while ("%s-%d"%(cname_prefix,num)) in (self.clients.keys()+self.reserved_names): + while ("%s-%d"%(cname_prefix,num)) in (self.clients.keys()+self.reserved_names+other_names): num+=1 - # XXX: this might still fail due to race. - # also needs to lock - newname = "%s-%d"%(cname_prefix,num ) - - client.rename( newname ) - del self.clients[oldname] - self.clients[newname] = client def remove_client( self, name ): @@ -261,6 +273,14 @@ class JackGraph( object ): for c in self.clients.values(): self.check_client_name( c ) + def get_taken_names( self ): + return self.clients.keys() + self.reserved_names + + def reserve_name( self, uuid, name ): + if reserve_client_name( self.client, name, uuid ): + raise Exception( "reservation failure" ) + self.reserved_names.append( name ) + class NotifyReply(object): def __init__( self, uuid, clientname, commandline ): diff --git a/python/sessionmanager.py b/python/sessionmanager.py index 71d8bc3..4559f63 100755 --- a/python/sessionmanager.py +++ b/python/sessionmanager.py @@ -59,12 +59,21 @@ class SessionManager( object ): print sd.get_client_names() - g.ensure_clientnames( sd.get_reg_client_names() ) + if opt.renames: + g.ensure_clientnames( sd.get_reg_client_names() ) + # get graph again... renaming isnt prefect yet. + g=self.cl.get_graph() - # get graph again... renaming isnt prefect yet. - g=self.cl.get_graph() - # build up list of port connections + # fixup names, doing this unconditionally, because + # a client rename might have failed. + sd.fixup_client_names( g ) + # now we have mangled all the names, lets reserve them. + for (uuid, clientname) in sd.get_uuid_client_pairs(): + print "reserving name %s"%clientname + g.reserve_name( uuid, clientname ) + + # build up list of port connections conns = [] for p in sd.get_port_names(): for c in sd.get_connections_for_port( p ): @@ -113,7 +122,7 @@ class SessionManager( object ): def save_session( self, name ): if os.path.exists( self.sessiondir+name ): - print "session %s already exists" + print "session %s already exists"%name return -1 os.mkdir( self.sessiondir+name ) g=self.cl.get_graph() @@ -122,6 +131,7 @@ class SessionManager( object ): for n in notify: c = g.get_client( n.clientname ) c.set_commandline( n.commandline ) + c.set_uuid( n.uuid ) sd = state.SessionDom() @@ -196,6 +206,8 @@ oparser.add_option( "--quitdaemon", action="store_true", dest="quitdaemon", defa # help="SaveAs And Quit" ) oparser.add_option( "--load", action="store", dest="load", type="string", help="Load Session with " ) +oparser.add_option( "--renames", action="store_true", dest="renames", default=False, + help="Allow renaming offending clients" ) (opt,args) = oparser.parse_args() diff --git a/python/state.py b/python/state.py index e4bfdf8..64e8665 100644 --- a/python/state.py +++ b/python/state.py @@ -14,6 +14,8 @@ class SessionDom( object ): cl_elem = Element( "jackclient" ) cl_elem.setAttribute( "cmdline", client.get_commandline() ) cl_elem.setAttribute( "jackname", client.name ) + if client.get_uuid(): + cl_elem.setAttribute( "uuid", client.get_uuid() ) if client.isinfra: cl_elem.setAttribute( "infra", "True" ) else: @@ -84,6 +86,23 @@ class SessionDom( object ): if c.getAttribute( "jackname" ) == name: return c.getAttribute( "cmdline" ) + def get_uuid_client_pairs( self ): + retval = [] + doc = self.dom.documentElement + for c in doc.getElementsByTagName( "jackclient" ): + if c.getAttribute( "infra" ) != "True": + retval.append( (c.getAttribute( "uuid" ), c.getAttribute( "jackname" )) ) + + return retval + + def fixup_client_names( self, graph ): + doc = self.dom.documentElement + for c in doc.getElementsByTagName( "jackclient" ): + cname = c.getAttribute( "jackname" ) + if cname in graph.get_taken_names(): + c.setAttribute( "jackname", graph.get_free_name( cname, self.get_reg_client_names() ) ) + +