|  | @@ -14,6 +14,7 @@ import heapq
 | 
											
												
													
														|  |  import os
 |  |  import os
 | 
											
												
													
														|  |  import sys
 |  |  import sys
 | 
											
												
													
														|  |  import threading
 |  |  import threading
 | 
											
												
													
														|  | 
 |  | +import weakref
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  from datetime import datetime
 |  |  from datetime import datetime
 | 
											
												
													
														|  |  from functools import wraps
 |  |  from functools import wraps
 | 
											
										
											
												
													
														|  | @@ -34,24 +35,34 @@ __docformat__ = 'restructuredtext'
 | 
											
												
													
														|  |  DEFAULT_MAX_INTERVAL = 2
 |  |  DEFAULT_MAX_INTERVAL = 2
 | 
											
												
													
														|  |  TIMER_DEBUG = os.environ.get('TIMER_DEBUG')
 |  |  TIMER_DEBUG = os.environ.get('TIMER_DEBUG')
 | 
											
												
													
														|  |  EPOCH = datetime.utcfromtimestamp(0).replace(tzinfo=timezone.utc)
 |  |  EPOCH = datetime.utcfromtimestamp(0).replace(tzinfo=timezone.utc)
 | 
											
												
													
														|  | 
 |  | +IS_PYPY = hasattr(sys, 'pypy_version_info')
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  logger = get_logger('timer2')
 |  |  logger = get_logger('timer2')
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  class Entry(object):
 |  |  class Entry(object):
 | 
											
												
													
														|  | -    cancelled = False
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if not IS_PYPY:
 | 
											
												
													
														|  | 
 |  | +        __slots__ = (
 | 
											
												
													
														|  | 
 |  | +            'fun', 'args', 'kwargs', 'tref', 'cancelled',
 | 
											
												
													
														|  | 
 |  | +            '_last_run', '__weakref__',
 | 
											
												
													
														|  | 
 |  | +        )
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      def __init__(self, fun, args=None, kwargs=None):
 |  |      def __init__(self, fun, args=None, kwargs=None):
 | 
											
												
													
														|  |          self.fun = fun
 |  |          self.fun = fun
 | 
											
												
													
														|  |          self.args = args or []
 |  |          self.args = args or []
 | 
											
												
													
														|  |          self.kwargs = kwargs or {}
 |  |          self.kwargs = kwargs or {}
 | 
											
												
													
														|  | -        self.tref = self
 |  | 
 | 
											
												
													
														|  | 
 |  | +        self.tref = weakref.proxy(self)
 | 
											
												
													
														|  | 
 |  | +        self.cancelled = False
 | 
											
												
													
														|  | 
 |  | +        self._last_run = None
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      def __call__(self):
 |  |      def __call__(self):
 | 
											
												
													
														|  |          return self.fun(*self.args, **self.kwargs)
 |  |          return self.fun(*self.args, **self.kwargs)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      def cancel(self):
 |  |      def cancel(self):
 | 
											
												
													
														|  | -        self.tref.cancelled = True
 |  | 
 | 
											
												
													
														|  | 
 |  | +        try:
 | 
											
												
													
														|  | 
 |  | +            self.tref.cancelled = True
 | 
											
												
													
														|  | 
 |  | +        except ReferenceError:
 | 
											
												
													
														|  | 
 |  | +            pass
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      def __repr__(self):
 |  |      def __repr__(self):
 | 
											
												
													
														|  |          return '<TimerEntry: %s(*%r, **%r)' % (
 |  |          return '<TimerEntry: %s(*%r, **%r)' % (
 |