2013-04-24 12:50:14 +02:00
|
|
|
#!/usr/bin/python
|
|
|
|
import sys
|
|
|
|
import lutinDebug as debug
|
|
|
|
import threading
|
|
|
|
import time
|
|
|
|
import Queue
|
|
|
|
import os
|
2013-04-24 21:30:46 +02:00
|
|
|
import subprocess
|
2013-07-05 21:41:19 +02:00
|
|
|
import lutinTools
|
2013-07-09 15:00:07 +02:00
|
|
|
import lutinEnv
|
2013-04-24 12:50:14 +02:00
|
|
|
|
2013-04-25 22:11:05 +02:00
|
|
|
queueLock = threading.Lock()
|
|
|
|
workQueue = Queue.Queue()
|
|
|
|
currentThreadWorking = 0
|
|
|
|
threads = []
|
|
|
|
|
|
|
|
exitFlag = False # resuest stop of the thread
|
|
|
|
isInit = False # the thread are initialized
|
|
|
|
errorOccured = False # a thread have an error
|
|
|
|
processorAvaillable = 1 # number of CPU core availlable
|
|
|
|
|
2013-07-05 21:41:19 +02:00
|
|
|
def StoreCommand(cmdLine, file):
|
|
|
|
# write cmd line only after to prevent errors ...
|
|
|
|
if file!="":
|
|
|
|
# Create directory:
|
|
|
|
lutinTools.CreateDirectoryOfFile(file)
|
|
|
|
# Store the command Line:
|
|
|
|
file2 = open(file, "w")
|
|
|
|
file2.write(cmdLine)
|
|
|
|
file2.flush()
|
|
|
|
file2.close()
|
|
|
|
|
2013-04-25 22:11:05 +02:00
|
|
|
|
2013-04-24 21:30:46 +02:00
|
|
|
def RunCommand(cmdLine, storeCmdLine=""):
|
2013-07-09 15:00:07 +02:00
|
|
|
debug.debug(lutinEnv.PrintPretty(cmdLine))
|
2013-04-24 21:30:46 +02:00
|
|
|
try:
|
|
|
|
retcode = subprocess.call(cmdLine, shell=True)
|
|
|
|
except OSError as e:
|
|
|
|
print >>sys.stderr, "Execution failed:", e
|
|
|
|
|
2013-04-25 22:11:05 +02:00
|
|
|
if retcode != 0:
|
|
|
|
global errorOccured
|
|
|
|
errorOccured = True
|
|
|
|
global exitFlag
|
|
|
|
exitFlag = True
|
|
|
|
if retcode == 2:
|
|
|
|
debug.error("can not compile file ... [keyboard interrrupt]")
|
|
|
|
else:
|
|
|
|
debug.error("can not compile file ... ret : " + str(retcode))
|
|
|
|
return
|
2013-04-24 21:30:46 +02:00
|
|
|
|
2013-04-25 22:11:05 +02:00
|
|
|
# write cmd line only after to prevent errors ...
|
2013-07-05 21:41:19 +02:00
|
|
|
StoreCommand(cmdLine, storeCmdLine)
|
2013-04-24 21:30:46 +02:00
|
|
|
|
2013-04-24 12:50:14 +02:00
|
|
|
|
2013-04-25 22:11:05 +02:00
|
|
|
|
2013-04-24 12:50:14 +02:00
|
|
|
|
|
|
|
class myThread(threading.Thread):
|
|
|
|
def __init__(self, threadID, lock, queue):
|
|
|
|
threading.Thread.__init__(self)
|
|
|
|
self.threadID = threadID
|
|
|
|
self.name = "Thread " + str(threadID)
|
|
|
|
self.queue = queue
|
|
|
|
self.lock = lock
|
|
|
|
def run(self):
|
2013-04-24 21:30:46 +02:00
|
|
|
debug.verbose("Starting " + self.name)
|
2013-04-24 12:50:14 +02:00
|
|
|
global exitFlag
|
2013-04-24 21:30:46 +02:00
|
|
|
global currentThreadWorking
|
|
|
|
workingSet = False
|
2013-04-24 12:50:14 +02:00
|
|
|
while False==exitFlag:
|
|
|
|
self.lock.acquire()
|
|
|
|
if not self.queue.empty():
|
2013-04-24 21:30:46 +02:00
|
|
|
if workingSet==False:
|
|
|
|
currentThreadWorking += 1
|
|
|
|
workingSet = True
|
2013-04-24 12:50:14 +02:00
|
|
|
data = self.queue.get()
|
|
|
|
self.lock.release()
|
2013-04-24 21:30:46 +02:00
|
|
|
debug.verbose(self.name + " processing '" + data[0] + "'")
|
2013-04-24 12:50:14 +02:00
|
|
|
if data[0]=="cmdLine":
|
|
|
|
comment = data[2]
|
|
|
|
cmdLine = data[1]
|
2013-04-24 21:30:46 +02:00
|
|
|
cmdStoreFile = data[3]
|
|
|
|
debug.printElement( "[" + str(self.threadID) + "] " + comment[0], comment[1], comment[2], comment[3])
|
|
|
|
RunCommand(cmdLine, cmdStoreFile)
|
2013-04-24 12:50:14 +02:00
|
|
|
else:
|
|
|
|
debug.warning("unknow request command : " + data[0])
|
|
|
|
else:
|
2013-04-24 21:30:46 +02:00
|
|
|
if workingSet==True:
|
|
|
|
currentThreadWorking -= 1
|
|
|
|
workingSet=False
|
2013-04-24 12:50:14 +02:00
|
|
|
# no element to parse, just wait ...
|
|
|
|
self.lock.release()
|
|
|
|
time.sleep(0.2)
|
|
|
|
# kill requested ...
|
2013-04-24 21:30:46 +02:00
|
|
|
debug.verbose("Exiting " + self.name)
|
2013-04-24 12:50:14 +02:00
|
|
|
|
|
|
|
|
|
|
|
def ErrorOccured():
|
|
|
|
global exitFlag
|
|
|
|
exitFlag = True
|
|
|
|
|
|
|
|
def SetCoreNumber(numberOfcore):
|
2013-04-24 21:30:46 +02:00
|
|
|
global processorAvaillable
|
2013-04-24 12:50:14 +02:00
|
|
|
processorAvaillable = numberOfcore
|
2013-04-24 21:30:46 +02:00
|
|
|
debug.debug(" set number of core for multi process compilation : " + str(processorAvaillable))
|
2013-04-24 12:50:14 +02:00
|
|
|
# nothing else to do
|
|
|
|
|
|
|
|
def Init():
|
|
|
|
global exitFlag
|
|
|
|
global isInit
|
|
|
|
if isInit==False:
|
|
|
|
isInit=True
|
|
|
|
global threads
|
|
|
|
global queueLock
|
|
|
|
global workQueue
|
|
|
|
# Create all the new threads
|
|
|
|
threadID = 0
|
|
|
|
while threadID < processorAvaillable:
|
|
|
|
thread = myThread(threadID, queueLock, workQueue)
|
|
|
|
thread.start()
|
|
|
|
threads.append(thread)
|
|
|
|
threadID += 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def UnInit():
|
|
|
|
global exitFlag
|
|
|
|
# Notify threads it's time to exit
|
|
|
|
exitFlag = True
|
|
|
|
if processorAvaillable > 1:
|
|
|
|
# Wait for all threads to complete
|
|
|
|
for tmp in threads:
|
2013-04-24 21:30:46 +02:00
|
|
|
debug.verbose("join thread ...")
|
2013-04-24 12:50:14 +02:00
|
|
|
tmp.join()
|
2013-04-24 21:30:46 +02:00
|
|
|
debug.verbose("Exiting ALL Threads")
|
2013-04-24 12:50:14 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2013-04-24 21:30:46 +02:00
|
|
|
def RunInPool(cmdLine, comment, storeCmdLine=""):
|
2013-04-24 12:50:14 +02:00
|
|
|
if processorAvaillable <= 1:
|
|
|
|
debug.printElement(comment[0], comment[1], comment[2], comment[3])
|
2013-04-24 21:30:46 +02:00
|
|
|
RunCommand(cmdLine, storeCmdLine)
|
2013-04-24 12:50:14 +02:00
|
|
|
return
|
|
|
|
# multithreaded mode
|
|
|
|
Init()
|
|
|
|
# Fill the queue
|
|
|
|
queueLock.acquire()
|
|
|
|
debug.verbose("add : in pool cmdLine")
|
2013-04-24 21:30:46 +02:00
|
|
|
workQueue.put(["cmdLine", cmdLine, comment, storeCmdLine])
|
2013-04-24 12:50:14 +02:00
|
|
|
queueLock.release()
|
|
|
|
|
|
|
|
|
|
|
|
def PoolSynchrosize():
|
2013-04-25 22:11:05 +02:00
|
|
|
global errorOccured
|
2013-04-24 12:50:14 +02:00
|
|
|
if processorAvaillable <= 1:
|
|
|
|
#in this case : nothing to synchronise
|
|
|
|
return
|
|
|
|
|
|
|
|
debug.verbose("wait queue process ended\n")
|
|
|
|
# Wait for queue to empty
|
2013-04-25 22:11:05 +02:00
|
|
|
while not workQueue.empty() \
|
|
|
|
and False==errorOccured:
|
2013-04-24 12:50:14 +02:00
|
|
|
time.sleep(0.2)
|
|
|
|
pass
|
2013-04-24 21:30:46 +02:00
|
|
|
# Wait all thread have ended their current process
|
2013-04-25 22:11:05 +02:00
|
|
|
while currentThreadWorking != 0 \
|
|
|
|
and False==errorOccured:
|
2013-04-24 21:30:46 +02:00
|
|
|
time.sleep(0.2)
|
|
|
|
pass
|
2013-04-25 22:11:05 +02:00
|
|
|
if False==errorOccured:
|
|
|
|
debug.verbose("queue is empty")
|
|
|
|
else:
|
|
|
|
debug.debug("Thread return with error ... ==> stop all the pool")
|
|
|
|
UnInit()
|
|
|
|
debug.error("Pool error occured ...")
|
2013-04-24 12:50:14 +02:00
|
|
|
|