diff options
author | Milan Crha <mcrha@redhat.com> | 2013-01-11 12:28:11 +0100 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2013-01-11 12:28:11 +0100 |
commit | a4027fc3df6a5db454c87792078d459f8d12d014 (patch) | |
tree | 2ed61a4a88543a4cbf3ea02adcbbe065538b203b | |
parent | aa7d79d6432503787a1ba72a50d54529543225f5 (diff) | |
download | evolution-data-server-a4027fc3df6a5db454c87792078d459f8d12d014.tar.gz |
Bug #690151 - Crash in e_book_backend_file_bump_revision()
-rw-r--r-- | addressbook/backends/file/e-book-backend-file.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/addressbook/backends/file/e-book-backend-file.c b/addressbook/backends/file/e-book-backend-file.c index 16d269b46..b0213f95e 100644 --- a/addressbook/backends/file/e-book-backend-file.c +++ b/addressbook/backends/file/e-book-backend-file.c @@ -72,6 +72,7 @@ struct _EBookBackendFilePrivate { gchar *photo_dirname; gchar *revision; gint rev_counter; + GRecMutex revision_mutex; DB *file_db; DB_ENV *env; @@ -794,6 +795,8 @@ e_book_backend_file_bump_revision (EBookBackendFile *bf) DBT revision_name_dbt, revision_dbt; gint db_error; + g_rec_mutex_lock (&bf->priv->revision_mutex); + g_free (bf->priv->revision); bf->priv->revision = e_book_backend_file_new_revision (bf); @@ -809,6 +812,8 @@ e_book_backend_file_bump_revision (EBookBackendFile *bf) e_book_backend_notify_property_changed (E_BOOK_BACKEND (bf), BOOK_BACKEND_PROPERTY_REVISION, bf->priv->revision); + + g_rec_mutex_unlock (&bf->priv->revision_mutex); } static void @@ -818,6 +823,8 @@ e_book_backend_file_load_revision (EBookBackendFile *bf) DBT version_name_dbt, version_dbt; gint db_error; + g_rec_mutex_lock (&bf->priv->revision_mutex); + string_to_dbt (E_BOOK_BACKEND_FILE_REVISION_NAME, &version_name_dbt); memset (&version_dbt, 0, sizeof (version_dbt)); version_dbt.flags = DB_DBT_MALLOC; @@ -831,6 +838,8 @@ e_book_backend_file_load_revision (EBookBackendFile *bf) /* key was not in file */ bf->priv->revision = e_book_backend_file_new_revision (bf); } + + g_rec_mutex_unlock (&bf->priv->revision_mutex); } static void @@ -2156,9 +2165,11 @@ e_book_backend_file_open (EBookBackendSync *backend, e_book_backend_notify_readonly (E_BOOK_BACKEND (backend), readonly); e_book_backend_notify_opened (E_BOOK_BACKEND (backend), NULL /* Success */); + g_rec_mutex_lock (&bf->priv->revision_mutex); e_book_backend_notify_property_changed (E_BOOK_BACKEND (backend), BOOK_BACKEND_PROPERTY_REVISION, bf->priv->revision); + g_rec_mutex_unlock (&bf->priv->revision_mutex); } static gboolean @@ -2193,7 +2204,9 @@ e_book_backend_file_get_backend_property (EBookBackendSync *backend, } else if (g_str_equal (prop_name, BOOK_BACKEND_PROPERTY_SUPPORTED_AUTH_METHODS)) { *prop_value = NULL; } else if (g_str_equal (prop_name, BOOK_BACKEND_PROPERTY_REVISION)) { + g_rec_mutex_lock (&bf->priv->revision_mutex); *prop_value = g_strdup (bf->priv->revision); + g_rec_mutex_unlock (&bf->priv->revision_mutex); } else { processed = FALSE; } @@ -2323,6 +2336,7 @@ e_book_backend_file_finalize (GObject *object) g_free (priv->dirname); g_free (priv->photo_dirname); g_free (priv->revision); + g_rec_mutex_clear (&priv->revision_mutex); /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_book_backend_file_parent_class)->finalize (object); @@ -2423,6 +2437,8 @@ e_book_backend_file_init (EBookBackendFile *backend) { backend->priv = E_BOOK_BACKEND_FILE_GET_PRIVATE (backend); + g_rec_mutex_init (&backend->priv->revision_mutex); + g_signal_connect ( backend, "notify::online", G_CALLBACK (e_book_backend_file_notify_online_cb), NULL); |