From 782fb8d66aabb29d68712e2fc220d967ef8dfcf5 Mon Sep 17 00:00:00 2001
From: Kali Kaneko <kali@leap.se>
Date: Fri, 16 Jan 2015 20:03:11 -0400
Subject: remove use of threading.Condition

we should deal with this with pure deferreds
---
 src/leap/bitmask/backend/components.py           | 13 +++++++------
 src/leap/bitmask/services/mail/imapcontroller.py | 17 ++++++-----------
 2 files changed, 13 insertions(+), 17 deletions(-)

(limited to 'src')

diff --git a/src/leap/bitmask/backend/components.py b/src/leap/bitmask/backend/components.py
index 8ed43364..2ae796f6 100644
--- a/src/leap/bitmask/backend/components.py
+++ b/src/leap/bitmask/backend/components.py
@@ -17,13 +17,16 @@
 """
 Backend components
 """
+
+# TODO [ ] Get rid of all this deferToThread mess, or at least contain
+#          all of it into its own threadpool.
+
 import logging
 import os
 import socket
 import time
 
 from functools import partial
-from threading import Condition
 
 from twisted.internet import threads, defer
 from twisted.python import log
@@ -1038,12 +1041,10 @@ class Mail(object):
         """
         Stop imap and wait until the service is stopped to signal that is done.
         """
-        cv = Condition()
-        cv.acquire()
-        threads.deferToThread(self._imap_controller.stop_imap_service, cv)
+        # FIXME just get a fucking deferred and signal as a callback, with
+        # timeout and cancellability
+        threads.deferToThread(self._imap_controller.stop_imap_service)
         logger.debug('Waiting for imap service to stop.')
-        cv.wait(self.SERVICE_STOP_TIMEOUT)
-        logger.debug('IMAP stopped')
         self._signaler.signal(self._signaler.imap_stopped)
 
     def stop_imap_service(self):
diff --git a/src/leap/bitmask/services/mail/imapcontroller.py b/src/leap/bitmask/services/mail/imapcontroller.py
index bb9eb9dc..1b39ef91 100644
--- a/src/leap/bitmask/services/mail/imapcontroller.py
+++ b/src/leap/bitmask/services/mail/imapcontroller.py
@@ -84,16 +84,16 @@ class IMAPController(object):
             d.addCallback(assign_incoming_service)
             d.addErrback(lambda f: logger.error(f.printTraceback()))
 
-    def stop_imap_service(self, cv):
+    def stop_imap_service(self):
         """
         Stop IMAP service (fetcher, factory and port).
-
-        :param cv: A condition variable to which we can signal when imap
-                   indeed stops.
-        :type cv: threading.Condition
         """
         if self.incoming_mail_service is not None:
             # Stop the loop call in the fetcher
+
+            # XXX BUG -- the deletion of the reference should be made
+            # after stopService() triggers its deferred (ie, cleanup has been
+            # made)
             self.incoming_mail_service.stopService()
             self.incoming_mail_service = None
 
@@ -103,12 +103,7 @@ class IMAPController(object):
 
             # Stop the protocol
             self.imap_factory.theAccount.closed = True
-            self.imap_factory.doStop(cv)
-        else:
-            # Release the condition variable so the caller doesn't have to wait
-            cv.acquire()
-            cv.notify()
-            cv.release()
+            self.imap_factory.doStop()
 
     def fetch_incoming_mail(self):
         """
-- 
cgit v1.2.3