import WorkerThread
class ThreadPool(object):
    
    mapWorkerThreads={}
    activeWorkerThreads=[]
    inactiveWorkerThreads=[]
    mapPackageToCycle={}
    listAvailableCyclicPackages=[]
    listBuildOptionPackages=[]
    pkgBuildOptionFile=""
    pkgBuildType="chroot"
    logger=None
    statusEvent=None
    
    @staticmethod
    def clear():
        ThreadPool.mapWorkerThreads.clear()
        ThreadPool.activeWorkerThreads=[]
        ThreadPool.inactiveWorkerThreads=[]
    
    @staticmethod
    def getAllWorkerObjects():
        listWorkerObjs=[]
        listWorkerKeys = ThreadPool.mapWorkerThreads.keys()
        for x in listWorkerKeys:
            xobj=ThreadPool.mapWorkerThreads[x]
            listWorkerObjs.append(xobj)
        return listWorkerObjs
        
    @staticmethod
    def addWorkerThread(workerThreadName):
        workerThread = WorkerThread.WorkerThread(
                ThreadPool.statusEvent,
                workerThreadName,
                ThreadPool.mapPackageToCycle,
                ThreadPool.listAvailableCyclicPackages,
                ThreadPool.logger,
                ThreadPool.listBuildOptionPackages,
                ThreadPool.pkgBuildOptionFile,
                ThreadPool.pkgBuildType)
        ThreadPool.mapWorkerThreads[workerThreadName]=workerThread
   
    @staticmethod
    def makeWorkerThreadActive(threadName):
        if threadName in ThreadPool.inactiveWorkerThreads:
            ThreadPool.inactiveWorkerThreads.remove(threadName)
        ThreadPool.activeWorkerThreads.append(threadName)
        
    @staticmethod
    def makeWorkerThreadInActive(threadName):
        if threadName in ThreadPool.activeWorkerThreads:
            ThreadPool.activeWorkerThreads.remove(threadName)
        ThreadPool.inactiveWorkerThreads.append(threadName)
    
    @staticmethod
    def startWorkerThread(threadName):
        ThreadPool.mapWorkerThreads[threadName].start()
    
    @staticmethod
    def getListInactiveWorkerThreads():
        return ThreadPool.inactiveWorkerThreads
    
    @staticmethod
    def activateWorkerThreads(numOfThreadsToActivate):
        while len(ThreadPool.inactiveWorkerThreads) > 0 and numOfThreadsToActivate > 0:
            threadName=ThreadPool.inactiveWorkerThreads.pop()
            ThreadPool.addWorkerThread(threadName)
            ThreadPool.startWorkerThread(threadName)
            ThreadPool.makeWorkerThreadActive(threadName)
            numOfThreadsToActivate = numOfThreadsToActivate -1