Index: BitTorrent/RawServer.py =================================================================== RCS file: /opt/src/cvsroot/bittorrent/BitTorrent/RawServer.py,v retrieving revision 1.1.1.9.2.11 retrieving revision 1.1.1.9.2.19 diff -c -u -r1.1.1.9.2.11 -r1.1.1.9.2.19 cvs diff: conflicting specifications of output style --- BitTorrent/RawServer.py 5 Aug 2004 21:45:50 -0000 1.1.1.9.2.11 +++ BitTorrent/RawServer.py 29 Sep 2004 03:05:39 -0000 1.1.1.9.2.19 @@ -319,7 +319,8 @@ self._suscripciones_socket={} self._suscripciones_download_id={} - self._sockets={} + import weakref + self._sockets=weakref.WeakValueDictionary() self.poll=select.poll() self.cola_notif=Queue.Queue() r,w=os.pipe() @@ -334,6 +335,10 @@ import time import os + class contenedor_socket(object) : + def __init__(self,sock) : + self.socket=sock + while True : p=self.poll.poll(3600) for i in p : @@ -341,10 +346,12 @@ if s==self.__socket_notificacion : estado=None os.read(s,1) - ip,puerto,download_id,cola_notificacion,socket_notificacion=self.cola_notif.get() - valor=self._suscripciones_socket.setdefault((ip,puerto),[]) # Objeto MUTABLE + ip,puerto,download_id,cola_notificacion2,socket_notificacion=self.cola_notif.get() + import weakref + cola_notificacion=weakref.ref(cola_notificacion2) + valor=self._suscripciones_socket.setdefault((ip,puerto),[None,[]]) # Objeto MUTABLE - if not len(valor) : # Es el primero + if not len(valor[1]) : # Es el primero try : server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) @@ -356,21 +363,35 @@ server.bind((ip, puerto)) server.listen(5) self.poll.register(server, POLLIN) - self._sockets[server.fileno()]=server + s=contenedor_socket(server) + valor[0]=s + self._sockets[server.fileno()]=s + del s,server # Para no dejar referencias por ahi, para que actue el WeakRef except : import sys estado=sys.exc_info()[1] - else : - valor.append(download_id) - self._suscripciones_download_id[download_id]=(cola_notificacion,socket_notificacion) - cola_notificacion.put(estado) - del estado + if not estado : + valor[1].append(download_id) + self._suscripciones_download_id[download_id]=(cola_notificacion,socket_notificacion) + + cola_notificacion2.put(estado) + del estado,cola_notificacion2 # Lo de "cola_notificacion2" es para no dejar referencias por ahi, para que actue el WeakRef os.write(socket_notificacion,"A") continue - s=self._sockets[s].accept()[0] + s2=self._sockets.get(s) + if not s2 : + import os + os.close(s) + continue + else : + s=s2 + del s2 # Para no dejar referencias por ahi, para que actue el WeakRef + + s=s.socket.accept()[0] + timeout_original=s.gettimeout() timeout=time.time()+5 data="" @@ -391,9 +412,35 @@ download_id=data[28:48] valor=self._suscripciones_download_id.get(download_id) if valor : - valor[0].put((s,data)) - import os - os.write(valor[1],"A") + cola_notificacion=valor[0]() # Weak Ref + if cola_notificacion : + cola_notificacion.put((s,data)) + import os + os.write(valor[1],"A") + del cola_notificacion # Para no dejar referencias por ahi, para que actue el WeakRef + else : + del self._suscripciones_download_id[download_id] + s.close() + v=[] + for i,j in self._suscripciones_download_id.iteritems() : + if not j[0]() : # Weak Ref + v.append(i) + w=[] + for i in v : + del self._suscripciones_download_id[i] + for j,k in self._suscripciones_socket.iteritems() : + try : + k[1].remove(i) + except : + pass + if not len(k[1]) : # Ya no hay nada mas en ese socket + k[0].socket.close() + w.append(j) + for i in w : + del self._suscripciones_socket[i] + del v,w + del i,j,k + del valor else : s.close()