Source code for rootpy.memory.keepalive

from __future__ import absolute_import

import sys
import weakref
import os

from . import log; log = log[__name__]

__all__ = [
    'keepalive',
]

KEEPALIVE = weakref.WeakKeyDictionary()
DISABLED = 'NO_ROOTPY_KEEPALIVE' in os.environ


def hashable(v):
    """Determine whether `v` can be hashed."""
    try:
        hash(v)
    except:
        return False
    return True


[docs]def keepalive(nurse, *patients): """ Keep ``patients`` alive at least as long as ``nurse`` is around using a ``WeakKeyDictionary``. """ if DISABLED: return if hashable(nurse): hashable_patients = [] for p in patients: if hashable(p): log.debug("Keeping {0} alive for lifetime of {1}".format(p, nurse)) hashable_patients.append(p) else: log.warning("Unable to keep unhashable object {0} " "alive for lifetime of {1}".format(p, nurse)) KEEPALIVE.setdefault(nurse, set()).update(hashable_patients) else: log.warning("Unable to keep objects alive for lifetime of " "unhashable object {0}".format(nurse))