diff options
Diffstat (limited to 'mail')
| -rw-r--r-- | mail/src/leap/mail/mail.py | 31 | 
1 files changed, 20 insertions, 11 deletions
| diff --git a/mail/src/leap/mail/mail.py b/mail/src/leap/mail/mail.py index c0e16a6..b9c97f6 100644 --- a/mail/src/leap/mail/mail.py +++ b/mail/src/leap/mail/mail.py @@ -29,6 +29,8 @@ import StringIO  import time  import weakref +from collections import defaultdict +  from twisted.internet import defer  from twisted.python import log @@ -924,19 +926,25 @@ class Account(object):      adaptor_class = SoledadMailAdaptor +    # this is a defaultdict, indexed by userid, that returns a +    # WeakValueDictionary mapping to collection instances so that we always +    # return a reference to them instead of creating new ones. however, +    # being a dictionary of weakrefs values, they automagically vanish +    # from the dict when no hard refs is left to them (so they can be +    # garbage collected) this is important because the different wrappers +    # rely on several kinds of deferredlocks that are kept as class or +    # instance variables. + +    # We need it to be a class property because we create more than one Account +    # object in the current usage pattern (ie, one in the mail service, and +    # another one in the IncomingMailService). When we move to a proper service +    # tree we can let it be an instance attribute. +    _collection_mapping = defaultdict(weakref.WeakValueDictionary) +      def __init__(self, store, ready_cb=None):          self.store = store          self.adaptor = self.adaptor_class() -        # this is a mapping to collection instances so that we always -        # return a reference to them instead of creating new ones. however, -        # being a dictionary of weakrefs values, they automagically vanish -        # from the dict when no hard refs is left to them (so they can be -        # garbage collected) this is important because the different wrappers -        # rely on several kinds of deferredlocks that are kept as class or -        # instance variables -        self._collection_mapping = weakref.WeakValueDictionary() -          self.mbox_indexer = MailboxIndexer(self.store)          # This flag is only used from the imap service for the moment. @@ -1069,7 +1077,8 @@ class Account(object):          :rtype: deferred          :return: a deferred that will fire with a MessageCollection          """ -        collection = self._collection_mapping.get(name, None) +        collection = self._collection_mapping[self.store.userid].get( +            name, None)          if collection:              return defer.succeed(collection) @@ -1077,7 +1086,7 @@ class Account(object):          def get_collection_for_mailbox(mbox_wrapper):              collection = MessageCollection(                  self.adaptor, self.store, self.mbox_indexer, mbox_wrapper) -            self._collection_mapping[name] = collection +            self._collection_mapping[self.store.userid][name] = collection              return collection          d = self.adaptor.get_or_create_mbox(self.store, name) | 
