aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-vfolder.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/mail-vfolder.c')
-rw-r--r--mail/mail-vfolder.c56
1 files changed, 26 insertions, 30 deletions
diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c
index b20cc266f2..1612b283c2 100644
--- a/mail/mail-vfolder.c
+++ b/mail/mail-vfolder.c
@@ -21,7 +21,6 @@
*/
#include <config.h>
-#include <pthread.h>
#include <string.h>
#include <glib.h>
@@ -59,7 +58,7 @@ static EMVFolderContext *context; /* context remains open all time */
CamelStore *vfolder_store; /* the 1 static vfolder store */
/* lock for accessing shared resources (below) */
-static pthread_mutex_t vfolder_lock = PTHREAD_MUTEX_INITIALIZER;
+G_LOCK_DEFINE_STATIC (vfolder);
static GList *source_folders_remote; /* list of source folder uri's - remote ones */
static GList *source_folders_local; /* list of source folder uri's - local ones */
@@ -72,9 +71,6 @@ extern CamelSession *session;
static void rule_changed(FilterRule *rule, CamelFolder *folder);
-#define LOCK() pthread_mutex_lock(&vfolder_lock);
-#define UNLOCK() pthread_mutex_unlock(&vfolder_lock);
-
/* ********************************************************************** */
struct _setup_msg {
@@ -449,7 +445,7 @@ mail_vfolder_add_uri(CamelStore *store, const gchar *curi, gint remove)
is_ignore = uri_is_ignore(store, curi);
- LOCK();
+ G_LOCK (vfolder);
/* d(printf("%s uri to check: %s\n", remove?"Removing":"Adding", uri)); */
@@ -519,7 +515,7 @@ mail_vfolder_add_uri(CamelStore *store, const gchar *curi, gint remove)
}
done:
- UNLOCK();
+ G_UNLOCK (vfolder);
if (folders != NULL)
vfolder_adduri(curi, folders, remove);
@@ -549,7 +545,7 @@ mail_vfolder_delete_uri(CamelStore *store, const gchar *curi)
changed = g_string_new ("");
- LOCK();
+ G_LOCK (vfolder);
if (context == NULL)
goto done;
@@ -597,7 +593,7 @@ done:
source_folders_local = g_list_remove_link(source_folders_local, link);
}
- UNLOCK();
+ G_UNLOCK (vfolder);
if (changed->str[0]) {
GtkWidget *dialog;
@@ -638,7 +634,7 @@ mail_vfolder_rename_uri(CamelStore *store, const gchar *cfrom, const gchar *cto)
from = em_uri_from_camel(cfrom);
to = em_uri_from_camel(cto);
- LOCK();
+ G_LOCK (vfolder);
/* see if any rules directly reference this removed uri */
rule = NULL;
@@ -668,7 +664,7 @@ mail_vfolder_rename_uri(CamelStore *store, const gchar *cfrom, const gchar *cto)
}
}
- UNLOCK();
+ G_UNLOCK (vfolder);
if (changed) {
const gchar *data_dir;
@@ -738,15 +734,15 @@ rule_changed(FilterRule *rule, CamelFolder *folder)
gpointer key;
gpointer oldfolder;
- LOCK();
+ G_LOCK (vfolder);
d(printf("Changing folder name in hash table to '%s'\n", rule->name));
if (g_hash_table_lookup_extended (vfolder_hash, folder->full_name, &key, &oldfolder)) {
g_hash_table_remove (vfolder_hash, key);
g_free (key);
g_hash_table_insert (vfolder_hash, g_strdup(rule->name), folder);
- UNLOCK();
+ G_UNLOCK (vfolder);
} else {
- UNLOCK();
+ G_UNLOCK (vfolder);
g_warning("couldn't find a vfolder rule in our table? %s", folder->full_name);
}
@@ -761,12 +757,12 @@ rule_changed(FilterRule *rule, CamelFolder *folder)
/* find any (currently available) folders, and add them to the ones to open */
rule_add_sources(((EMVFolderRule *)rule)->sources, &sources_folder, &sources_uri);
- LOCK();
+ G_LOCK (vfolder);
if (((EMVFolderRule *)rule)->with == EM_VFOLDER_RULE_WITH_LOCAL || ((EMVFolderRule *)rule)->with == EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE)
rule_add_sources(source_folders_local, &sources_folder, &sources_uri);
if (((EMVFolderRule *)rule)->with == EM_VFOLDER_RULE_WITH_REMOTE_ACTIVE || ((EMVFolderRule *)rule)->with == EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE)
rule_add_sources(source_folders_remote, &sources_folder, &sources_uri);
- UNLOCK();
+ G_UNLOCK (vfolder);
query = g_string_new("");
filter_rule_build_code(rule, query);
@@ -787,9 +783,9 @@ static void context_rule_added(RuleContext *ctx, FilterRule *rule)
if (folder) {
g_signal_connect(rule, "changed", G_CALLBACK(rule_changed), folder);
- LOCK();
+ G_LOCK (vfolder);
g_hash_table_insert(vfolder_hash, g_strdup(rule->name), folder);
- UNLOCK();
+ G_UNLOCK (vfolder);
rule_changed(rule, folder);
}
@@ -803,12 +799,12 @@ static void context_rule_removed(RuleContext *ctx, FilterRule *rule)
/* TODO: remove from folder info cache? */
- LOCK();
+ G_LOCK (vfolder);
if (g_hash_table_lookup_extended (vfolder_hash, rule->name, &key, &folder)) {
g_hash_table_remove (vfolder_hash, key);
g_free (key);
}
- UNLOCK();
+ G_UNLOCK (vfolder);
camel_store_delete_folder(vfolder_store, rule->name, NULL);
/* this must be unref'd after its deleted */
@@ -839,7 +835,7 @@ store_folder_deleted(CamelObject *o, gpointer event_data, gpointer data)
/* Warning not thread safe, but might be enough */
- LOCK();
+ G_LOCK (vfolder);
/* delete it from our list */
rule = rule_context_find_rule((RuleContext *)context, info->full_name, NULL);
@@ -861,7 +857,7 @@ store_folder_deleted(CamelObject *o, gpointer event_data, gpointer data)
g_warning("Cannot find rule for deleted vfolder '%s'", info->name);
}
- UNLOCK();
+ G_UNLOCK (vfolder);
}
static void
@@ -878,7 +874,7 @@ store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data)
d(printf("Folder renamed to '%s' from '%s'\n", info->new->full_name, info->old_base));
/* Folder is already renamed? */
- LOCK();
+ G_LOCK (vfolder);
d(printf("Changing folder name in hash table to '%s'\n", info->new->full_name));
if (g_hash_table_lookup_extended (vfolder_hash, info->old_base, &key, &folder)) {
const gchar *data_dir;
@@ -889,7 +885,7 @@ store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data)
rule = rule_context_find_rule((RuleContext *)context, info->old_base, NULL);
if (!rule) {
- UNLOCK ();
+ G_UNLOCK (vfolder);
g_warning ("Rule shouldn't be NULL\n");
return;
}
@@ -904,9 +900,9 @@ store_folder_renamed(CamelObject *o, gpointer event_data, gpointer data)
rule_context_save((RuleContext *)context, user);
g_free(user);
- UNLOCK();
+ G_UNLOCK (vfolder);
} else {
- UNLOCK();
+ G_UNLOCK (vfolder);
g_warning("couldn't find a vfolder rule in our table? %s", info->new->full_name);
}
}
@@ -915,7 +911,7 @@ void
vfolder_load_storage(void)
{
/* lock for loading storage, it is safe to call it more than once */
- static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+ G_LOCK_DEFINE_STATIC (vfolder_hash);
const gchar *data_dir;
gchar *user, *storeuri;
@@ -923,17 +919,17 @@ vfolder_load_storage(void)
gchar *xmlfile;
GConfClient *gconf;
- pthread_mutex_lock (&lock);
+ G_LOCK (vfolder_hash);
if (vfolder_hash) {
/* we have already initialized */
- pthread_mutex_unlock (&lock);
+ G_UNLOCK (vfolder_hash);
return;
}
vfolder_hash = g_hash_table_new(g_str_hash, g_str_equal);
- pthread_mutex_unlock (&lock);
+ G_UNLOCK (vfolder_hash);
/* first, create the vfolder store, and set it up */
data_dir = em_utils_get_data_dir ();