From 50702005efdf602c03643a0c8d98c634b288a304 Mon Sep 17 00:00:00 2001 From: Richo Healey Date: Tue, 7 May 2013 20:38:28 +1000 Subject: [PATCH 1/3] Fix hideous global abuse --- stationd | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/stationd b/stationd index 5852eec..79cfa61 100755 --- a/stationd +++ b/stationd @@ -55,9 +55,9 @@ def _write_sockets(): write_sockets.append(i) return write_sockets -def handle_discoverer_event(): +def handle_discoverer_event(sock): # TODO Return Event objects instead of raw data - data, peer = discoverer.recv(settings.DEFAULT_BUFSIZE) + data, peer = sock.recv(settings.DEFAULT_BUFSIZE) try: event = new_broadcast_event(data) except UnknownBroadcastEvent: @@ -86,21 +86,21 @@ def handle_discoverer_event(): log.info("Peer's uuid is smaller, awaiting connection") -def handle_listener_event(): - peer = listener.accept(PeerSocket) +def handle_listener_event(sock): + peer = sock.accept(PeerSocket) peer_sockets.append(peer) -def handle_tcpnetwork_event(): +def handle_tcpnetwork_event(sock): try: - i.recv() - while i.packet_queue: - data = i.packet_queue.pop() - gizmo = station.gizmo_factory.hydrate(data, i) + sock.recv() + while sock.packet_queue: + data = sock.packet_queue.pop() + gizmo = station.gizmo_factory.hydrate(data, sock) assert gizmo is not None, "gizmo_factory returned None" gizmo.process() except SocketClosedException: - peer_sockets.remove(i) + peer_sockets.remove(sock) except InvalidGizmoError: log.warn("Recieved invalid gizmo!") @@ -142,7 +142,7 @@ while True: log.info("Got %i fds. read: %s write: %i" % (len(sread) + len(swrite), len(sread), len(swrite))) for i in sread: - handler_for(i)() + handler_for(i)(i) for i in swrite: if not (isinstance(i, PeerSocket) or isinstance(i, StreamClient)): From 2a395253bf74efbe6c68d769c7be215a60a3090c Mon Sep 17 00:00:00 2001 From: Richo Healey Date: Tue, 7 May 2013 20:43:55 +1000 Subject: [PATCH 2/3] Shift some event logic into a module --- groundstation/events/tcpnetwork_event.py | 4 ++++ stationd | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 groundstation/events/tcpnetwork_event.py diff --git a/groundstation/events/tcpnetwork_event.py b/groundstation/events/tcpnetwork_event.py new file mode 100644 index 0000000..a51715c --- /dev/null +++ b/groundstation/events/tcpnetwork_event.py @@ -0,0 +1,4 @@ +def payloads(sock): + sock.recv() + while sock.packet_queue: + yield sock.packet_queue.pop() diff --git a/stationd b/stationd index 79cfa61..ff46262 100755 --- a/stationd +++ b/stationd @@ -23,6 +23,8 @@ from groundstation.broadcast_events import new_broadcast_event, UnknownBroadcast from groundstation.broadcast_events.broadcast_ping import BroadcastPing from groundstation.gizmo_factory import InvalidGizmoError +import groundstation.events.tcpnetwork_event as tcpnetwork_event + import groundstation.deferred PORT = settings.PORT @@ -93,10 +95,8 @@ def handle_listener_event(sock): def handle_tcpnetwork_event(sock): try: - sock.recv() - while sock.packet_queue: - data = sock.packet_queue.pop() - gizmo = station.gizmo_factory.hydrate(data, sock) + for payload in tcpnetwork_event.payloads(sock): + gizmo = station.gizmo_factory.hydrate(payload, sock) assert gizmo is not None, "gizmo_factory returned None" gizmo.process() except SocketClosedException: From cff5617045d555b5a779bf67cd4ab7ea4b81258d Mon Sep 17 00:00:00 2001 From: Richo Healey Date: Tue, 7 May 2013 20:45:08 +1000 Subject: [PATCH 3/3] Stop wasting stack frames --- stationd | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/stationd b/stationd index ff46262..2f93776 100755 --- a/stationd +++ b/stationd @@ -105,14 +105,6 @@ def handle_tcpnetwork_event(sock): log.warn("Recieved invalid gizmo!") -def handle_iterators(): - station.handle_iters() - - -def handle_deferreds(): - station.handle_deferreds() - - def handler_for(thing): if thing == discoverer: return handle_discoverer_event @@ -164,9 +156,9 @@ while True: # Deal with iterators last, this way if they queue up network stuff it'll be processed immediately. if station.has_ready_iterators(): - handle_iterators() + station.handle_iters() if station.has_ready_deferreds(): - handle_deferreds() + station.handle_deferreds() # else: # Right now that's the only socket