aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-service.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@HelixCode.com>2000-12-24 08:46:20 +0800
committerMichael Zucci <zucchi@src.gnome.org>2000-12-24 08:46:20 +0800
commit6de256c2a2b23f30d35e4a2213ad5839bf141d06 (patch)
treea34d8be64c0718070c4e1ea9548282912f37b387 /camel/camel-service.c
parent6183d89039ba67a7f3869f460c13aff09a548471 (diff)
downloadgsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar
gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.gz
gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.bz2
gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.lz
gsoc2013-evolution-6de256c2a2b23f30d35e4a2213ad5839bf141d06.tar.xz
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.c66
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