Signed-off-by: Nicolas Sebrecht <[email protected]>
---
 offlineimap/folder/UIDMaps.py | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/offlineimap/folder/UIDMaps.py b/offlineimap/folder/UIDMaps.py
index 038284c..980adfb 100644
--- a/offlineimap/folder/UIDMaps.py
+++ b/offlineimap/folder/UIDMaps.py
@@ -78,10 +78,19 @@ class MappedIMAPFolder(IMAPFolder):
 
     def _savemaps(self):
         mapfilename = self._getmapfilename()
-        with open(mapfilename + ".tmp", 'wt') as mapfilefd:
-            for (key, value) in self.diskl2r.items():
-                mapfilefd.write("%d:%d\n"% (key, value))
-        os.rename(mapfilename + '.tmp', mapfilename)
+        mapfilenamelock = "%s.lock"% mapfilename
+        with open(mapfilenamelock, 'w') as mapfilelock:
+            # The "account" lock already prevents from multiple access by
+            # different processes. However, we still need to protect for
+            # multiple access from different threads.
+            try:
+                fnctl.lockf(mapfilelock, fnctl.LOCK_EX) # Blocks until 
acquired.
+            except NameError:
+                pass # Windows...
+            with open(mapfilename, 'wt') as mapfilefd:
+                for (key, value) in self.diskl2r.items():
+                    mapfilefd.write("%d:%d\n"% (key, value))
+            # The lock is released when the file descriptor ends.
 
     def _uidlist(self, mapping, items):
         try:
-- 
2.7.4


_______________________________________________
OfflineIMAP-project mailing list: [email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/offlineimap-project

OfflineIMAP homepages:
- https://github.com/OfflineIMAP
- http://offlineimap.org

Reply via email to