Use mail_map copies for all complex ops
authorAndre Heinecke <aheinecke@intevation.de>
Mon, 8 Oct 2018 13:23:16 +0000 (15:23 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Mon, 8 Oct 2018 13:23:16 +0000 (15:23 +0200)
* src/mail.cpp (Mail::revertAllMails_o, Mail::wipeAllMails_o),
(Mail::closeAllMails_o): Use copy of the mail map.

--
For any complex operation we can't hold the lock of the
map for the operation as the map might be modified / accessed
from a different thread to complete the operation.

It should not be a big problem with these functions.

src/mail.cpp

index 82c9259..b50cf3d 100644 (file)
@@ -1800,7 +1800,9 @@ Mail::revertAllMails_o ()
   int err = 0;
   std::map<LPDISPATCH, Mail *>::iterator it;
   gpgrt_lock_lock (&mail_map_lock);
-  for (it = s_mail_map.begin(); it != s_mail_map.end(); ++it)
+  auto mail_map_copy = s_mail_map;
+  gpgrt_lock_unlock (&mail_map_lock);
+  for (it = mail_map_copy.begin(); it != mail_map_copy.end(); ++it)
     {
       if (it->second->revert_o ())
         {
@@ -1817,7 +1819,6 @@ Mail::revertAllMails_o ()
           continue;
         }
     }
-  gpgrt_lock_unlock (&mail_map_lock);
   TRETURN err;
 }
 
@@ -1828,7 +1829,9 @@ Mail::wipeAllMails_o ()
   int err = 0;
   std::map<LPDISPATCH, Mail *>::iterator it;
   gpgrt_lock_lock (&mail_map_lock);
-  for (it = s_mail_map.begin(); it != s_mail_map.end(); ++it)
+  auto mail_map_copy = s_mail_map;
+  gpgrt_lock_unlock (&mail_map_lock);
+  for (it = mail_map_copy.begin(); it != mail_map_copy.end(); ++it)
     {
       if (it->second->wipe_o ())
         {
@@ -1836,7 +1839,6 @@ Mail::wipeAllMails_o ()
           err++;
         }
     }
-  gpgrt_lock_unlock (&mail_map_lock);
   TRETURN err;
 }