SHARE
TWEET

Untitled

a guest Sep 29th, 2011 84 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #Based off of http://twistedmatrix.com/trac/browser/sandbox/exarkun/btt.py
  2.  
  3. import array, struct, signal, traceback, time, StringIO
  4.  
  5. from twisted.internet import task
  6. from twisted.python import log
  7.  
  8. if hasattr(signal, 'setitimer'):
  9.     # Use the built in itimer if we are python 2.6 or greater
  10.     def itimer(seconds):
  11.         signal.setitimer(signal.ITIMER_REAL, seconds)
  12. else:
  13.     try:
  14.         # Then try py-itimer from http://www.cute.fi/~torppa/py-itimer/
  15.         import itimer as py_itimer
  16.     except ImportError:
  17.         # Otherwise use the dl module
  18.         import dl
  19.         def itimer(seconds, libc=dl.open('libc.so.6')):
  20.             sec = int(seconds)
  21.             msec = int((seconds - sec) * 1e6)
  22.             timeval = array.array('I', [0, 0, sec, msec])
  23.             if libc.call('setitimer', 0, timeval.buffer_info()[0], 0) == -1:
  24.                 raise RuntimeError("Who knows what")
  25.     else:
  26.         # Hooray
  27.         def itimer(seconds):
  28.             py_itimer.setitimer(0, seconds, 0)
  29.  
  30. class BigTimesliceTimer(object):
  31.     lc = None
  32.     lastRan = None
  33.     _stack = None
  34.  
  35.     def start(self, precision=0.01):
  36.         assert self.lc is None
  37.         self.precision = precision
  38.         signal.signal(signal.SIGALRM, self._signal)
  39.         itimer(precision * 1.1)
  40.         self.lc = task.LoopingCall(self._run)
  41.         self.lc.start(precision).addErrback(self._ebLoop)
  42.  
  43.  
  44.     def stop(self):
  45.         self.lc.stop()
  46.         del self.lc
  47.  
  48.  
  49.     def _ebLoop(self, err):
  50.         log.msg("BigTimesliceTimer broke")
  51.         log.err(err)
  52.  
  53.  
  54.     def _run(self):
  55.         now = time.time()
  56.         if self._stack is not None:
  57.             print 'Reactor is stalled:'
  58.             print self._stack
  59.             self._stack = None
  60.         self.lastRan = now
  61.         signal.signal(signal.SIGALRM, self._signal)
  62.         itimer(self.precision * 1.1)
  63.        
  64.  
  65.     def _signal(self, signum, frame):
  66.         s = StringIO.StringIO()
  67.         traceback.print_stack(file=s)
  68.         self._stack = '\n'.join(s.getvalue().splitlines()[:-2])
  69.  
  70. if __name__ == '__main__':
  71.     #TEST
  72.  
  73.     #import sys
  74.     #log.startLogging(sys.stdout)
  75.  
  76.     from twisted.internet import reactor
  77.     BigTimesliceTimer().start(3)
  78.  
  79.     # Block for 4 seconds after startup
  80.     reactor.callWhenRunning(time.sleep, 4)
  81.  
  82.     reactor.run()
  83.  
  84.  
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top