You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ansible/lib/ansible/utils/singleton.py

30 lines
949 B
Python

# 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