[nanny/win32: 49/75] Create PyroBlockingCallFromThread



commit 99e6727d90a74a5919ae4f824c87b0ef03d4cec9
Author: Roberto Majadas <roberto majadas openshine com>
Date:   Tue Sep 28 02:57:08 2010 +0200

    Create PyroBlockingCallFromThread

 daemon/src/NannyPyroBus.py |   65 +++++++++++++++++++++++++++++---------------
 1 files changed, 43 insertions(+), 22 deletions(-)
---
diff --git a/daemon/src/NannyPyroBus.py b/daemon/src/NannyPyroBus.py
index 0ee5bfb..2ce3571 100644
--- a/daemon/src/NannyPyroBus.py
+++ b/daemon/src/NannyPyroBus.py
@@ -21,10 +21,30 @@
 # USA
 
 from twisted.internet import threads, reactor, defer
+from twisted.python import failure
 import Pyro.core
 import threading
 import time
+import Queue
 
+from threading import Semaphore
+
+
+def PyroBlockingCallFromThread(reactor, f, *a, **kw):
+    queue = Queue.Queue()
+    se = Semaphore(1)
+
+    def _callFromThread():
+        if se._Semaphore__value == 1 :
+            se.acquire()
+        else:
+            return 
+        result = f(*a, **kw)
+        queue.put(result)
+
+    reactor.callFromThread(_callFromThread)
+    result = queue.get()
+    return result
 
 class OrgGnomeNanny(Pyro.core.ObjBase):
     def __init__(self, quarterback):
@@ -40,26 +60,26 @@ class OrgGnomeNanny(Pyro.core.ObjBase):
         return True
 
     def ListUsers(self):
-        return threads.blockingCallFromThread(reactor, self.quarterback.usersmanager.get_users)
+        return PyroBlockingCallFromThread(reactor, self.quarterback.usersmanager.get_users)
 
     def SetBlocks(self, user_id, app_id, blocks):
-        threads.blockingCallFromThread(reactor, self.quarterback.set_blocks, str(user_id), int(app_id), blocks)
+        PyroBlockingCallFromThread(reactor, self.quarterback.set_blocks, str(user_id), int(app_id), blocks)
         return True
 
     def GetBlocks(self, user_id, app_id) :
-        return threads.blockingCallFromThread(reactor, self.quarterback.get_blocks, user_id, app_id)
+        return PyroBlockingCallFromThread(reactor, self.quarterback.get_blocks, user_id, app_id)
 
     def SetActiveWCF(self, active, uid):
-        threads.blockingCallFromThread(reactor, self.quarterback.set_wcf, bool(active), str(uid))
+        PyroBlockingCallFromThread(reactor, self.quarterback.set_wcf, bool(active), str(uid))
 
     def ListWCF(self):
-        return threads.blockingCallFromThread(reactor, self.quarterback.list_wcf_uids)
+        return PyroBlockingCallFromThread(reactor, self.quarterback.list_wcf_uids)
 
     def SetMaxUseTime(self, user_id, app_id, mins):
-        threads.blockingCallFromThread(reactor, self.quarterback.set_max_use_time, str(user_id), int(app_id), int(mins))
+        PyroBlockingCallFromThread(reactor, self.quarterback.set_max_use_time, str(user_id), int(app_id), int(mins))
 
     def GetMaxUseTime(self, user_id, app_id):
-        return threads.blockingCallFromThread(reactor, self.quarterback.get_max_use_time , user_id, app_id)
+        return PyroBlockingCallFromThread(reactor, self.quarterback.get_max_use_time , user_id, app_id)
     
     # FIXME : Singal
     #def UpdateUsersInfo(self):
@@ -114,41 +134,42 @@ class OrgGnomeNannyWebDatabase(Pyro.core.ObjBase):
         self.quarterback = quarterback
         
     def AddCustomFilter(self, uid, is_black, name, description, regex):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.add_custom_filter, str(uid), bool(is_black), unicode(name),
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.add_custom_filter, str(uid), bool(is_black), unicode(name),
                                               unicode(description), unicode(regex))
 
     def ListCustomFilters(self, uid):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.list_custom_filters, int(uid))
-    
+        ret = PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.list_custom_filters, int(uid))
+        return ret
+
     def RemoveCustomFilter(self, list_id):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.remove_custom_filter, int(list_id))
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.remove_custom_filter, int(list_id))
 
     def UpdateCustomFilter(self, list_id, name, description, regex):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.update_custom_filter, int(list_id),
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.update_custom_filter, int(list_id),
                                               unicode(name),
                                               unicode(description),
                                               unicode(regex))
     
     def AddPkgFilter(self, path):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.add_pkg_filter, str(path))
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.add_pkg_filter, str(path))
     
     def RemovePkgFilter(self, pkg_id):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.remove_pkg_filter, str(pkg_id))
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.remove_pkg_filter, str(pkg_id))
 
     def UpdatePkgFilter(self, pkg_id, new_db_path):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.update_pkg_filter, str(pkg_id), str (new_db_path))
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.update_pkg_filter, str(pkg_id), str (new_db_path))
 
     def ListPkgFilters(self):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.list_pkg_filter)
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.list_pkg_filter)
 
     def GetPkgFilterMetadata(self, pkg_id):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.get_pkg_filter_metadata, str(pkg_id))
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.get_pkg_filter_metadata, str(pkg_id))
 
     def SetPkgFilterMetadata(self, pkg_id, name, description):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.set_pkg_filter_metadata, str(pkg_id), unicode(name), unicode(description))
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.set_pkg_filter_metadata, str(pkg_id), unicode(name), unicode(description))
 
     def GetPkgFilterUserCategories(self, pkg_id, uid):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.get_pkg_filter_user_categories, unicode(pkg_id),
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.get_pkg_filter_user_categories, unicode(pkg_id),
                                               str(uid)
                                               )
 
@@ -157,15 +178,15 @@ class OrgGnomeNannyWebDatabase(Pyro.core.ObjBase):
         for x in list_categories :
             list_c.append(unicode(x))
             
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.set_pkg_filter_user_categories, unicode(pkg_id),
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.set_pkg_filter_user_categories, unicode(pkg_id),
                                               str(uid),
                                               list_c)
 
     def CheckDomain(self, uid, domain):
-        return threads.blockingCallFromThread(reactor, self.quarterback.filter_manager.check_domain, uid, domain)
+        return PyroBlockingCallFromThread(reactor, self.quarterback.filter_manager.check_domain, uid, domain)
 
     def AddDansGuardianList(self, uid, name, description, list_url):
-        return threads.blockingCallFromThread(reactor, self.quarterback.webcontent_filter.webdb.add_dans_guardian_list, str(uid),
+        return PyroBlockingCallFromThread(reactor, self.quarterback.webcontent_filter.webdb.add_dans_guardian_list, str(uid),
                                               unicode(name),
                                               unicode(description),
                                               unicode(list_url))



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]