diff options
Diffstat (limited to 'lib/ansible/utils/singleton.py')
-rw-r--r-- | lib/ansible/utils/singleton.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/ansible/utils/singleton.py b/lib/ansible/utils/singleton.py new file mode 100644 index 0000000..4299403 --- /dev/null +++ b/lib/ansible/utils/singleton.py @@ -0,0 +1,29 @@ +# Copyright (c) 2017 Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# Make coding more python3-ish +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from threading import RLock + + +class Singleton(type): + """Metaclass for classes that wish to implement Singleton + functionality. If an instance of the class exists, it's returned, + otherwise a single instance is instantiated and returned. + """ + def __init__(cls, name, bases, dct): + super(Singleton, cls).__init__(name, bases, dct) + cls.__instance = None + cls.__rlock = RLock() + + def __call__(cls, *args, **kw): + if cls.__instance is not None: + return cls.__instance + + with cls.__rlock: + if cls.__instance is None: + cls.__instance = super(Singleton, cls).__call__(*args, **kw) + + return cls.__instance |