Skip to content
Snippets Groups Projects
Commit c2a8ddbe authored by Eric S. Raymond's avatar Eric S. Raymond
Browse files

Timeouts and garbage collection are fully implemented.

parent fb0b3b8e
Branches
No related tags found
No related merge requests found
...@@ -163,10 +163,15 @@ class Connection(irc.client.ServerConnection): ...@@ -163,10 +163,15 @@ class Connection(irc.client.ServerConnection):
self.last_xmit = time.time() self.last_xmit = time.time()
self.irker.debug(1, "XMIT_TTL bump (%s transmission) at %s" % (self.servername, time.asctime())) self.irker.debug(1, "XMIT_TTL bump (%s transmission) at %s" % (self.servername, time.asctime()))
self.queue.task_done() self.queue.task_done()
def accepting(self, channel): def live(self):
"Is this connection ready to accept messages for the specified channel?" "Should this connection not be scavenged?"
return channel in self.channels_joined \ return self.status != "expired"
or len(self.channels_joined) < CHANNEL_MAX def joined_to(self, channel):
"Is this connection joined to the specified channel?"
return channel in self.channels_joined
def accepting(self):
"Can this connection accept new channel joins?"
return len(self.channels_joined) < CHANNEL_MAX
class Target(): class Target():
"Represent a transmission target." "Represent a transmission target."
...@@ -191,8 +196,9 @@ class Dispatcher: ...@@ -191,8 +196,9 @@ class Dispatcher:
self.connections = [] self.connections = []
def dispatch(self, channel, message): def dispatch(self, channel, message):
"Dispatch messages for our server-port combination." "Dispatch messages for our server-port combination."
self.connections = [x for x in self.connections if x.status!="expired"] self.connections = [x for x in self.connections if x.live()]
eligibles = [x for x in self.connections if x.accepting(channel)] eligibles = [x for x in self.connections if x.joined_to(channel)] \
or [x for x in self.connections if x.accepting()]
if not eligibles: if not eligibles:
newconn = Connection(self.irker, newconn = Connection(self.irker,
self.servername, self.servername,
...@@ -200,6 +206,10 @@ class Dispatcher: ...@@ -200,6 +206,10 @@ class Dispatcher:
self.connections.append(newconn) self.connections.append(newconn)
eligibles = [newconn] eligibles = [newconn]
eligibles[0].enqueue(channel, message) eligibles[0].enqueue(channel, message)
def live(self):
"Does this server-port combination have any live connections?"
self.connections = [x for x in self.connections if x.live()]
return not self.connections
class Irker: class Irker:
"Persistent IRC multiplexer." "Persistent IRC multiplexer."
...@@ -262,6 +272,11 @@ class Irker: ...@@ -262,6 +272,11 @@ class Irker:
if target.server() not in self.servers: if target.server() not in self.servers:
self.servers[target.server()] = Dispatcher(self, target.servername, target.port) self.servers[target.server()] = Dispatcher(self, target.servername, target.port)
self.servers[target.server()].dispatch(target.channel, message) self.servers[target.server()].dispatch(target.channel, message)
# GC dispatchers with no active connections
servernames = self.servers.keys()
for servername in servernames:
if not self.servers[servername].live():
del self.servers[servername]
except ValueError: except ValueError:
self.logerr("can't recognize JSON on input: %s" % repr(line)) self.logerr("can't recognize JSON on input: %s" % repr(line))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment