[pan2] use save_server_info with g_idle_add in threads to avoid race conditions



commit e0d530b11a0d30ab4c71b6259494ca4ea9f14ae4
Author: Heinrich MÃller <henmull src gnome org>
Date:   Sun Apr 22 19:49:16 2012 +0200

    use save_server_info with g_idle_add in threads to avoid race conditions

 pan/data/cert-store.cc |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)
---
diff --git a/pan/data/cert-store.cc b/pan/data/cert-store.cc
index 081aea5..cbfbfc2 100644
--- a/pan/data/cert-store.cc
+++ b/pan/data/cert-store.cc
@@ -58,6 +58,22 @@ using namespace pan;
 namespace pan
 {
 
+  struct SaveCBStruct
+  {
+    CertStore& cs;
+    Data& data;
+    const Quark& server;
+    SaveCBStruct(CertStore& store, const Quark& s, Data& d) : cs(store), server(s), data(d) {}
+  };
+
+  gboolean
+  save_server_props_cb (gpointer gp)
+  {
+    SaveCBStruct*  data (static_cast<SaveCBStruct*>(gp));
+    data->data.save_server_info(data->server);
+    return false;
+  }
+
   int
   verify_callback(gnutls_session_t session)
   {
@@ -206,7 +222,8 @@ namespace pan
     fail:
       s->cert.clear();
       gnutls_x509_crt_deinit (cert);
-      _data.save_server_info(server);
+      SaveCBStruct cbstruct(*this, server, _data);
+      g_idle_add (save_server_props_cb, &cbstruct);
 
     return false;
 
@@ -328,7 +345,8 @@ namespace pan
 
     _data.set_server_cert(server, buf);
 
-    _data.save_server_info(server);
+    SaveCBStruct cbstruct(*this, server, _data);
+    g_idle_add (save_server_props_cb, &cbstruct);
 
     FILE * fp = fopen(buf, "wb");
     if (!fp) return false;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]