Author: remi
Date: 2009-02-10 13:30:55 +0100 (Tue, 10 Feb 2009)
New Revision: 3597

Modified:
   
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDClientController.py
Log:
* improved server stability when it freezing for many seconds

Modified: 
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDClientController.py
===================================================================
--- 
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDClientController.py
    2009-02-10 11:30:06 UTC (rev 3596)
+++ 
software_suite_v2/tuxware/pytuxisalive/trunk/src/tuxisalive/lib/httpserver/TDClientController.py
    2009-02-10 12:30:55 UTC (rev 3597)
@@ -33,47 +33,69 @@
 
 TDCC_INVALID_CLIENT                 = -1
 
-CLIENT_ACTIVITY_TIMEOUT             = 5.0
+CLIENT_ACTIVITY_TIMEOUT             = 10.0
 
 class TDClientController(object):
 
     def __init__(self):
         self.__accessController = TDAccessController()
         self.__clients = []
+        self.__clientsMutex = threading.Lock()
         self.__logger = SimpleLogger("httpserver")
         self.__logger.setLevel(LOG_LEVEL_INFO)
         self.__logger.setTarget(LOG_TARGET_BOTH)
         
     def destroy(self):
-        for client in self.__clients:
-            client.destroy()
+        clients = self.getClientsList()
+        for client in clients:
+            try:
+                client.destroy()
+            except:
+                pass
+            
+    def getClientsList(self):
+        self.__clientsMutex.acquire()
+        clients = copy.copy(self.__clients)
+        self.__clientsMutex.release()
+        return clients
         
+    def setClientsList(self):
+        self.__clientsMutex.acquire()
+        self.__clients = copy.copy(clients)
+        self.__clientsMutex.release()
+        
     def clientExists(self, idClient):
-        for client in self.__clients:
-            if client.getId() == idClient:
-                return True
+        clients = self.getClientsList()
+        for client in clients:
+            try:
+                if client.getId() == idClient:
+                    return True
+            except:
+                pass
         
         return False
         
     def getClient(self, idClient):
         if self.clientExists(idClient):
-            for client in self.__clients:
-                if client.getId() == idClient:
-                    return client
+            clients = self.getClientsList()
+            for client in clients:
+                try:
+                    if client.getId() == idClient:
+                        return client
+                except:
+                    pass
         else:
             return None
             
-    def getClients(self):
-        result = []
-        for client in self.__clients:
-            result.append(client)
+    def getClients(self):  
+        return getClientsList()
             
-        return result
-            
     def __createClient(self, id, level, name, passwd):
         newClient = TDClientObject(id, level, self.__accessController,
                             name, passwd)
+        self.__clientsMutex.acquire()
         self.__clients.append(newClient)
+        self.__clientsMutex.release()
             
     def createClient(self, clientLevel, name, passwd):
         newId = TDCC_INVALID_CLIENT
@@ -112,25 +134,42 @@
     def destroyClient(self, clientId):
         if self.clientExists(clientId):
             client = self.getClient(clientId)
-            client.destroy()
+            try:
+                client.destroy()
+            except:
+                pass
+            self.__clientsMutex.acquire()
             self.__clients.remove(client)
+            self.__clientsMutex.release()
             self.__logger.logInfo("Client (%d) was destroyed." % clientId)
             
     def refreshClientsTable(self):
         clientsToDestroy = []
-        for client in self.__clients:
-            if not client.checkActivity():
-                clientsToDestroy.append(client)
+        clients = self.getClientsList()
+        for client in clients:
+            try:
+                if not client.checkActivity():
+                    clientsToDestroy.append(client)
+            except:
+                pass
         for client in clientsToDestroy:
             self.destroyClient(client.getId())
             
     def pushUserEvents(self, events = []):
-        for client in self.__clients:
-            client.pushUserEvents(events)
+        clients = self.getClientsList()
+        for client in clients:
+            try:
+                client.pushUserEvents(events)
+            except:
+                pass
             
     def pushMiscEvents(self, events = []):
-        for client in self.__clients:
-            client.pushMiscEvents(events)
+        clients = self.getClientsList()
+        for client in clients:
+            try:
+                client.pushMiscEvents(events)
+            except:
+                pass
         self.refreshClientsTable()
 
 class TDClientObject(object):


------------------------------------------------------------------------------
Create and Deploy Rich Internet Apps outside the browser with Adobe(R)AIR(TM)
software. With Adobe AIR, Ajax developers can use existing skills and code to
build responsive, highly engaging applications that combine the power of local
resources and data with the reach of the web. Download the Adobe AIR SDK and
Ajax docs to start building applications today-http://p.sf.net/sfu/adobe-com
_______________________________________________
Tux-droid-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tux-droid-svn

Reply via email to