Browse code

Fixing hang caused due to restart of thread

Divya Thaluru authored on 2015/06/03 02:27:27
Showing 4 changed files
... ...
@@ -207,12 +207,15 @@ class PackageManager(object):
207 207
             return False
208 208
          
209 209
         ThreadPool.clear()
210
+        ThreadPool.mapPackageToCycle=self.mapPackageToCycle
211
+        ThreadPool.listAvailableCyclicPackages=self.listAvailableCyclicPackages
212
+        ThreadPool.logger=self.logger
213
+        ThreadPool.statusEvent=statusEvent
210 214
         i=0
211 215
         while i < numWorkerThreads:
212 216
             workerName="WorkerThread"+str(i)
213
-            w = WorkerThread(statusEvent,workerName,self.mapPackageToCycle,self.listAvailableCyclicPackages,self.logger)
214
-            ThreadPool.addWorkerThread(workerName, w)
215
-            w.start()
217
+            ThreadPool.addWorkerThread(workerName)
218
+            ThreadPool.startWorkerThread(workerName)
216 219
             i = i + 1
217 220
         
218 221
         statusEvent.wait()
... ...
@@ -1,4 +1,4 @@
1
-from ThreadPool import ThreadPool
1
+import ThreadPool
2 2
 from constants import constants
3 3
 from Logger import Logger
4 4
 import threading 
... ...
@@ -94,7 +94,7 @@ class Scheduler(object):
94 94
         package=Scheduler.listOfPackagesNextToBuild.pop(0)
95 95
         
96 96
         if len(Scheduler.listOfPackagesNextToBuild) > 0:
97
-            ThreadPool.activateWorkerThreads(len(Scheduler.listOfPackagesNextToBuild))
97
+            ThreadPool.ThreadPool.activateWorkerThreads(len(Scheduler.listOfPackagesNextToBuild))
98 98
         Scheduler.logger.info("Released scheduler lock")
99 99
         Scheduler.lock.release()
100 100
         Scheduler.listOfPackagesCurrentlyBuilding.append(package)
... ...
@@ -1,9 +1,14 @@
1 1
 
2
+import WorkerThread
2 3
 class ThreadPool(object):
3 4
     
4 5
     mapWorkerThreads={}
5 6
     activeWorkerThreads=[]
6 7
     inactiveWorkerThreads=[]
8
+    mapPackageToCycle={}
9
+    listAvailableCyclicPackages=[]
10
+    logger=None
11
+    statusEvent=None
7 12
     
8 13
     @staticmethod
9 14
     def clear():
... ...
@@ -21,7 +26,8 @@ class ThreadPool(object):
21 21
         return listWorkerObjs
22 22
         
23 23
     @staticmethod
24
-    def addWorkerThread(workerThreadName,workerThread):
24
+    def addWorkerThread(workerThreadName):
25
+        workerThread = WorkerThread.WorkerThread(ThreadPool.statusEvent,workerThreadName,ThreadPool.mapPackageToCycle,ThreadPool.listAvailableCyclicPackages,ThreadPool.logger)
25 26
         ThreadPool.mapWorkerThreads[workerThreadName]=workerThread
26 27
    
27 28
     @staticmethod
... ...
@@ -48,6 +54,7 @@ class ThreadPool(object):
48 48
     def activateWorkerThreads(numOfThreadsToActivate):
49 49
         while len(ThreadPool.inactiveWorkerThreads) > 0 and numOfThreadsToActivate > 0:
50 50
             threadName=ThreadPool.inactiveWorkerThreads.pop()
51
+            ThreadPool.addWorkerThread(threadName)
51 52
             ThreadPool.startWorkerThread(threadName)
52 53
             ThreadPool.makeWorkerThreadActive(threadName)
53 54
             numOfThreadsToActivate = numOfThreadsToActivate -1
... ...
@@ -1,8 +1,8 @@
1 1
 from PackageBuilder import PackageBuilder
2 2
 import threading
3
-from Scheduler import Scheduler
3
+import Scheduler
4 4
 from constants import constants
5
-from ThreadPool import ThreadPool
5
+import ThreadPool
6 6
  
7 7
 class WorkerThread(threading.Thread):
8 8
     
... ...
@@ -17,11 +17,11 @@ class WorkerThread(threading.Thread):
17 17
     
18 18
     def run(self):
19 19
         buildThreadFailed=False
20
-        ThreadPool.makeWorkerThreadActive(self.name)
20
+        ThreadPool.ThreadPool.makeWorkerThreadActive(self.name)
21 21
         self.logger.info("Thread "+self.name +" is starting now")
22 22
         while True:
23 23
             outputMap={}
24
-            pkg = Scheduler.getNextPackageToBuild()
24
+            pkg = Scheduler.Scheduler.getNextPackageToBuild()
25 25
             if pkg is None:
26 26
                 break
27 27
             self.logger.info("Thread "+self.name+" is building package:"+ pkg)
... ...
@@ -32,21 +32,21 @@ class WorkerThread(threading.Thread):
32 32
             if outputMap.has_key(pkg):
33 33
                 if outputMap[pkg] == False:
34 34
                     buildThreadFailed = True
35
-                    Scheduler.notifyPackageBuildFailed(pkg)
35
+                    Scheduler.Scheduler.notifyPackageBuildFailed(pkg)
36 36
                     self.logger.info("Thread "+self.name +" stopped building the "+pkg +" package")
37 37
                     break
38 38
             else:
39 39
                 buildThreadFailed = True
40
-                Scheduler.notifyPackageBuildFailed(pkg)
40
+                Scheduler.Scheduler.notifyPackageBuildFailed(pkg)
41 41
                 self.logger.info("Thread "+self.name +" stopped building the "+pkg +" package")
42 42
                 break
43 43
             
44
-            Scheduler.notifyPackageBuildCompleted(pkg)
44
+            Scheduler.Scheduler.notifyPackageBuildCompleted(pkg)
45 45
         
46 46
         if buildThreadFailed:
47 47
             self.statusEvent.set()
48 48
         
49
-        ThreadPool.makeWorkerThreadInActive(self.name)
49
+        ThreadPool.ThreadPool.makeWorkerThreadInActive(self.name)
50 50
         self.logger.info("Thread "+self.name +" is going to rest")
51 51
         
52 52