From 94b4b58931fd9f29700a89f526ed8b4b65df9d23 Mon Sep 17 00:00:00 2001 From: "Bjarni R. Einarsson" Date: Sun, 28 Jul 2019 00:17:44 +0000 Subject: [PATCH] Avoid deadlock in IMAP IDLE, fix buglet in thread name logic --- mailpile/mail_source/__init__.py | 2 +- mailpile/mail_source/imap.py | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/mailpile/mail_source/__init__.py b/mailpile/mail_source/__init__.py index 4af8ab73a..562583d88 100644 --- a/mailpile/mail_source/__init__.py +++ b/mailpile/mail_source/__init__.py @@ -263,6 +263,7 @@ def sync_mail(self): batch = min(self._loop_count * 20, self.RESCAN_BATCH_SIZE) errors = rescanned = 0 all_completed = True + ostate = self._state if not self._check_interrupt(clear=False): self._state = 'Waiting... (disco)' @@ -270,7 +271,6 @@ def sync_mail(self): else: discovered = 0 - ostate = self._state plan = self._sorted_mailboxes() self.event.data['plan'] = [[m._key, _('Pending'), m.name] for m in plan] event_plan = dict((mp[0], mp) for mp in self.event.data['plan']) diff --git a/mailpile/mail_source/imap.py b/mailpile/mail_source/imap.py index 78c2065a9..f5b736a8f 100644 --- a/mailpile/mail_source/imap.py +++ b/mailpile/mail_source/imap.py @@ -334,6 +334,7 @@ def get_line(): raise self._conn.abort('socket error: %s' % val) def quit(self): + self._can_idle = False with self._lock: try: if self._conn and self._conn.file: @@ -907,13 +908,6 @@ def logged_in_cb(conn, ev, capabilities): if self.conn is not None: raise IOError('Woah, we lost a race.') self.capabilities = capabilities - if 'IDLE' in capabilities: - self.conn = SharedImapConn( - self.session, conn, - idle_mailbox='INBOX', - idle_callback=self._idle_callback) - else: - self.conn = SharedImapConn(self.session, conn) if 'NAMESPACE' in capabilities: ok, data = self.timed_imap(conn.namespace) @@ -925,6 +919,14 @@ def logged_in_cb(conn, ev, capabilities): 'shared': shr if (shr != 'NIL') else [] } + if 'IDLE' in capabilities: + self.conn = SharedImapConn( + self.session, conn, + idle_mailbox='INBOX', + idle_callback=self._idle_callback) + else: + self.conn = SharedImapConn(self.session, conn) + if self.event: self._log_status(_('Connected to IMAP server %s' ) % my_config.host)