diff options
author | Not Zed <NotZed@HelixCode.com> | 2000-12-24 08:46:20 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2000-12-24 08:46:20 +0800 |
commit | 6de256c2a2b23f30d35e4a2213ad5839bf141d06 (patch) | |
tree | a34d8be64c0718070c4e1ea9548282912f37b387 /camel/camel-service.c | |
parent | 6183d89039ba67a7f3869f460c13aff09a548471 (diff) | |
download | gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.gz gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.zst gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.zip |
Lock the command channel while searching. (imap_body_contains): If
2000-12-24 Not Zed <NotZed@HelixCode.com>
* providers/imap/camel-imap-search.c (imap_body_contains): Lock
the command channel while searching.
(imap_body_contains): If performing a whole uid search, then add
references to our own summary items, dont look it up in the
folder. This way they can't vanish unexpectedly.
* providers/imap/camel-imap-folder.h (CamelImapFolder): Added a
private field.
* providers/imap/camel-imap-private.h: Added lock for imap
searches.
* Merge from camel-mt-branch.
* providers/imap/camel-imap-folder.c (imap_update_summary): Merge
fix, use the folder->summary.
(imap_get_message_flags, imap_set_message_flags,
imap_get_message_user_flag, imap_set_message_user_flag): Removed
again.
(camel_imap_folder_init): Setup private data/lock.
(imap_finalize): Free private data/search lock.
(imap_search_free): Lock the search_lock.
(imap_search_by_expression): Lock the search lock when using the
search object. Also copy/ref hte summary, rather than getting it
directly.
(imap_refresh_info): Free any info lookups. Use folder->summary
not imap_folder->summary. And lock around commands.
svn path=/trunk/; revision=7150
Diffstat (limited to 'camel/camel-service.c')
-rw-r--r-- | camel/camel-service.c | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/camel/camel-service.c b/camel/camel-service.c index 0fcb61fa52..6a14327b92 100644 --- a/camel/camel-service.c +++ b/camel/camel-service.c @@ -31,6 +31,8 @@ #include <ctype.h> #include <stdlib.h> +#include "camel-private.h" + static CamelObjectClass *parent_class = NULL; /* Returns the class for a CamelService */ @@ -64,6 +66,17 @@ camel_service_class_init (CamelServiceClass *camel_service_class) } static void +camel_service_init (void *o, void *k) +{ + CamelService *service = o; + + service->priv = g_malloc0(sizeof(*service->priv)); +#ifdef ENABLE_THREADS + service->priv->connect_lock = e_mutex_new(E_MUTEX_REC); +#endif +} + +static void camel_service_finalize (CamelObject *object) { CamelService *camel_service = CAMEL_SERVICE (object); @@ -85,6 +98,11 @@ camel_service_finalize (CamelObject *object) camel_url_free (camel_service->url); if (camel_service->session) camel_object_unref (CAMEL_OBJECT (camel_service->session)); + +#ifdef ENABLE_THREADS + e_mutex_destroy(camel_service->priv->connect_lock); +#endif + g_free(camel_service->priv); } @@ -100,7 +118,7 @@ camel_service_get_type (void) sizeof (CamelServiceClass), (CamelObjectClassInitFunc) camel_service_class_init, NULL, - NULL, + (CamelObjectInitFunc) camel_service_init, camel_service_finalize ); } @@ -209,24 +227,28 @@ service_connect (CamelService *service, CamelException *ex) gboolean camel_service_connect (CamelService *service, CamelException *ex) { + gboolean ret = FALSE; + g_return_val_if_fail (CAMEL_IS_SERVICE (service), FALSE); g_return_val_if_fail (service->session != NULL, FALSE); g_return_val_if_fail (service->url != NULL, FALSE); + CAMEL_SERVICE_LOCK(service, connect_lock); + if (service->connected) { /* But we're still connected, so no exception * and return true. */ g_warning ("camel_service_connect: trying to connect to an already connected service"); - return TRUE; - } - - if (CSERV_CLASS (service)->connect (service, ex)) { + ret = TRUE; + } else if (CSERV_CLASS (service)->connect (service, ex)) { service->connected = TRUE; - return TRUE; + ret = TRUE; } - return FALSE; + CAMEL_SERVICE_UNLOCK(service, connect_lock); + + return ret; } static gboolean @@ -257,13 +279,17 @@ gboolean camel_service_disconnect (CamelService *service, gboolean clean, CamelException *ex) { - gboolean res; + gboolean res = TRUE; - if (!service->connected) - return TRUE; + CAMEL_SERVICE_LOCK(service, connect_lock); + + if (service->connected) { + res = CSERV_CLASS (service)->disconnect (service, clean, ex); + service->connected = FALSE; + } + + CAMEL_SERVICE_UNLOCK(service, connect_lock); - res = CSERV_CLASS (service)->disconnect (service, clean, ex); - service->connected = FALSE; return res; } @@ -431,10 +457,20 @@ query_auth_types_func (CamelService *service, CamelException *ex) GList * camel_service_query_auth_types (CamelService *service, CamelException *ex) { + GList *ret; + + /* note that we get the connect lock here, which means the callee + must not call the connect functions itself */ + CAMEL_SERVICE_LOCK(service, connect_lock); + if (service->url->empty) - return CSERV_CLASS (service)->query_auth_types_generic (service, ex); + ret = CSERV_CLASS (service)->query_auth_types_generic (service, ex); else - return CSERV_CLASS (service)->query_auth_types_connected (service, ex); + ret = CSERV_CLASS (service)->query_auth_types_connected (service, ex); + + CAMEL_SERVICE_UNLOCK(service, connect_lock); + + return ret; } static void @@ -475,6 +511,8 @@ camel_service_gethost (CamelService *service, CamelException *ex) struct hostent *h; char *hostname; +#warning "This needs to use gethostbyname_r()" + if (service->url->host) hostname = service->url->host; else |