Source code for radical.utils.singleton


__author__    = "Radical.Utils Development Team (Andre Merzky)"
__copyright__ = "Copyright 2013, RADICAL@Rutgers"
__license__   = "MIT"


import os
import threading

from .atfork import atfork


_singleton_lock = threading.RLock ()


''' Provides a Singleton metaclass.  '''


# ------------------------------------------------------------------------------
#
[docs]class Singleton (type): ''' A metaclass to 'tag' other classes as singleton:: class MyClass(BaseClass): __metaclass__ = Singleton ''' _instances = {} def __call__(cls, *args, **kwargs): with _singleton_lock: if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls]
# ------------------------------------------------------------------------------ # def _atfork_prepare(): pass def _atfork_parent(): pass def _atfork_child(): # release lock global _singleton_lock _singleton_lock = threading.RLock() # lock cleaning can be disabled by setting RADICAL_UTILS_NO_ATFORK if 'RADICAL_UTILS_NO_ATFORK' not in os.environ: atfork(_atfork_prepare, _atfork_parent, _atfork_child) # ------------------------------------------------------------------------------