Add a lock around the delayed loading, so two threads won't try to do it

* providers/imap/camel-imap-wrapper.c: Add a lock around the
	delayed loading, so two threads won't try to do it at the same
	time.

svn path=/trunk/; revision=7752
This commit is contained in:
Dan Winship
2001-01-23 20:34:50 +00:00
parent 4028f454b6
commit 5d7f815b3e
4 changed files with 46 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2001-01-23 Dan Winship <danw@ximian.com>
* providers/imap/camel-imap-wrapper.c: Add a lock around the
delayed loading, so two threads won't try to do it at the same
time.
2001-01-22 Dan Winship <danw@ximian.com>
* providers/vee/camel-vee-folder.c (camel_vee_folder_new): Set the

View File

@ -66,6 +66,20 @@ struct _CamelImapFolderPrivate {
#define CAMEL_IMAP_FOLDER_UNLOCK(f, l)
#endif
struct _CamelImapWrapperPrivate {
#ifdef ENABLE_THREADS
GMutex *lock;
#endif
};
#ifdef ENABLE_THREADS
#define CAMEL_IMAP_WRAPPER_LOCK(f, l) (g_mutex_lock(((CamelImapWrapper *)f)->priv->l))
#define CAMEL_IMAP_WRAPPER_UNLOCK(f, l) (g_mutex_unlock(((CamelImapWrapper *)f)->priv->l))
#else
#define CAMEL_IMAP_WRAPPER_LOCK(f, l)
#define CAMEL_IMAP_WRAPPER_UNLOCK(f, l)
#endif
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -71,6 +71,22 @@ camel_imap_wrapper_finalize (CamelObject *object)
g_free (imap_wrapper->uid);
if (imap_wrapper->part)
g_free (imap_wrapper->part_spec);
#ifdef ENABLE_THREADS
g_mutex_free (imap_wrapper->priv->lock);
#endif
g_free (imap_wrapper->priv);
}
static void
camel_imap_wrapper_init (gpointer object, gpointer klass)
{
CamelImapWrapper *imap_wrapper = CAMEL_IMAP_WRAPPER (object);
imap_wrapper->priv = g_new0 (struct _CamelImapWrapperPrivate, 1);
#ifdef ENABLE_THREADS
imap_wrapper->priv->lock = g_mutex_new ();
#endif
}
CamelType
@ -85,7 +101,7 @@ camel_imap_wrapper_get_type (void)
sizeof (CamelImapWrapperClass),
(CamelObjectClassInitFunc) camel_imap_wrapper_class_init,
NULL,
NULL,
(CamelObjectInitFunc) camel_imap_wrapper_init,
(CamelObjectFinalizeFunc) camel_imap_wrapper_finalize);
}
@ -106,8 +122,11 @@ write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
char *result, *p, *body;
int len;
if (!data_wrapper->offline)
CAMEL_IMAP_WRAPPER_LOCK (imap_wrapper, lock);
if (!data_wrapper->offline) {
CAMEL_IMAP_WRAPPER_UNLOCK (imap_wrapper, lock);
return parent_class->write_to_stream (data_wrapper, stream);
}
store = CAMEL_IMAP_STORE (imap_wrapper->folder->parent_store);
CAMEL_IMAP_STORE_LOCK (store, command_lock);
@ -180,9 +199,12 @@ write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream)
g_free (imap_wrapper->part_spec);
imap_wrapper->part = NULL;
CAMEL_IMAP_WRAPPER_UNLOCK (imap_wrapper, lock);
return parent_class->write_to_stream (data_wrapper, stream);
lose:
CAMEL_IMAP_WRAPPER_UNLOCK (imap_wrapper, lock);
errno = ENETUNREACH;
return -1;
}

View File

@ -41,6 +41,8 @@ typedef struct
{
CamelDataWrapper parent_object;
struct _CamelImapWrapperPrivate *priv;
CamelFolder *folder;
char *uid, *part_spec;
CamelMimePart *part;