diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/acit/imap_pool.py | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/acit/imap_pool.py b/src/acit/imap_pool.py index af541dd..c592225 100644 --- a/src/acit/imap_pool.py +++ b/src/acit/imap_pool.py @@ -5,7 +5,7 @@ from imaplib import IMAP4 from imap_tools import MailBox -from threading import Event, RLock +from threading import Event, RLock, current_thread class PoolEmpty(Exception): @@ -53,6 +53,7 @@ class MailBoxPool(): self.errors=[] self.initalised=Event() + self.holding_threads=[] self.lock=RLock() self.boxreturned=Event() @@ -88,13 +89,14 @@ class MailBoxPool(): #self.log("Waiting for lock") with self.lock: toremove=[] - for mb in self.pool+self.taken: + for mb in self.pool: + self.log(mb) if not self.is_alive(mb): toremove.append(mb) for mb in toremove: try: - mb.logout() # logout if needed + MailBox.logout(mb) # logout if needed except: pass if mb in self.pool: self.pool.remove(mb) @@ -126,9 +128,7 @@ class MailBoxPool(): "Gets a new mailbox from the pool" self.initalised.wait() while True: - #self.log("Waiting for lock (available=%d,taken=%d)"%(len(self.pool),len(self.taken))) # NOTE:testlog with self.lock: - #self.log("Aquired") # NOTE:testlog if self.get_pool_size()<1: raise PoolEmpty("No connections in pool!") self.ensure_all_connections() @@ -136,31 +136,32 @@ class MailBoxPool(): self.boxreturned.clear() mb=self.pool.pop(0) self.taken.append(mb) + self.holding_threads.append(current_thread()) return mb - #self.log("No boxes") # NOTE:testlog self.boxreturned.wait() def release(self,mb:PooledMailBox): "Returns a mailbox back to the pool. Please use a context manager instead of manually releasing." self.initalised.wait() - #self.log("Waiting for lock, trying to release a connection") # NOTE:testlog with self.lock: - #self.log("Aquired") # NOTE:testlog if mb in self.taken: self.taken.remove(mb) + self.holding_threads.remove(current_thread()) self.pool.append(mb) self.boxreturned.set() def close(self): "Closes all the mailboxes" self.initalised.set() # to force an exit wherever possible + self.n=0 # make sure no new mailboxes get created while len(self.pool)+len(self.taken)>0: with self.lock: while len(self.pool)>0: mb=self.pool.pop(0) MailBox.logout(mb) # pass it this way bc we overwrite logout() - self.boxreturned.wait(.5) + self.log("Threads still holding a MailBox:",", ".join([thread.name for thread in self.holding_threads])) + self.boxreturned.wait() |
