Prechádzať zdrojové kódy

protect the AMAN itself by locks

Sven Czarnian 3 rokov pred
rodič
commit
35d1012bf5
1 zmenil súbory, kde vykonal 30 pridanie a 1 odobranie
  1. 30 1
      aman/AMAN.py

+ 30 - 1
aman/AMAN.py

@@ -4,6 +4,7 @@ import glob
 import os
 import random
 import sys
+from threading import Lock
 import time
 
 from aman.com import AircraftReport_pb2
@@ -36,6 +37,7 @@ class AMAN:
         self.Weather = None
         self.WebUi = None
         self.Workers = []
+        self.WorkersLock = Lock()
 
         # read all system relevant configuration files
         self.SystemConfig = System(os.path.join(configPath, 'System.ini'))
@@ -53,6 +55,7 @@ class AMAN:
         self.Weather = Weather(self.SystemConfig.Weather)
         self.Receiver = Euroscope(configPath, self.SystemConfig.Server, self)
 
+        self.acquireLock()
 
         # find the airport configurations and create the workers
         airportsPath = os.path.join(os.path.join(configPath, 'airports'), '*.ini')
@@ -67,15 +70,41 @@ class AMAN:
             self.Workers.append(worker)
             print('Started worker for ' + icao)
 
+        self.releaseLock()
 
+        # initialize the random number generator
+        random.seed(time.time())
 
+    def acquireLock(self):
+        if None != self.WorkersLock:
+            self.WorkersLock.acquire()
 
+    def releaseLock(self):
+        if None != self.WorkersLock:
+            self.WorkersLock.release()
 
     def updateAircraftReport(self, report : AircraftReport_pb2.AircraftReport):
+        self.acquireLock()
+
         # find the correct worker for the inbound
         for worker in self.Workers:
             if worker.Icao == report.destination:
                 worker.acquireLock()
                 worker.ReportQueue[report.aircraft.callsign] = report
                 worker.releaseLock()
-                break
+                break
+
+        self.releaseLock()
+
+    def findAirport(self, icao : str):
+        self.acquireLock()
+
+        airport = None
+        for worker in self.Workers:
+            if icao == worker.Icao:
+                airport = worker
+                break
+
+        self.releaseLock()
+
+        return airport