[pypy-svn] r34429 - in pypy/dist: lib-python/modified-2.4.1 lib-python/modified-2.4.1/test pypy/module/rsocket

ac at codespeak.net ac at codespeak.net
Thu Nov 9 18:02:41 CET 2006


Author: ac
Date: Thu Nov  9 18:02:40 2006
New Revision: 34429

Added:
   pypy/dist/lib-python/modified-2.4.1/socket.py
      - copied, changed from r34409, pypy/dist/lib-python/2.4.1/socket.py
Modified:
   pypy/dist/lib-python/modified-2.4.1/test/test_socket.py
   pypy/dist/pypy/module/rsocket/interp_socket.py
Log:
Implement explicit refcounting for sockets

Modified: pypy/dist/lib-python/modified-2.4.1/test/test_socket.py
==============================================================================
--- pypy/dist/lib-python/modified-2.4.1/test/test_socket.py	(original)
+++ pypy/dist/lib-python/modified-2.4.1/test/test_socket.py	Thu Nov  9 18:02:40 2006
@@ -26,7 +26,6 @@
     def tearDown(self):
         self.serv.close()
         self.serv = None
-        gc.collect()
         
 class SocketUDPTest(unittest.TestCase):
 
@@ -38,7 +37,6 @@
     def tearDown(self):
         self.serv.close()
         self.serv = None
-        gc.collect()
 
 class ThreadableTest:
     """Threadable Test class
@@ -136,7 +134,6 @@
 
     def clientTearDown(self):
         self.done.set()
-        gc.collect()
         thread.exit()
 
 class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
@@ -224,6 +221,7 @@
         s.close()
         s = None
         gc.collect()
+        gc.collect()
         try:
             p.fileno()
         except ReferenceError:

Modified: pypy/dist/pypy/module/rsocket/interp_socket.py
==============================================================================
--- pypy/dist/pypy/module/rsocket/interp_socket.py	(original)
+++ pypy/dist/pypy/module/rsocket/interp_socket.py	Thu Nov  9 18:02:40 2006
@@ -354,6 +354,31 @@
             raise converted_error(space, e)
     shutdown_w.unwrap_spec = ['self', ObjSpace, int]
 
+    #------------------------------------------------------------
+    # Support functions for socket._socketobject
+    usecount = 1
+    def _reuse_w(self):
+        """_resue()
+
+        Increase the usecount of the socketobject.
+        Intended only to be used by socket._socketobject
+        """
+        self.usecount += 1
+    _reuse_w.unwrap_spec = ['self']
+
+    def _drop_w(self, space):
+        """_drop()
+
+        Decrease the usecount of the socketobject. If the
+        usecount reaches 0 close the socket.
+        Intended only to be used by socket._socketobject
+        """
+        self.usecount -= 1
+        if self.usecount > 0:
+            return
+        self.close_w(space)
+    _drop_w.unwrap_spec = ['self', ObjSpace]
+
 app_makefile = gateway.applevel(r'''
 def makefile(self, mode="r", buffersize=-1):
     """makefile([mode[, buffersize]]) -> file object
@@ -399,7 +424,7 @@
 accept bind close connect connect_ex dup fileno
 getpeername getsockname getsockopt gettimeout listen makefile
 recv recvfrom send sendall sendto setblocking
-setsockopt settimeout shutdown
+setsockopt settimeout shutdown _reuse _drop
 """.split()
 socketmethods = {}
 for methodname in socketmethodnames:



More information about the Pypy-commit mailing list