don't enable serialization caching by default
authorForrest Voight <forrest@forre.st>
Fri, 23 Dec 2011 04:10:38 +0000 (23:10 -0500)
committerForrest Voight <forrest@forre.st>
Fri, 23 Dec 2011 05:24:04 +0000 (00:24 -0500)
p2pool/bitcoin/data.py
p2pool/main.py
p2pool/util/expiring_dict.py

index 1a071fe..2eff7d0 100644 (file)
@@ -82,9 +82,26 @@ class Type(object):
         
         return data
     
-    _backing = expiring_dict.ExpiringDict(100)
-    pack2 = memoize.memoize_with_backing(_backing, [unpack])(pack2)
-    unpack = memoize.memoize_with_backing(_backing)(unpack) # doesn't have an inverse
+    _backing = None
+    
+    @classmethod
+    def enable_caching(cls):
+        assert cls._backing is None
+        cls._backing = expiring_dict.ExpiringDict(100)
+        cls._pre_pack2 = cls.pack2
+        cls.pack2 = memoize.memoize_with_backing(cls._backing, [cls.unpack])(cls.pack2)
+        cls._pre_unpack = cls.unpack
+        cls.unpack = memoize.memoize_with_backing(cls._backing)(cls.unpack) # doesn't have an inverse
+    
+    @classmethod
+    def disable_caching(cls):
+        assert cls._backing is not None
+        cls._backing.stop()
+        cls._backing = None
+        cls.pack2 = cls._pre_pack2
+        del cls._pre_pack2
+        cls.unpack = cls._pre_unpack
+        del cls._pre_unpack
     
     def pack(self, obj):
         return self.pack2(slush.immutify(obj))
index 42693ac..bbc352d 100644 (file)
@@ -62,6 +62,8 @@ def main(args, net, datadir_path):
             print "Install Pygame and PIL to enable visualizations! Visualizations disabled."
             print
         
+        bitcoin_data.Type.enable_caching()
+        
         # connect to bitcoind over JSON-RPC and do initial getmemorypool
         url = 'http://%s:%i/' % (args.bitcoind_address, args.bitcoind_rpc_port)
         print '''Testing bitcoind RPC connection to '%s' with username '%s'...''' % (url, args.bitcoind_rpc_username)
index 153fc76..edae4b3 100644 (file)
@@ -103,7 +103,11 @@ class ExpiringDict(object):
         
         self.expiry_deque = LinkedList()
         self.d = dict() # key -> node, value
-        task.LoopingCall(self.expire).start(1) # XXX use inlinecallbacks and stop expiring at some point
+        self._expire_loop = task.LoopingCall(self.expire)
+        self._expire_loop.start(1) # XXX use inlinecallbacks and stop expiring at some point
+    
+    def stop(self):
+        self._expire_loop.stop()
     
     def __repr__(self):
         return 'ExpiringDict' + repr(self.__dict__)