Source code for camelot.view.model_thread.garbage_collector

import logging
import gc

from PyQt4 import QtCore

LOGGER = logging.getLogger('camelot.view.model_thread.garbage_collector')

[docs]class GarbageCollector(QtCore.QObject): """ Disable automatic garbage collection and instead collect manually every INTERVAL milliseconds. This is done to ensure that garbage collection only happens in the GUI thread, as otherwise Qt can crash. This code is serves as a workaround for a bug in PyQt: and is modeled after the original code of Kovid Goyal """ INTERVAL = 5000 def __init__(self, parent, debug=False): super( GarbageCollector, self ).__init__( parent ) self._threshold = gc.get_threshold() self._debug = debug self.destroyed.connect( self._destroyed ) gc.disable() timer = QtCore.QTimer(self) timer.timeout.connect(self._check) timer.start( self.INTERVAL ) @QtCore.pyqtSlot() def _destroyed( self ): LOGGER.debug( 'custom garbage collector destroyed' ) @QtCore.pyqtSlot() def _check(self): l0, l1, l2 = gc.get_count() if self._debug: LOGGER.debug( 'gc_check called : %s %s %s'%( l0, l1, l2 ) ) if l0 > self._threshold[0]: num = gc.collect(0) if self._debug: LOGGER.debug('collecting gen 0, found: %s unreachable'%num) if l1 > self._threshold[1]: num = gc.collect(1) if self._debug: LOGGER.debug('collecting gen 1, found: %s unreachable'%num) if l2 > self._threshold[2]: num = gc.collect(2) if self._debug: LOGGER.debug('collecting gen 2, found: %s unreachable'%num)

Comments
blog comments powered by Disqus