Skip to content
Snippets Groups Projects
Forked from DM / dm-docs
261 commits behind, 816 commits ahead of the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
dmModuleManager.py 2.32 KiB
#!/usr/bin/env python

#
# Module manager class.
#

#######################################################################

import threading

#######################################################################

class DmModuleManager:
    """ Singleton class used for managing dm modules. """

    # Get singleton instance.
    @classmethod
    def getInstance(cls):
        from dm.common.utility.dmModuleManager import DmModuleManager
        try:
            mgr = DmModuleManager()
        except DmModuleManager, ex:
            mgr = ex
        return mgr

    # Singleton.
    __instanceLock = threading.RLock()
    __instance = None

    def __init__(self):
        DmModuleManager.__instanceLock.acquire()
        try:
            if DmModuleManager.__instance:
                raise DmModuleManager.__instance
            DmModuleManager.__instance = self
            from dm.common.utility.loggingManager import LoggingManager
            self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
            self.lock = threading.RLock()
            self.moduleList = []
            self.modulesRunning = False
        finally:
            DmModuleManager.__instanceLock.release()

    def addModule(self, m):
        self.lock.acquire()
        try:
            self.logger.debug('Adding dm module: %s' % m.__class__.__name__)
            self.moduleList.append(m)
        finally:
            self.lock.release()

    def startModules(self):
        self.lock.acquire()
        try:
            if self.modulesRunning:
                return
            for m in self.moduleList:
                self.logger.debug('Starting dm module: %s' % m.__class__.__name__)
                m.start()
            self.modulesRunning = True
        finally:
            self.lock.release()

    def stopModules(self):
        self.lock.acquire()
        try:
            if not self.modulesRunning:
                return
            n = len(self.moduleList)
            for i in range(0, n):
                m = self.moduleList[n-1-i]
                self.logger.debug('Stopping dm module: %s' % m.__class__.__name__)
                m.stop()
            self.modulesRunning = False
        finally:
            self.lock.release()

#######################################################################
# Testing.

if __name__ == '__main__':
    pass