evolution/evolution-2.8.1-kill-ethread.patch
Matthew Barnes ad2b69c948 - Add patch for Gnome.org bug #356177 (deprecate EMutex).
- Add patch for Gnome.org bug #363695 (deprecate EStrv/EPoolv).
- Disable patch for RH bug #202751 (unwanted side-effects).
2006-10-27 22:27:55 +00:00

2004 lines
59 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--- evolution-2.9.1/mail/mail-send-recv.c.kill-ethread 2006-10-26 14:24:06.000000000 -0400
+++ evolution-2.9.1/mail/mail-send-recv.c 2006-10-26 14:24:55.000000000 -0400
@@ -817,7 +817,7 @@
m->folders = folders;
m->info = sinfo;
- e_thread_put(mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
} else {
receive_done ("", data);
}
--- evolution-2.9.1/mail/mail-component.c.kill-ethread 2006-09-04 06:36:49.000000000 -0400
+++ evolution-2.9.1/mail/mail-component.c 2006-10-26 14:24:55.000000000 -0400
@@ -964,7 +964,7 @@
if (camel_url_get_param(url, "uid") != NULL) {
char *curi = em_uri_to_camel(uri);
- mail_get_folder(curi, 0, handleuri_got_folder, url, mail_thread_new);
+ mail_get_folder(curi, 0, handleuri_got_folder, url, mail_msg_unordered_push);
g_free(curi);
} else {
g_warning("email uri's must include a uid parameter");
--- evolution-2.9.1/mail/mail-ops.c.kill-ethread 2006-10-26 14:24:06.000000000 -0400
+++ evolution-2.9.1/mail/mail-ops.c 2006-10-26 14:24:55.000000000 -0400
@@ -221,7 +221,7 @@
camel_filter_driver_remove_rule_by_name (m->driver, "new-mail-notification");
}
- e_thread_put (mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
/* convenience functions for it */
@@ -426,7 +426,7 @@
if (status)
camel_filter_driver_set_status_func (fm->driver, status, status_data);
- e_thread_put (mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
/* ********************************************************************** */
@@ -839,7 +839,7 @@
m->driver = camel_session_get_filter_driver (session, type, NULL);
camel_filter_driver_set_folder_func (m->driver, get_folder, get_data);
- e_thread_put(mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
/* ** APPEND MESSAGE TO FOLDER ******************************************** */
@@ -921,7 +921,7 @@
m->done = done;
m->data = data;
- e_thread_put (mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
/* ** TRANSFER MESSAGES **************************************************** */
@@ -1036,7 +1036,7 @@
m->done = done;
m->data = data;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
}
/* ** SCAN SUBFOLDERS ***************************************************** */
@@ -1124,7 +1124,7 @@
m->data = data;
id = m->msg.seq;
- e_thread_put(mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return id;
}
@@ -1250,7 +1250,7 @@
int
mail_get_folder (const char *uri, guint32 flags,
void (*done)(char *uri, CamelFolder *folder, void *data),
- void *data, EThread *thread)
+ void *data, MailMsgDispatchFunc dispatch)
{
struct _get_folder_msg *m;
int id;
@@ -1262,7 +1262,7 @@
m->done = done;
id = m->msg.seq;
- e_thread_put(thread, (EMsg *)m);
+ dispatch ((mail_msg_t *) m);
return id;
}
@@ -1340,7 +1340,7 @@
m->done = done;
id = m->msg.seq;
- e_thread_put (mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return id;
}
@@ -1437,7 +1437,7 @@
m->data = data;
m->done = done;
- e_thread_put (mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
/* ** SYNC FOLDER ********************************************************* */
@@ -1498,7 +1498,7 @@
m->data = data;
m->done = done;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
}
/* ** SYNC STORE ********************************************************* */
@@ -1568,7 +1568,7 @@
m->data = data;
m->done = done;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
}
/* ******************************************************************************** */
@@ -1604,7 +1604,7 @@
m->data = data;
m->done = done;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
}
/* ******************************************************************************** */
@@ -1640,7 +1640,7 @@
m->data = data;
m->done = done;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
}
/* ******************************************************************************** */
@@ -1723,7 +1723,7 @@
m->data = data;
m->done = done;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
}
/* ** GET MESSAGE(s) ***************************************************** */
@@ -1783,7 +1783,7 @@
void
mail_get_message(CamelFolder *folder, const char *uid, void (*done) (CamelFolder *folder, const char *uid,
CamelMimeMessage *msg, void *data),
- void *data, EThread *thread)
+ void *data, MailMsgDispatchFunc dispatch)
{
struct _get_message_msg *m;
@@ -1795,7 +1795,7 @@
m->done = (void (*) (CamelFolder *, const char *, CamelMimeMessage *, void *)) done;
m->cancel = camel_operation_new(NULL, NULL);
- e_thread_put(thread, (EMsg *)m);
+ dispatch ((mail_msg_t *) m);
}
typedef void (*get_done)(CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *);
@@ -1821,7 +1821,7 @@
mail_get_message; it adds an exception argument to the callback */
void
mail_get_messagex(CamelFolder *folder, const char *uid, void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
- void *data, EThread *thread)
+ void *data, MailMsgDispatchFunc dispatch)
{
struct _get_message_msg *m;
@@ -1833,7 +1833,7 @@
m->done = (void (*) (CamelFolder *, const char *, CamelMimeMessage *, void *)) done;
m->cancel = camel_operation_new(NULL, NULL);
- e_thread_put(thread, (EMsg *)m);
+ dispatch ((mail_msg_t *) m);
}
/* ********************************************************************** */
@@ -1920,7 +1920,7 @@
m->data = data;
m->done = done;
- e_thread_put(mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
/* ** SAVE MESSAGES ******************************************************* */
@@ -2063,7 +2063,7 @@
m->done = done;
id = m->msg.seq;
- e_thread_put(mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return id;
}
@@ -2156,7 +2156,7 @@
m->readonly = readonly;
id = m->msg.seq;
- e_thread_put (mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return id;
}
@@ -2240,7 +2240,7 @@
m->data = data;
m->done = done;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
}
/* ** GO OFFLINE ***************************************************** */
@@ -2345,7 +2345,7 @@
m->done = done;
id = m->msg.seq;
- e_thread_put(mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return id;
}
@@ -2433,7 +2433,7 @@
m->data = data;
id = m->msg.seq;
- e_thread_put(mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return id;
}
--- evolution-2.9.1/mail/em-folder-utils.c.kill-ethread 2006-02-08 06:51:32.000000000 -0500
+++ evolution-2.9.1/mail/em-folder-utils.c 2006-10-26 14:24:55.000000000 -0400
@@ -260,7 +260,7 @@
m->delete = delete;
seq = m->msg.seq;
- e_thread_put (mail_thread_new, (EMsg *) m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return seq;
}
@@ -652,7 +652,7 @@
g_free (namebuf);
id = m->msg.seq;
- e_thread_put (mail_thread_new, (EMsg *) m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return id;
}
--- evolution-2.9.1/mail/importers/elm-importer.c.kill-ethread 2005-12-17 13:35:37.000000000 -0500
+++ evolution-2.9.1/mail/importers/elm-importer.c 2006-10-26 14:24:55.000000000 -0400
@@ -312,7 +312,7 @@
id = m->msg.seq;
- e_thread_put(mail_thread_queued, (EMsg *)m);
+ mail_msg_fast_ordered_push ((mail_msg_t *) m);
return id;
}
--- evolution-2.9.1/mail/importers/mail-importer.c.kill-ethread 2006-02-08 06:51:32.000000000 -0500
+++ evolution-2.9.1/mail/importers/mail-importer.c 2006-10-26 14:24:55.000000000 -0400
@@ -329,7 +329,7 @@
}
id = m->msg.seq;
- e_thread_put(mail_thread_queued, (EMsg *)m);
+ mail_msg_fast_ordered_push ((mail_msg_t *) m);
return id;
}
--- evolution-2.9.1/mail/importers/pine-importer.c.kill-ethread 2006-02-05 18:46:26.000000000 -0500
+++ evolution-2.9.1/mail/importers/pine-importer.c 2006-10-26 14:24:56.000000000 -0400
@@ -350,7 +350,7 @@
id = m->msg.seq;
- e_thread_put(mail_thread_queued, (EMsg *)m);
+ mail_msg_fast_ordered_push ((mail_msg_t *) m);
return id;
}
--- evolution-2.9.1/mail/mail-vfolder.c.kill-ethread 2006-06-30 05:46:26.000000000 -0400
+++ evolution-2.9.1/mail/mail-vfolder.c 2006-10-26 14:24:55.000000000 -0400
@@ -188,7 +188,7 @@
m->sources_folder = sources_folder;
id = m->msg.seq;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
return id;
}
@@ -323,7 +323,7 @@
m->remove = remove;
id = m->msg.seq;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
return id;
}
@@ -447,7 +447,7 @@
return;
}
- g_assert(pthread_equal(pthread_self(), mail_gui_thread));
+ g_assert(mail_in_main_thread());
is_ignore = uri_is_ignore(store, curi);
@@ -540,7 +540,7 @@
d(printf ("Deleting uri to check: %s\n", uri));
- g_assert (pthread_equal(pthread_self(), mail_gui_thread));
+ g_assert (mail_in_main_thread());
changed = g_string_new ("");
@@ -615,7 +615,7 @@
if (context == NULL || uri_is_spethal(store, cfrom) || uri_is_spethal(store, cto))
return;
- g_assert(pthread_equal(pthread_self(), mail_gui_thread));
+ g_assert(mail_in_main_thread());
from = em_uri_from_camel(cfrom);
to = em_uri_from_camel(cto);
--- evolution-2.9.1/mail/em-format-html.c.kill-ethread 2006-10-26 14:24:06.000000000 -0400
+++ evolution-2.9.1/mail/em-format-html.c 2006-10-26 14:24:55.000000000 -0400
@@ -1374,7 +1374,7 @@
}
efh->priv->format_id = m->msg.seq;
- e_thread_put(mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
efh->priv->format_timeout_id = 0;
--- evolution-2.9.1/mail/em-folder-properties.c.kill-ethread 2006-02-23 08:26:41.000000000 -0500
+++ evolution-2.9.1/mail/em-folder-properties.c 2006-10-26 14:24:55.000000000 -0400
@@ -379,7 +379,7 @@
}
if (folder == NULL)
- mail_get_folder(uri, 0, emfp_dialog_got_folder, NULL, mail_thread_new);
+ mail_get_folder(uri, 0, emfp_dialog_got_folder, NULL, mail_msg_unordered_push);
else
emfp_dialog_got_folder((char *)uri, folder, NULL);
}
--- evolution-2.9.1/mail/em-folder-tree.c.kill-ethread 2006-08-07 14:55:02.000000000 -0400
+++ evolution-2.9.1/mail/em-folder-tree.c 2006-10-26 14:24:55.000000000 -0400
@@ -966,7 +966,7 @@
tree_drag_data_action(struct _DragDataReceivedAsync *m)
{
m->move = m->action == GDK_ACTION_MOVE;
- e_thread_put (mail_thread_new, (EMsg *) m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
static void
@@ -1891,7 +1891,7 @@
m->top = full_name;
m->flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE|CAMEL_STORE_FOLDER_INFO_FAST;
- e_thread_put (mail_thread_new, (EMsg *) m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
static gboolean
--- evolution-2.9.1/mail/em-folder-browser.c.kill-ethread 2006-10-26 14:24:06.000000000 -0400
+++ evolution-2.9.1/mail/em-folder-browser.c 2006-10-26 14:24:55.000000000 -0400
@@ -950,7 +950,7 @@
m->sources_folder = sources_folder;
id = m->msg.seq;
- e_thread_put(mail_thread_queued_slow, (EMsg *)m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
return id;
}
--- evolution-2.9.1/mail/message-list.c.kill-ethread 2006-10-26 14:24:06.000000000 -0400
+++ evolution-2.9.1/mail/message-list.c 2006-10-26 14:24:55.000000000 -0400
@@ -1855,7 +1855,7 @@
ml_drop_action(struct _drop_msg *m)
{
m->move = m->action == GDK_ACTION_MOVE;
- e_thread_put (mail_thread_new, (EMsg *) m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
}
static void
@@ -3875,7 +3875,7 @@
m->ml->regen = g_list_prepend(m->ml->regen, m);
/* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */
- e_thread_put (mail_thread_queued, (EMsg *)m);
+ mail_msg_fast_ordered_push ((mail_msg_t *) m);
m->ml->regen_timeout_msg = NULL;
m->ml->regen_timeout_id = 0;
--- evolution-2.9.1/mail/em-format-html-print.c.kill-ethread 2005-05-19 02:46:23.000000000 -0400
+++ evolution-2.9.1/mail/em-format-html-print.c 2006-10-26 14:24:55.000000000 -0400
@@ -228,7 +228,7 @@
g_object_ref(source);
g_object_ref(efhp);
- mail_get_message(folder, uid, emfhp_got_message, efhp, mail_thread_new);
+ mail_get_message(folder, uid, emfhp_got_message, efhp, mail_msg_unordered_push);
return 0; /* damn async ... */
}
--- evolution-2.9.1/mail/em-sync-stream.c.kill-ethread 2005-12-21 09:10:25.000000000 -0500
+++ evolution-2.9.1/mail/em-sync-stream.c 2006-10-26 14:24:55.000000000 -0400
@@ -267,7 +267,7 @@
if (emss->cancel)
return -1;
- if (pthread_equal(pthread_self(), mail_gui_thread)) {
+ if (mail_in_main_thread ()) {
EMSS_CLASS(emss)->sync_write(stream, buffer, n);
#ifdef LOG_STREAM
if (p->logfd)
@@ -297,7 +297,7 @@
if (emss->cancel)
return -1;
- if (pthread_equal(pthread_self(), mail_gui_thread))
+ if (mail_in_main_thread ())
return ((EMSyncStreamClass *)(((CamelObject *)emss)->klass))->sync_flush(stream);
else
sync_op(emss, EMSS_FLUSH, NULL, 0);
@@ -315,7 +315,7 @@
d(printf("%p: closing stream\n", stream));
- if (pthread_equal(pthread_self(), mail_gui_thread)) {
+ if (mail_in_main_thread ()) {
#ifdef LOG_STREAM
if (emss->priv->logfd) {
fclose(emss->priv->logfd);
--- evolution-2.9.1/mail/em-subscribe-editor.c.kill-ethread 2006-07-24 05:01:30.000000000 -0400
+++ evolution-2.9.1/mail/em-subscribe-editor.c 2006-10-26 14:24:55.000000000 -0400
@@ -229,7 +229,7 @@
next = (struct _zsubscribe_msg *)e_dlist_remhead(&m->sub->subscribe);
if (next) {
next->sub->subscribe_id = next->msg.seq;
- e_thread_put(mail_thread_new, (EMsg *)next);
+ mail_msg_unordered_push ((mail_msg_t *) next);
} else {
/* should it go off the model instead? */
sub_selection_changed(gtk_tree_view_get_selection(m->sub->tree), m->sub);
@@ -270,7 +270,7 @@
if (sub->subscribe_id == -1) {
sub->subscribe_id = id;
d(printf("running subscribe folder '%s'\n", spath));
- e_thread_put (mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
} else {
d(printf("queueing subscribe folder '%s'\n", spath));
e_dlist_addtail(&sub->subscribe, (EDListNode *)m);
@@ -420,7 +420,7 @@
id = m->msg.seq;
- e_thread_put (mail_thread_new, (EMsg *)m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return id;
}
--- evolution-2.9.1/mail/mail-mt.h.kill-ethread 2006-10-16 10:37:09.000000000 -0400
+++ evolution-2.9.1/mail/mail-mt.h 2006-10-26 14:24:55.000000000 -0400
@@ -33,6 +33,7 @@
EMsg msg; /* parent type */
struct _mail_msg_op *ops; /* operation functions */
unsigned int seq; /* seq number for synchronisation */
+ gint priority; /* priority (default = 0) */
CamelOperation *cancel; /* a cancellation/status handle */
CamelException ex; /* an initialised camel exception, upto the caller to use this */
struct _mail_msg_priv *priv; /* private for internal use */
@@ -51,6 +52,8 @@
void mail_msg_init(void);
void mail_msg_cleanup (void);
+gboolean mail_in_main_thread (void);
+
/* allocate a new message */
void *mail_msg_new(mail_msg_op_t *ops, EMsgPort *reply_port, size_t size);
void mail_msg_free(void *msg);
@@ -60,6 +63,14 @@
void mail_msg_wait_all(void);
int mail_msg_active(unsigned int msgid);
+/* dispatch a message */
+void mail_msg_main_loop_push (mail_msg_t *msg);
+void mail_msg_unordered_push (mail_msg_t *msg);
+void mail_msg_fast_ordered_push (mail_msg_t *msg);
+void mail_msg_slow_ordered_push (mail_msg_t *msg);
+
+typedef void (*MailMsgDispatchFunc) (mail_msg_t *msg);
+
/* To implement the stop button */
void *mail_cancel_hook_add(GDestroyNotify func, void *data);
void mail_cancel_hook_remove(void *handle);
@@ -112,24 +123,6 @@
void mail_enable_stop(void);
void mail_disable_stop(void);
-/* a message port that receives messages in the gui thread, used for sending port */
-extern EMsgPort *mail_gui_port;
-/* a message port that receives messages in the gui thread, used for the reply port */
-extern EMsgPort *mail_gui_reply_port;
-
-/* some globally available threads */
-#ifndef G_OS_WIN32
-extern EThread *mail_thread_queued; /* for operations that can (or should) be queued */
-#else
-EThread *mail_win32_get_mail_thread_queued (void);
-#define mail_thread_queued mail_win32_get_mail_thread_queued ()
-#endif
-extern EThread *mail_thread_new; /* for operations that should run in a new thread each time */
-extern EThread *mail_thread_queued_slow; /* for operations that can (or should) be queued, but take a long time */
-
-/* The main thread. */
-extern pthread_t mail_gui_thread;
-
/* A generic proxy event for anything that can be proxied during the life of the mailer (almost nothing) */
/* Note that almost all objects care about the lifecycle of their events, so this cannot be used */
extern MailAsyncEvent *mail_async_event;
--- evolution-2.9.1/mail/mail-ops.h.kill-ethread 2006-02-20 11:01:01.000000000 -0500
+++ evolution-2.9.1/mail/mail-ops.h 2006-10-26 14:24:55.000000000 -0400
@@ -30,6 +30,8 @@
#pragma }
#endif /* __cplusplus */
+#include "mail-mt.h"
+
#include "camel/camel-store.h"
#include "camel/camel-folder.h"
#include "camel/camel-filter-driver.h"
@@ -55,12 +57,12 @@
void mail_get_message (CamelFolder *folder, const char *uid,
void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data),
void *data,
- EThread *thread);
+ MailMsgDispatchFunc dispatch);
void
mail_get_messagex(CamelFolder *folder, const char *uid,
void (*done) (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data, CamelException *),
- void *data, EThread *thread);
+ void *data, MailMsgDispatchFunc dispatch);
/* get several messages */
void mail_get_messages (CamelFolder *folder, GPtrArray *uids,
@@ -70,7 +72,7 @@
/* same for a folder */
int mail_get_folder (const char *uri, guint32 flags,
void (*done) (char *uri, CamelFolder *folder, void *data), void *data,
- EThread *thread);
+ MailMsgDispatchFunc dispatch);
/* and for a store */
int mail_get_store (const char *uri, CamelOperation *op,
--- evolution-2.9.1/mail/em-composer-utils.c.kill-ethread 2006-04-18 16:56:36.000000000 -0400
+++ evolution-2.9.1/mail/em-composer-utils.c 2006-10-26 14:24:55.000000000 -0400
@@ -534,7 +534,7 @@
strcmp (account->drafts_folder_uri, default_drafts_folder_uri) != 0) {
int id;
- id = mail_get_folder (account->drafts_folder_uri, 0, save_draft_folder, &folder, mail_thread_new);
+ id = mail_get_folder (account->drafts_folder_uri, 0, save_draft_folder, &folder, mail_msg_unordered_push);
mail_msg_wait (id);
if (!folder || !account->enabled) {
@@ -1085,7 +1085,7 @@
g_return_if_fail (CAMEL_IS_FOLDER (folder));
g_return_if_fail (uid != NULL);
- mail_get_message (folder, uid, redirect_msg, NULL, mail_thread_new);
+ mail_get_message (folder, uid, redirect_msg, NULL, mail_msg_unordered_push);
}
static void
@@ -1116,7 +1116,7 @@
}
if (msg == NULL) {
- mail_get_messagex(folder, uid, emu_handle_receipt_message, NULL, mail_thread_new);
+ mail_get_messagex(folder, uid, emu_handle_receipt_message, NULL, mail_msg_unordered_push);
camel_message_info_free(info);
return;
}
@@ -1916,7 +1916,7 @@
rd->source = source;
if (rd->source)
g_object_ref(rd->source);
- mail_get_message(folder, uid, reply_to_message, rd, mail_thread_new);
+ mail_get_message(folder, uid, reply_to_message, rd, mail_msg_unordered_push);
return;
}
@@ -2088,5 +2088,5 @@
g_return_if_fail (CAMEL_IS_FOLDER (folder));
g_return_if_fail (uid != NULL);
- mail_get_message (folder, uid, post_reply_to_message, NULL, mail_thread_new);
+ mail_get_message (folder, uid, post_reply_to_message, NULL, mail_msg_unordered_push);
}
--- evolution-2.9.1/mail/mail-folder-cache.c.kill-ethread 2006-07-26 09:19:18.000000000 -0400
+++ evolution-2.9.1/mail/mail-folder-cache.c 2006-10-26 14:24:55.000000000 -0400
@@ -907,7 +907,7 @@
m->store = store;
camel_object_ref (store);
- e_thread_put (mail_thread_queued_slow, (EMsg *) m);
+ mail_msg_slow_ordered_push ((mail_msg_t *) m);
}
static gboolean
@@ -952,7 +952,7 @@
int hook = 0;
g_assert(CAMEL_IS_STORE(store));
- g_assert(pthread_equal(pthread_self(), mail_gui_thread));
+ g_assert(mail_in_main_thread());
LOCK(info_lock);
--- evolution-2.9.1/mail/em-folder-view.c.kill-ethread 2006-10-26 14:24:06.000000000 -0400
+++ evolution-2.9.1/mail/em-folder-view.c 2006-10-26 14:24:55.000000000 -0400
@@ -693,7 +693,7 @@
static void
emfv_set_folder_uri(EMFolderView *emfv, const char *uri)
{
- mail_get_folder(uri, 0, emfv_got_folder, emfv, mail_thread_queued);
+ mail_get_folder(uri, 0, emfv_got_folder, emfv, mail_msg_fast_ordered_push);
}
static void
@@ -1588,7 +1588,7 @@
data->type = type;
data->source = source;
- mail_get_message (folder, uid, filter_type_got_message, data, mail_thread_new);
+ mail_get_message (folder, uid, filter_type_got_message, data, mail_msg_unordered_push);
}
static void
@@ -1686,7 +1686,7 @@
data->type = type;
data->uri = g_strdup (uri);
- mail_get_message (folder, uid, vfolder_type_got_message, data, mail_thread_new);
+ mail_get_message (folder, uid, vfolder_type_got_message, data, mail_msg_unordered_push);
}
static void
@@ -2335,7 +2335,7 @@
g_object_ref (emfv);
/* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */
e_profile_event_emit("goto.load", emfv->displayed_uid, 0);
- mail_get_messagex(emfv->folder, emfv->displayed_uid, emfv_list_done_message_selected, emfv, mail_thread_queued);
+ mail_get_messagex(emfv->folder, emfv->displayed_uid, emfv_list_done_message_selected, emfv, mail_msg_fast_ordered_push);
} else {
e_profile_event_emit("goto.empty", "", 0);
g_free(emfv->priv->selected_uid);
--- evolution-2.9.1/mail/mail-session.c.kill-ethread 2006-10-26 14:24:06.000000000 -0400
+++ evolution-2.9.1/mail/mail-session.c 2006-10-26 14:24:55.000000000 -0400
@@ -374,7 +374,7 @@
if (cancel)
user_message_reply = e_msgport_new ();
m = mail_msg_new (&user_message_op, user_message_reply, sizeof (*m));
- m->ismain = pthread_equal(pthread_self(), mail_gui_thread);
+ m->ismain = mail_in_main_thread();
m->type = type;
m->prompt = g_strdup(prompt);
m->allow_cancel = cancel;
@@ -382,9 +382,7 @@
if (m->ismain)
do_user_message((struct _mail_msg *)m);
else {
- extern EMsgPort *mail_gui_port2;
-
- e_msgport_put(mail_gui_port2, (EMsg *)m);
+ mail_msg_main_loop_push((mail_msg_t *) m);
}
if (cancel) {
--- evolution-2.9.1/mail/mail-mt.c.kill-ethread 2006-10-16 10:37:09.000000000 -0400
+++ evolution-2.9.1/mail/mail-mt.c 2006-10-26 14:24:55.000000000 -0400
@@ -82,12 +82,8 @@
static pthread_mutex_t mail_msg_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t mail_msg_cond = PTHREAD_COND_INITIALIZER;
-pthread_t mail_gui_thread;
-
MailAsyncEvent *mail_async_event;
-static void mail_msg_destroy(EThread *e, EMsg *msg, void *data);
-
void *mail_msg_new(mail_msg_op_t *ops, EMsgPort *reply_port, size_t size)
{
struct _mail_msg *msg;
@@ -112,7 +108,6 @@
fprintf(log, "Logging async operations\n");
if (log_locks) {
- fprintf(log, "Logging lock operations, mail_gui_thread = %" G_GINT64_MODIFIER "x\n\n", e_util_pthread_id(mail_gui_thread));
fprintf(log, "%" G_GINT64_MODIFIER "x: lock mail_msg_lock\n", e_util_pthread_id(pthread_self()));
}
} else {
@@ -308,9 +303,8 @@
void mail_msg_wait(unsigned int msgid)
{
struct _mail_msg *m;
- int ismain = pthread_equal(pthread_self(), mail_gui_thread);
- if (ismain) {
+ if (mail_in_main_thread ()) {
MAIL_MT_LOCK(mail_msg_lock);
m = g_hash_table_lookup(mail_msg_active_table, GINT_TO_POINTER(msgid));
while (m) {
@@ -347,9 +341,7 @@
void mail_msg_wait_all(void)
{
- int ismain = pthread_equal(pthread_self(), mail_gui_thread);
-
- if (ismain) {
+ if (mail_in_main_thread ()) {
MAIL_MT_LOCK(mail_msg_lock);
while (g_hash_table_size(mail_msg_active_table) > 0) {
MAIL_MT_UNLOCK(mail_msg_lock);
@@ -420,241 +412,187 @@
MAIL_MT_UNLOCK(mail_msg_lock);
}
-EMsgPort *mail_gui_port;
-static GIOChannel *mail_gui_channel;
-static guint mail_gui_watch;
-
-/* TODO: Merge these, gui_port2 doesn't do any mail_msg processing on the request (replies, forwards, frees) */
-EMsgPort *mail_gui_port2;
-static GIOChannel *mail_gui_channel2;
-static guint mail_gui_watch2;
-
-EMsgPort *mail_gui_reply_port;
-static GIOChannel *mail_gui_reply_channel;
-
-/* a couple of global threads available */
-#ifdef G_OS_WIN32
-#undef mail_thread_queued
-static
-#endif
-EThread *mail_thread_queued; /* for operations that can (or should) be queued */
-EThread *mail_thread_queued_slow; /* for operations that can (or should) be queued, but take a long time */
-EThread *mail_thread_new; /* for operations that should run in a new thread each time */
-
-#ifdef G_OS_WIN32
-EThread *
-mail_win32_get_mail_thread_queued (void)
+#define PERIODIC_RATE_HZ 10
+static guint periodic_source_id = 0;
+static GAsyncQueue *main_loop_queue = NULL;
+static GAsyncQueue *msg_reply_queue = NULL;
+static GThread *main_thread = NULL;
+
+static void
+periodic_cleanup (void)
{
- return mail_thread_queued;
+ periodic_source_id = 0;
+
+ g_assert (main_loop_queue != NULL);
+ g_async_queue_unref (main_loop_queue);
+ main_loop_queue = NULL;
+
+ g_assert (msg_reply_queue != NULL);
+ g_async_queue_unref (msg_reply_queue);
+ msg_reply_queue = NULL;
}
-#endif
static gboolean
-mail_msgport_replied(GIOChannel *source, GIOCondition cond, void *d)
+periodic_processing (void)
{
- EMsgPort *port = (EMsgPort *)d;
- mail_msg_t *m;
+ mail_msg_t *msg;
- while (( m = (mail_msg_t *)e_msgport_get(port))) {
+ g_assert (main_loop_queue != NULL);
+ g_assert (msg_reply_queue != NULL);
-#ifdef MALLOC_CHECK
- checkmem(m);
- checkmem(m->cancel);
- checkmem(m->priv);
-#endif
-
-#ifdef LOG_OPS
- if (log_ops)
- fprintf(log, "%p: Replied to GUI thread (exception `%s'\n", m,
- camel_exception_get_description(&m->ex)?camel_exception_get_description(&m->ex):"None");
-#endif
+ /* check the main loop queue */
+ while ((msg = g_async_queue_try_pop (main_loop_queue)) != NULL) {
+ if (msg->ops->receive_msg != NULL)
+ msg->ops->receive_msg (msg);
+ if (msg->msg.reply_port != NULL)
+ e_msgport_reply ((EMsg *) msg);
+ else {
+ if (msg->ops->reply_msg != NULL)
+ msg->ops->reply_msg (msg);
+ mail_msg_free (msg);
+ }
+ }
- if (m->ops->reply_msg)
- m->ops->reply_msg(m);
- mail_msg_check_error(m);
- mail_msg_free(m);
+ /* check the reply queue */
+ while ((msg = g_async_queue_try_pop (msg_reply_queue)) != NULL) {
+ if (msg->ops->reply_msg != NULL)
+ msg->ops->reply_msg (msg);
+ mail_msg_check_error (msg);
+ mail_msg_free (msg);
}
return TRUE;
}
-static gboolean
-mail_msgport_received(GIOChannel *source, GIOCondition cond, void *d)
+static void
+mail_msg_proxy (mail_msg_t *msg)
{
- EMsgPort *port = (EMsgPort *)d;
- mail_msg_t *m;
+ if (msg->ops->describe_msg != NULL) {
+ gchar *text = msg->ops->describe_msg (msg, FALSE);
+ camel_operation_register (msg->cancel);
+ camel_operation_start (msg->cancel, "%s", text);
+ g_free (text);
+ }
+
+ if (msg->ops->receive_msg != NULL) {
+ mail_enable_stop ();
+ msg->ops->receive_msg (msg);
+ mail_disable_stop ();
+ }
+
+ if (msg->ops->describe_msg != NULL) {
+ camel_operation_end (msg->cancel);
+ camel_operation_unregister (msg->cancel);
+ MAIL_MT_LOCK (mail_msg_lock);
+ camel_operation_unref (msg->cancel);
+ msg->cancel = NULL;
+ MAIL_MT_UNLOCK (mail_msg_lock);
+ }
- while (( m = (mail_msg_t *)e_msgport_get(port))) {
-#ifdef MALLOC_CHECK
- checkmem(m);
- checkmem(m->cancel);
- checkmem(m->priv);
-#endif
+ g_async_queue_push (msg_reply_queue, msg);
+}
-#ifdef LOG_OPS
- if (log_ops)
- fprintf(log, "%p: Received at GUI thread\n", m);
-#endif
+void
+mail_msg_cleanup (void)
+{
+ GSource *source;
- if (m->ops->receive_msg)
- m->ops->receive_msg(m);
- if (m->msg.reply_port)
- e_msgport_reply((EMsg *)m);
- else {
- if (m->ops->reply_msg)
- m->ops->reply_msg(m);
- mail_msg_free(m);
- }
- }
+ mail_msg_wait_all();
- return TRUE;
+ /* stop periodic processing */
+ source = g_main_context_find_source_by_id (
+ g_main_context_default (), periodic_source_id);
+ g_assert (source != NULL);
+ g_source_destroy (source);
}
-/* Test code, lighterwight, more configurable calls */
-static gboolean
-mail_msgport_received2(GIOChannel *source, GIOCondition cond, void *d)
+void
+mail_msg_init (void)
{
- EMsgPort *port = (EMsgPort *)d;
- mail_msg_t *m;
+ main_loop_queue = g_async_queue_new ();
+ msg_reply_queue = g_async_queue_new ();
- while (( m = (mail_msg_t *)e_msgport_get(port))) {
-#ifdef LOG_OPS
- if (log_ops)
- fprintf(log, "%p: Received at GUI2 thread\n", m);
-#endif
+ /* start periodic processing */
+ periodic_source_id = g_timeout_add_full (
+ G_PRIORITY_DEFAULT,
+ 1000 / PERIODIC_RATE_HZ,
+ (GSourceFunc) periodic_processing, NULL,
+ (GDestroyNotify) periodic_cleanup);
- if (m->ops->receive_msg)
- m->ops->receive_msg(m);
- else
- mail_msg_free(m);
- }
+ mail_msg_active_table = g_hash_table_new (NULL, NULL);
+ main_thread = g_thread_self ();
- return TRUE;
+ mail_async_event = mail_async_event_new ();
}
-
-static void
-mail_msg_destroy(EThread *e, EMsg *msg, void *data)
+static gint
+mail_msg_compare (const mail_msg_t *msg1, const mail_msg_t *msg2)
{
- mail_msg_t *m = (mail_msg_t *)msg;
+ gint priority1 = msg1->priority;
+ gint priority2 = msg2->priority;
-#ifdef MALLOC_CHECK
- checkmem(m);
- checkmem(m->cancel);
- checkmem(m->priv);
-#endif
+ if (priority1 == priority2)
+ return 0;
- mail_msg_free(m);
+ return (priority1 < priority2) ? 1 : -1;
}
-static void
-mail_msg_received(EThread *e, EMsg *msg, void *data)
+static gpointer
+create_thread_pool (gpointer data)
{
- mail_msg_t *m = (mail_msg_t *)msg;
+ GThreadPool *thread_pool;
+ gint max_threads = GPOINTER_TO_INT (data);
-#ifdef MALLOC_CHECK
- checkmem(m);
- checkmem(m->cancel);
- checkmem(m->priv);
-#endif
+ /* once created, run forever */
+ thread_pool = g_thread_pool_new (
+ (GFunc) mail_msg_proxy, NULL, max_threads, FALSE, NULL);
+ g_thread_pool_set_sort_function (
+ thread_pool, (GCompareDataFunc) mail_msg_compare, NULL);
- if (m->ops->describe_msg) {
- char *text = m->ops->describe_msg(m, FALSE);
+ return thread_pool;
+}
-#ifdef LOG_OPS
- if (log_ops)
- fprintf(log, "%p: Received at thread %" G_GINT64_MODIFIER "x: '%s'\n", m, e_util_pthread_id(pthread_self()), text);
-#endif
+void
+mail_msg_main_loop_push (mail_msg_t *msg)
+{
+ g_async_queue_push_sorted (main_loop_queue, msg,
+ (GCompareDataFunc) mail_msg_compare, NULL);
+}
- d(printf("message received at thread\n"));
- camel_operation_register(m->cancel);
- camel_operation_start(m->cancel, "%s", text);
- g_free(text);
- }
-#ifdef LOG_OPS
- else
- if (log_ops)
- fprintf(log, "%p: Received at thread %" G_GINT64_MODIFIER "x\n", m, e_util_pthread_id(pthread_self()));
-#endif
+void
+mail_msg_unordered_push (mail_msg_t *msg)
+{
+ static GOnce once = G_ONCE_INIT;
- if (m->ops->receive_msg) {
- mail_enable_stop();
- m->ops->receive_msg(m);
- mail_disable_stop();
- }
+ g_once (&once, (GThreadFunc) create_thread_pool, GINT_TO_POINTER (10));
- if (m->ops->describe_msg) {
- camel_operation_end(m->cancel);
- camel_operation_unregister(m->cancel);
- MAIL_MT_LOCK(mail_msg_lock);
- camel_operation_unref(m->cancel);
- m->cancel = NULL;
- MAIL_MT_UNLOCK(mail_msg_lock);
- }
+ g_thread_pool_push ((GThreadPool *) once.retval, msg, NULL);
}
-void mail_msg_cleanup(void)
+void
+mail_msg_fast_ordered_push (mail_msg_t *msg)
{
- mail_msg_wait_all();
+ static GOnce once = G_ONCE_INIT;
- e_thread_destroy(mail_thread_queued_slow);
- e_thread_destroy(mail_thread_queued);
- e_thread_destroy(mail_thread_new);
+ g_once (&once, (GThreadFunc) create_thread_pool, GINT_TO_POINTER (1));
- g_io_channel_unref(mail_gui_channel);
- g_io_channel_unref(mail_gui_reply_channel);
-
- e_msgport_destroy(mail_gui_port);
- e_msgport_destroy(mail_gui_reply_port);
+ g_thread_pool_push ((GThreadPool *) once.retval, msg, NULL);
}
-static guint
-em_channel_setup(EMsgPort **port, GIOChannel **channel, GIOFunc func)
+void
+mail_msg_slow_ordered_push (mail_msg_t *msg)
{
- GSource *source;
- guint id;
+ static GOnce once = G_ONCE_INIT;
- *port = e_msgport_new();
-#ifndef G_OS_WIN32
- *channel = g_io_channel_unix_new(e_msgport_fd(*port));
-#else
- *channel = g_io_channel_win32_new_socket(e_msgport_fd(*port));
-#endif
- source = g_io_create_watch(*channel, G_IO_IN);
- g_source_set_callback(source, (GSourceFunc)func, *port, NULL);
- g_source_set_can_recurse(source, FALSE);
- id = g_source_attach(source, NULL);
- g_source_unref(source);
+ g_once (&once, (GThreadFunc) create_thread_pool, GINT_TO_POINTER (1));
- return id;
+ g_thread_pool_push ((GThreadPool *) once.retval, msg, NULL);
}
-void mail_msg_init(void)
+gboolean
+mail_in_main_thread (void)
{
- em_channel_setup(&mail_gui_reply_port, &mail_gui_reply_channel, mail_msgport_replied);
- mail_gui_watch = em_channel_setup(&mail_gui_port, &mail_gui_channel, mail_msgport_received);
- mail_gui_watch2 = em_channel_setup(&mail_gui_port2, &mail_gui_channel2, mail_msgport_received2);
-
- mail_thread_queued = e_thread_new(E_THREAD_QUEUE);
- e_thread_set_msg_destroy(mail_thread_queued, mail_msg_destroy, 0);
- e_thread_set_msg_received(mail_thread_queued, mail_msg_received, 0);
- e_thread_set_reply_port(mail_thread_queued, mail_gui_reply_port);
-
- mail_thread_queued_slow = e_thread_new(E_THREAD_QUEUE);
- e_thread_set_msg_destroy(mail_thread_queued_slow, mail_msg_destroy, 0);
- e_thread_set_msg_received(mail_thread_queued_slow, mail_msg_received, 0);
- e_thread_set_reply_port(mail_thread_queued_slow, mail_gui_reply_port);
-
- mail_thread_new = e_thread_new(E_THREAD_NEW);
- e_thread_set_msg_destroy(mail_thread_new, mail_msg_destroy, 0);
- e_thread_set_msg_received(mail_thread_new, mail_msg_received, 0);
- e_thread_set_reply_port(mail_thread_new, mail_gui_reply_port);
- e_thread_set_queue_limit(mail_thread_new, 10);
-
- mail_msg_active_table = g_hash_table_new(NULL, NULL);
- mail_gui_thread = pthread_self();
-
- mail_async_event = mail_async_event_new();
+ return (g_thread_self () == main_thread);
}
/* ********************************************************************** */
@@ -723,7 +661,6 @@
{
struct _proxy_msg *m;
int id;
- int ismain = pthread_equal(pthread_self(), mail_gui_thread);
/* we dont have a reply port for this, we dont care when/if it gets executed, just queue it */
m = mail_msg_new(&async_event_op, NULL, sizeof(*m));
@@ -743,12 +680,12 @@
/* We use an idle function instead of our own message port only because the
gui message ports's notification buffer might overflow and deadlock us */
if (type == MAIL_ASYNC_GUI) {
- if (ismain)
+ if (mail_in_main_thread ())
g_idle_add(idle_async_event, m);
else
- e_msgport_put(mail_gui_port, (EMsg *)m);
+ mail_msg_main_loop_push((mail_msg_t *) m);
} else
- e_thread_put(mail_thread_queued, (EMsg *)m);
+ mail_msg_fast_ordered_push ((mail_msg_t *) m);
return id;
}
@@ -857,11 +794,10 @@
void *ret;
va_list ap;
EMsgPort *reply = NULL;
- int ismain = pthread_equal(pthread_self(), mail_gui_thread);
va_start(ap, func);
- if (!ismain)
+ if (!mail_in_main_thread ())
reply = e_msgport_new();
m = mail_msg_new(&mail_call_op, reply, sizeof(*m));
@@ -869,8 +805,8 @@
m->func = func;
G_VA_COPY(m->ap, ap);
- if (!ismain) {
- e_msgport_put(mail_gui_port, (EMsg *)m);
+ if (reply != NULL) {
+ mail_msg_main_loop_push((mail_msg_t *) m);
e_msgport_wait(reply);
e_msgport_destroy(reply);
} else {
@@ -909,7 +845,7 @@
busy_state++;
if (busy_state == 1) {
m = mail_msg_new(&set_busy_op, NULL, sizeof(*m));
- e_msgport_put(mail_gui_port, (EMsg *)m);
+ mail_msg_main_loop_push((mail_msg_t *) m);
}
MAIL_MT_UNLOCK(status_lock);
}
@@ -922,7 +858,7 @@
busy_state--;
if (busy_state == 0) {
m = mail_msg_new(&set_busy_op, NULL, sizeof(*m));
- e_msgport_put(mail_gui_port, (EMsg *)m);
+ mail_msg_main_loop_push((mail_msg_t *) m);
}
MAIL_MT_UNLOCK(status_lock);
}
@@ -947,7 +883,7 @@
char *out, *p, *o, c;
int pc;
- g_assert (pthread_equal(mail_gui_thread, pthread_self ()));
+ g_assert (mail_in_main_thread ());
MAIL_MT_LOCK (mail_msg_lock);
@@ -1055,7 +991,7 @@
}
m->pc = pc;
m->data = data;
- e_msgport_put(mail_gui_port, (EMsg *)m);
+ mail_msg_main_loop_push((mail_msg_t *) m);
}
/* ******************** */
--- evolution-2.9.1/plugins/folder-unsubscribe/folder-unsubscribe.c.kill-ethread 2004-10-22 15:32:26.000000000 -0400
+++ evolution-2.9.1/plugins/folder-unsubscribe/folder-unsubscribe.c 2006-10-26 14:24:56.000000000 -0400
@@ -108,5 +108,5 @@
unsub = mail_msg_new (&unsubscribe_op, NULL, sizeof (struct _folder_unsub_t));
unsub->uri = g_strdup (target->uri);
- e_thread_put (mail_thread_new, (EMsg *) unsub);
+ mail_msg_unordered_push ((mail_msg_t *) unsub);
}
--- evolution-2.9.1/plugins/mark-all-read/mark-all-read.c.kill-ethread 2005-05-19 13:32:41.000000000 -0400
+++ evolution-2.9.1/plugins/mark-all-read/mark-all-read.c 2006-10-26 14:24:56.000000000 -0400
@@ -44,7 +44,7 @@
return;
}
- mail_get_folder(t->uri, 0, mar_got_folder, NULL, mail_thread_new);
+ mail_get_folder(t->uri, 0, mar_got_folder, NULL, mail_msg_unordered_push);
}
static void
--- evolution-2.9.1/plugins/exchange-operations/exchange-folder.c.kill-ethread 2006-06-13 06:15:40.000000000 -0400
+++ evolution-2.9.1/plugins/exchange-operations/exchange-folder.c 2006-10-26 14:24:56.000000000 -0400
@@ -134,7 +134,7 @@
inbox_physical_uri = e_folder_get_physical_uri (inbox);
/* To get the CamelStore/Folder */
- mail_get_folder (inbox_physical_uri, 0, exchange_get_folder, target_uri, mail_thread_new);
+ mail_get_folder (inbox_physical_uri, 0, exchange_get_folder, target_uri, mail_msg_unordered_push);
}
--- evolution-2.9.1/plugins/save-attachments/save-attachments.c.kill-ethread 2006-07-07 19:48:24.000000000 -0400
+++ evolution-2.9.1/plugins/save-attachments/save-attachments.c 2006-10-26 14:24:56.000000000 -0400
@@ -407,5 +407,5 @@
camel_object_ref(data->folder);
data->uid = g_strdup(target->uids->pdata[0]);
- mail_get_message(data->folder, data->uid, save_got_message, data, mail_thread_new);
+ mail_get_message(data->folder, data->uid, save_got_message, data, mail_msg_unordered_push);
}
--- evolution-2.9.1/plugins/mailing-list-actions/mailing-list-actions.c.kill-ethread 2006-08-23 04:38:52.000000000 -0400
+++ evolution-2.9.1/plugins/mailing-list-actions/mailing-list-actions.c 2006-10-26 14:24:56.000000000 -0400
@@ -89,7 +89,7 @@
data->uri = strdup (sel->uri);
mail_get_message (sel->folder, (const char*) g_ptr_array_index (sel->uids, 0),
- emla_list_action_do, data, mail_thread_new);
+ emla_list_action_do, data, mail_msg_unordered_push);
}
void emla_list_action_do (CamelFolder *folder, const char *uid, CamelMimeMessage *msg, void *data)
--- evolution-2.9.1/plugins/groupwise-features/share-folder-common.c.kill-ethread 2006-02-08 06:08:24.000000000 -0500
+++ evolution-2.9.1/plugins/groupwise-features/share-folder-common.c 2006-10-26 14:24:56.000000000 -0400
@@ -239,7 +239,7 @@
m->done = done;
g_free (namebuf);
id = m->msg.seq;
- e_thread_put (mail_thread_new, (EMsg *) m);
+ mail_msg_unordered_push ((mail_msg_t *) m);
return id;
}
--- evolution-2.9.1/calendar/gui/alarm-notify/alarm-notify.h.kill-ethread 2006-04-21 15:38:16.000000000 -0400
+++ evolution-2.9.1/calendar/gui/alarm-notify/alarm-notify.h 2006-10-26 14:24:53.000000000 -0400
@@ -39,19 +39,6 @@
typedef struct _AlarmNotifyPrivate AlarmNotifyPrivate;
-typedef struct _AlarmMsg AlarmMsg;
-typedef struct _AlarmMsgPrivate AlarmMsgPrivate;
-
-struct _AlarmMsg {
- EMsg msg;
-
- void (*receive_msg)(EThread *e, struct _AlarmMsg *msg, void *data); /* message received */
- void *data;
-
- /* Private Usage */
- struct _AlarmMsgPrivate *priv;
-};
-
struct _AlarmNotify {
BonoboObject object;
--- evolution-2.9.1/calendar/gui/alarm-notify/alarm-notify.c.kill-ethread 2006-08-24 09:53:20.000000000 -0400
+++ evolution-2.9.1/calendar/gui/alarm-notify/alarm-notify.c 2006-10-26 14:24:53.000000000 -0400
@@ -45,10 +45,6 @@
GMutex *mutex;
};
-EThread *alarm_operation_thread; /* for operations that can (or should) be queued */
-EMsgPort *alarm_reply_port;
-static GIOChannel *alarm_reply_channel;
-
#define d(x) x
@@ -284,72 +280,12 @@
g_mutex_free (priv->mutex);
g_free (priv);
- e_thread_destroy(alarm_operation_thread);
- g_io_channel_unref(alarm_reply_channel);
- e_msgport_destroy(alarm_reply_port);
if (G_OBJECT_CLASS (parent_class)->finalize)
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
}
-static guint
-alarm_channel_setup(EMsgPort **port, GIOChannel **channel, GIOFunc func)
-{
- GSource *source;
- guint id;
-
- d (printf("%s:%d (alarm_channel_setup) - Channel Setup\n ", __FILE__, __LINE__));
- *port = e_msgport_new();
-#ifndef G_OS_WIN32
- *channel = g_io_channel_unix_new(e_msgport_fd(*port));
-#else
- *channel = g_io_channel_win32_new_socket(e_msgport_fd(*port));
-#endif
- source = g_io_create_watch(*channel, G_IO_IN);
- g_source_set_callback(source, (GSourceFunc)func, *port, NULL);
- g_source_set_can_recurse(source, FALSE);
- id = g_source_attach(source, NULL);
- g_source_unref(source);
-
- return id;
-}
-
-static void
-alarm_msg_destroy(EThread *e, EMsg *msg, void *data)
-{
- AlarmMsg *m = (AlarmMsg *)msg;
-
- /* Free the private */
- g_free (m->data); /* Mostly it is a structure allocated as a carrier*/
- g_free (m);
-}
-
-static gboolean
-alarm_msgport_replied(GIOChannel *source, GIOCondition cond, void *d)
-{
- EMsgPort *port = (EMsgPort *)d;
- EMsg *m;
-
- while (( m = e_msgport_get(port))) {
- d (printf("%s:%d (alarm_msgport_replied) - %p: Replied to GUI thread\n", __FILE__, __LINE__, m));
- alarm_msg_destroy(NULL, m, NULL);
- }
-
- return TRUE;
-}
-
-static void
-alarm_msg_received(EThread *e, EMsg *msg, void *data)
-{
- AlarmMsg *m = (AlarmMsg *)msg;
-
- d(printf("%s:%d (alarm_msg_received) - %p: Received at thread %" G_GINT64_MODIFIER "x\n", __FILE__, __LINE__, m, e_util_pthread_id(pthread_self())));
- if (m->receive_msg) {
- m->receive_msg (e, m, data);
- }
-}
-
/**
* alarm_notify_new:
*
@@ -361,23 +297,10 @@
AlarmNotify *
alarm_notify_new (void)
{
- AlarmNotify *an;
-
- d (printf("%s:%d (alarm_notify_new) - Alarm Notify New \n ", __FILE__, __LINE__));
-
- /* Create a thread for alarm queue operation*/
- alarm_channel_setup(&alarm_reply_port, &alarm_reply_channel, alarm_msgport_replied);
-
- alarm_operation_thread = e_thread_new(E_THREAD_QUEUE);
- e_thread_set_msg_destroy(alarm_operation_thread, alarm_msg_destroy, 0);
- e_thread_set_msg_received(alarm_operation_thread, alarm_msg_received, 0);
- e_thread_set_reply_port(alarm_operation_thread, alarm_reply_port);
-
- an = g_object_new (TYPE_ALARM_NOTIFY,
- "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_PER_REQUEST, NULL),
- NULL);
-
- return an;
+ return g_object_new (TYPE_ALARM_NOTIFY,
+ "poa", bonobo_poa_get_threaded (
+ ORBIT_THREAD_HINT_PER_REQUEST, NULL),
+ NULL);
}
static void
--- evolution-2.9.1/calendar/gui/alarm-notify/alarm-queue.c.kill-ethread 2006-08-30 10:36:04.000000000 -0400
+++ evolution-2.9.1/calendar/gui/alarm-notify/alarm-queue.c 2006-10-26 14:24:53.000000000 -0400
@@ -115,9 +115,6 @@
static int tray_blink_state = FALSE;
static AlarmNotify *an;
-/* Main Tasks thread for dealing with the global structures */
-extern EThread *alarm_operation_thread;
-
/* Structure that stores a client we are monitoring */
typedef struct {
/* Monitored client */
@@ -199,6 +196,40 @@
static void load_alarms_for_today (ClientAlarms *ca);
static void midnight_refresh_cb (gpointer alarm_id, time_t trigger, gpointer data);
+/* Simple asynchronous message dispatcher */
+
+typedef struct _Message Message;
+typedef void (*MessageFunc) (Message *msg);
+
+struct _Message {
+ MessageFunc func;
+};
+
+static void
+message_proxy (Message *msg)
+{
+ g_return_if_fail (msg->func != NULL);
+
+ msg->func (msg);
+}
+
+static gpointer
+create_thread_pool (void)
+{
+ /* once created, run forever */
+ return g_thread_pool_new ((GFunc) message_proxy, NULL, 1, FALSE, NULL);
+}
+
+static void
+message_push (Message *msg)
+{
+ static GOnce once = G_ONCE_INIT;
+
+ g_once (&once, (GThreadFunc) create_thread_pool, NULL);
+
+ g_thread_pool_push ((GThreadPool *) once.retval, msg, NULL);
+}
+
/* Queues an alarm trigger for midnight so that we can load the next day's worth
* of alarms.
*/
@@ -237,47 +268,41 @@
}
struct _midnight_refresh_msg {
+ Message header;
gboolean remove;
};
/* Loads the alarms for the new day every midnight */
static void
-midnight_refresh_async (EThread *e, AlarmMsg *msg, void *data)
+midnight_refresh_async (struct _midnight_refresh_msg *msg)
{
- struct _midnight_refresh_msg *list = msg->data;
-
d(printf("%s:%d (midnight_refresh_async) \n",__FILE__, __LINE__));
/* Re-load the alarms for all clients */
g_hash_table_foreach (client_alarms_hash, add_client_alarms_cb, NULL);
/* Re-schedule the midnight update */
- if (list->remove && midnight_refresh_id != NULL) {
+ if (msg->remove && midnight_refresh_id != NULL) {
d(printf("%s:%d (midnight_refresh_async) - Reschedule the midnight update \n",__FILE__, __LINE__));
alarm_remove (midnight_refresh_id);
midnight_refresh_id = NULL;
}
queue_midnight_refresh ();
+
+ g_slice_free (struct _midnight_refresh_msg, msg);
}
static void
midnight_refresh_cb (gpointer alarm_id, time_t trigger, gpointer data)
{
- AlarmMsg *msg;
- struct _midnight_refresh_msg *list;
-
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = midnight_refresh_async;
-
- list = malloc (sizeof (struct _midnight_refresh_msg));
+ struct _midnight_refresh_msg *msg;
- list->remove = TRUE;
- msg->data = list;
+ msg = g_slice_new (struct _midnight_refresh_msg);
+ msg->header.func = (MessageFunc) midnight_refresh_async;
+ msg->remove = TRUE;
- d(printf("%s:%d (midnight_refresh_cb) - Invoking task for midnight refresh\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ message_push ((Message *) msg);
}
/* Looks up a client in the client alarms hash table */
@@ -636,6 +661,7 @@
* alarms.
*/
struct _query_msg {
+ Message header;
ECal *client;
GList *objects;
gpointer data;
@@ -669,7 +695,7 @@
}
static void
-query_objects_changed_async (EThread *e, AlarmMsg *msg, void *data)
+query_objects_changed_async (struct _query_msg *msg)
{
ClientAlarms *ca;
time_t from, day_end;
@@ -678,13 +704,12 @@
icaltimezone *zone;
CompQueuedAlarms *cqa;
GList *l;
- struct _query_msg *list = msg->data;
ECal *client;
GList *objects;
- client = list->client;
- ca = list->data;
- objects = list->objects;
+ client = msg->client;
+ ca = msg->data;
+ objects = msg->objects;
from = config_data_get_last_notification_time ();
if (from == -1)
@@ -773,43 +798,38 @@
comp = NULL;
}
g_list_free (objects);
+
+ g_slice_free (struct _query_msg, msg);
}
static void
query_objects_changed_cb (ECal *client, GList *objects, gpointer data)
{
- AlarmMsg *msg;
- struct _query_msg *list;
+ struct _query_msg *msg;
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = query_objects_changed_async;
- list = malloc (sizeof (struct _query_msg));
- list->client = client;
- list->objects = duplicate_ical (objects);
- list->data = data;
- msg->data = list;
-
- d(printf("%s:%d (query_objects_changed_cb) - Posting a task\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ msg = g_slice_new (struct _query_msg);
+ msg->header.func = (MessageFunc) query_objects_changed_async;
+ msg->client = client;
+ msg->objects = duplicate_ical (objects);
+ msg->data = data;
+ message_push ((Message *) msg);
}
/* Called when a calendar component is removed; we must delete its corresponding
* alarms.
*/
static void
-query_objects_removed_async (EThread *e, AlarmMsg *msg, void *data)
+query_objects_removed_async (struct _query_msg *msg)
{
ClientAlarms *ca;
GList *l;
- struct _query_msg *list = msg->data;
ECal *client;
GList *objects;
- client = list->client;
- ca = list->data;
- objects = list->objects;
+ client = msg->client;
+ ca = msg->data;
+ objects = msg->objects;
d(printf("%s:%d (query_objects_removed_async) - Removing %d objects\n",__FILE__, __LINE__, g_list_length(objects)));
@@ -822,27 +842,22 @@
}
g_list_free (objects);
+
+ g_slice_free (struct _query_msg, msg);
}
static void
query_objects_removed_cb (ECal *client, GList *objects, gpointer data)
{
- AlarmMsg *msg;
- struct _query_msg *list;
-
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = query_objects_removed_async;
-
- list = malloc (sizeof (struct _query_msg));
- list->client = client;
- list->objects = duplicate_ecal (objects);
- list->data = data;
- msg->data = list;
+ struct _query_msg *msg;
- d(printf("%s:%d (query_objects_removed_cb) - Posting a task\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ msg = g_slice_new (struct _query_msg);
+ msg->header.func = (MessageFunc) query_objects_removed_async;
+ msg->client = client;
+ msg->objects = duplicate_ecal (objects);
+ msg->data = data;
+ message_push ((Message *) msg);
}
@@ -989,20 +1004,19 @@
}
static void
-on_dialog_objs_removed_async (EThread *e, AlarmMsg *msg, void *data)
+on_dialog_objs_removed_async (struct _query_msg *msg)
{
const char *our_uid;
GList *l;
TrayIconData *tray_data;
- struct _query_msg *list = msg->data;
ECal *client;
GList *objects;
d(printf("%s:%d (on_dialog_objs_removed_async)\n",__FILE__, __LINE__));
- client = list->client;
- tray_data = list->data;
- objects = list->objects;
+ client = msg->client;
+ tray_data = msg->data;
+ objects = msg->objects;
e_cal_component_get_uid (tray_data->comp, &our_uid);
g_return_if_fail (our_uid && *our_uid);
@@ -1020,37 +1034,33 @@
tray_data = NULL;
}
}
+
+ g_slice_free (struct _query_msg, msg);
}
static void
on_dialog_objs_removed_cb (ECal *client, GList *objects, gpointer data)
{
- AlarmMsg *msg;
- struct _query_msg *list;
+ struct _query_msg *msg;
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = on_dialog_objs_removed_async;
-
- list = malloc (sizeof (struct _query_msg));
- list->client = client;
- list->objects = objects;
- list->data = data;
- msg->data = list;
+ msg = g_slice_new (struct _query_msg);
+ msg->header.func = (MessageFunc) on_dialog_objs_removed_async;
+ msg->client = client;
+ msg->objects = objects;
+ msg->data = data;
- d(printf("%s:%d (on_dialog_objs_removed_cb) - Posting a task \n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ message_push ((Message *) msg);
}
struct _tray_cqa_msg {
+ Message header;
CompQueuedAlarms *cqa;
};
static void
-tray_list_remove_cqa_async(EThread *e, AlarmMsg *msg, void *data)
+tray_list_remove_cqa_async (struct _tray_cqa_msg *msg)
{
- struct _tray_cqa_msg *tmsg = msg->data;
- CompQueuedAlarms *cqa = tmsg->cqa;
+ CompQueuedAlarms *cqa = msg->cqa;
GList *list = tray_icons_list;
d(printf("%s:%d (tray_list_remove_cqa_async) - Removing CQA %p from tray list\n",__FILE__, __LINE__, cqa));
@@ -1087,28 +1097,25 @@
gtk_tree_selection_select_iter (sel, &iter);
}
}
+
+ g_slice_free (struct _tray_cqa_msg, msg);
}
static void
tray_list_remove_cqa (CompQueuedAlarms *cqa)
{
- AlarmMsg *msg;
- struct _tray_cqa_msg *list;
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = tray_list_remove_cqa_async;
-
- list = malloc (sizeof (struct _tray_cqa_msg));
- list->cqa = cqa;
- msg->data = list;
+ struct _tray_cqa_msg *msg;
+
+ msg = g_slice_new (struct _tray_cqa_msg);
+ msg->header.func = (MessageFunc) tray_list_remove_cqa_async;
+ msg->cqa = cqa;
- d(printf("%s:%d (tray_list_remove_cqa) - Posting a task\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ message_push ((Message *) msg);
}
/* Callback used from the alarm notify dialog */
static void
-tray_list_remove_async(EThread *e, AlarmMsg *msg, void *data)
+tray_list_remove_async (Message *msg)
{
GList *list = tray_icons_list;
@@ -1138,55 +1145,50 @@
} else
list = list->next;
}
+
+ g_slice_free (Message, msg);
}
static void
-tray_list_remove_icons ()
+tray_list_remove_icons (void)
{
- AlarmMsg *msg;
-
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = tray_list_remove_async;
+ Message *msg;
- msg->data = NULL;
+ msg = g_slice_new (Message);
+ msg->func = tray_list_remove_async;
- d(printf("%s:%d (tray_list_remove_icons) - Posting a task\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ message_push (msg);
}
struct _tray_msg {
+ Message header;
TrayIconData *data;
};
static void
-tray_list_remove_data_async(EThread *e, AlarmMsg *msg, void *data)
+tray_list_remove_data_async (struct _tray_msg *msg)
{
- struct _tray_msg *tmsg = msg->data;
- TrayIconData *tray_data = tmsg->data;
+ TrayIconData *tray_data = msg->data;
d(printf("%s:%d (tray_list_remove_data_async) - Removing %p from tray list\n",__FILE__, __LINE__, tray_data));
tray_icons_list = g_list_remove_all (tray_icons_list, tray_data);
free_tray_icon_data (tray_data);
tray_data = NULL;
+
+ g_slice_free (struct _tray_msg, msg);
}
static void
tray_list_remove_data (TrayIconData *data)
{
- AlarmMsg *msg;
- struct _tray_msg *list;
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = tray_list_remove_data_async;
-
- list = malloc (sizeof (struct _tray_msg));
- list->data = data;
- msg->data = list;
+ struct _tray_msg *msg;
+
+ msg = g_slice_new (struct _tray_msg);
+ msg->header.func = (MessageFunc) tray_list_remove_data_async;
+ msg->data = data;
- d(printf("%s:%d (tray_list_remove_data) - Posting a task\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ message_push ((Message *) msg);
}
static void
@@ -1394,29 +1396,24 @@
/* Add a new data to tray list */
static void
-tray_list_add_async (EThread *e, AlarmMsg *msg, void *data)
+tray_list_add_async (struct _tray_msg *msg)
{
- struct _tray_msg *list = msg->data;
- d(printf("%s:%d (tray_list_add_async) - Add %p\n",__FILE__, __LINE__, list->data));
- tray_icons_list = g_list_prepend (tray_icons_list, list->data);
+ d(printf("%s:%d (tray_list_add_async) - Add %p\n",__FILE__, __LINE__, msg->data));
+ tray_icons_list = g_list_prepend (tray_icons_list, msg->data);
+
+ g_slice_free (struct _tray_msg, msg);
}
static void
tray_list_add_new (TrayIconData *data)
{
- AlarmMsg *msg;
- struct _tray_msg *list;
+ struct _tray_msg *msg;
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = tray_list_add_async;
-
- list = malloc (sizeof (struct _tray_msg));
- list->data = data;
- msg->data = list;
-
- d(printf("%s:%d (tray_list_add_new) - Posting a task\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ msg = g_slice_new (struct _tray_msg);
+ msg->header.func = (MessageFunc) tray_list_add_async;
+ msg->data = data;
+
+ message_push ((Message *) msg);
}
/* Performs notification of a display alarm */
@@ -1836,21 +1833,13 @@
new_midnight = time_day_end_with_zone (time (NULL), zone);
if (new_midnight > midnight) {
- AlarmMsg *msg;
- struct _midnight_refresh_msg *list;
-
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = midnight_refresh_async;
-
- list = malloc (sizeof (struct _midnight_refresh_msg));
+ struct _midnight_refresh_msg *msg;
- list->remove = FALSE;
- /* We dont need it. So set it to NULL */
- msg->data = list;
+ msg = g_slice_new (struct _midnight_refresh_msg);
+ msg->header.func = (MessageFunc) midnight_refresh_async;
+ msg->remove = FALSE;
- d(printf("%s:%d (check_midnight_refresh) - Posting a task to refresh\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ message_push ((Message *) msg);
}
return TRUE;
@@ -1981,14 +1970,15 @@
}
struct _alarm_client_msg {
+ Message header;
ECal *client;
};
-static void alarm_queue_add_async (EThread *e, AlarmMsg *msg, void *data)
+static void
+alarm_queue_add_async (struct _alarm_client_msg *msg)
{
ClientAlarms *ca;
- struct _alarm_client_msg *list = msg->data;
- ECal *client = list->client;
+ ECal *client = msg->client;
g_return_if_fail (alarm_queue_inited);
g_return_if_fail (client != NULL);
@@ -2019,6 +2009,8 @@
G_CALLBACK (cal_opened_cb),
ca);
}
+
+ g_slice_free (struct _alarm_client_msg, msg);
}
/**
@@ -2038,20 +2030,13 @@
void
alarm_queue_add_client (ECal *client)
{
- AlarmMsg *msg;
- struct _alarm_client_msg *list;
+ struct _alarm_client_msg *msg;
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = alarm_queue_add_async;
-
- list = malloc (sizeof (struct _alarm_client_msg));
- list->client = client;
- g_object_ref (client);
- msg->data = list;
+ msg = g_slice_new (struct _alarm_client_msg);
+ msg->header.func = (MessageFunc) alarm_queue_add_async;
+ msg->client = g_object_ref (client);
- d(printf("%s:%d (alarm_queue_add_client) - Posting a task\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ message_push ((Message *) msg);
}
/* Removes a component an its alarms */
@@ -2103,11 +2088,10 @@
* Removes a calendar client from the alarm queueing system.
**/
static void
-alarm_queue_remove_async (EThread *e, AlarmMsg *msg, void *data)
+alarm_queue_remove_async (struct _alarm_client_msg *msg)
{
ClientAlarms *ca;
- struct _alarm_client_msg *list = msg->data;
- ECal *client = list->client;
+ ECal *client = msg->client;
g_return_if_fail (alarm_queue_inited);
g_return_if_fail (client != NULL);
@@ -2144,24 +2128,20 @@
g_free (ca);
g_hash_table_remove (client_alarms_hash, client);
+
+ g_slice_free (struct _alarm_client_msg, msg);
}
void
alarm_queue_remove_client (ECal *client)
{
- AlarmMsg *msg;
- struct _alarm_client_msg *list;
+ struct _alarm_client_msg *msg;
- /* These two structures will be freed by the msg destroy function*/
- msg = malloc (sizeof (AlarmMsg));
- msg->receive_msg = alarm_queue_remove_async;
-
- list = malloc (sizeof (struct _alarm_client_msg));
- list->client = client;
- msg->data = list;
+ msg = g_slice_new (struct _alarm_client_msg);
+ msg->header.func = (MessageFunc) alarm_queue_remove_async;
+ msg->client = client;
- d(printf("%s:%d (alarm_queue_remove_client) - Posting a task\n",__FILE__, __LINE__));
- e_thread_put(alarm_operation_thread, (EMsg *)msg);
+ message_push ((Message *) msg);
}
/* Update non-time related variables for various structures on modification of an existing component