Changeset 3714
- Timestamp:
- 07/01/08 18:11:10
- Files:
-
- releases/modest/diablo-pe2/ChangeLog (modified) (1 diff)
- releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/camel-provider.c (modified) (1 diff)
- releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/camel-provider.h (modified) (3 diffs)
- releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/camel.c (modified) (1 diff)
- releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-provider.c (modified) (1 diff)
- releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/providers/pop3/camel-pop3-provider.c (modified) (2 diffs)
- releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/providers/pop3/camel-pop3-store.c (modified) (10 diffs)
- releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/providers/pop3/camel-pop3-store.h (modified) (2 diffs)
- releases/modest/diablo-pe2/libtinymail-camel/tny-camel-pop-store-account.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
releases/modest/diablo-pe2/ChangeLog
r3710 r3714 12 12 * libtinymail-camel/tny-camel-account.c: 13 13 More camel operation reference fixes 14 15 * libtinymail-camel/camel-lite/camel/camel-provider.[ch]: 16 Now providers offer a new shutdown handler, that will be 17 called on shutting down camel. 18 19 * libtinymail-camel/camel-lite/camel/camel.c: 20 Use the providers shutdown handler on shutting down camel. 21 22 * libtinymail-camel/camel-lite/camel/providers/pop3/camel-pop3-provider.c: 23 Implement new provider shutdown handler, to kill the login delay 24 threads on shutting down tinymail. 25 26 * libtinymail-camel/camel-lite/camel/providers/pop3/camel-pop3-store.[ch]: 27 New method to kill the login delay thread. This is used to kill 28 the thread on shutting down tinymail. 29 30 * libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-provider.c: 31 Set as NULL the default shutdown handler. 32 33 * libtinymail-camel/tny-camel-pop-store-account.c: 34 Manage properly the internal inbox reference to avoid leaking it. 14 35 15 36 2008-07-01 Philip Van Hoof <pvanhoof@gnome.org> releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/camel-provider.c
r3385 r3714 270 270 } 271 271 272 void camel_provider_shutdown (CamelProvider *provider) 273 { 274 if (provider->shutdown) { 275 provider->shutdown ((CamelObject *) provider); 276 } 277 } 278 279 void camel_provider_shutdown_all (void) 280 { 281 GList *providers_list; 282 GList *node; 283 284 providers_list = camel_provider_list (FALSE); 285 for (node = providers_list; node != NULL; node = g_list_next (node)) { 286 CamelProvider *provider = (CamelProvider *) node->data; 287 camel_provider_shutdown (provider); 288 } 289 g_list_free (providers_list); 290 } 291 272 292 static gint 273 293 provider_compare (gconstpointer a, gconstpointer b) releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/camel-provider.h
r2950 r3714 145 145 146 146 typedef int (*CamelProviderAutoDetectFunc) (CamelURL *url, GHashTable **auto_detected, CamelException *ex); 147 typedef void (*CamelProviderShutdownFunc) (CamelObject *provider); 148 147 149 148 150 typedef struct { … … 209 211 const char *license_file; 210 212 213 /* Shutdown function. Will be called in camel_shutdown. 214 */ 215 CamelProviderShutdownFunc shutdown; 216 211 217 /* Private to the provider */ 212 218 void *priv; … … 225 231 void camel_provider_load(const char *path, CamelException *ex); 226 232 void camel_provider_register(CamelProvider *provider); 233 void camel_provider_shutdown (CamelProvider *provider); 234 void camel_provider_shutdown_all (void); 227 235 GList *camel_provider_list(gboolean load); 228 236 CamelProvider *camel_provider_get(const char *url_string, CamelException *ex); releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/camel.c
r3710 r3714 54 54 if (!initialised) 55 55 return; 56 57 camel_provider_shutdown_all (); 56 58 57 59 initialised = FALSE; releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-provider.c
r2950 r3714 114 114 imap_provider.authtypes = g_list_prepend (imap_provider.authtypes, &camel_imap_password_authtype); 115 115 imap_provider.translation_domain = GETTEXT_PACKAGE; 116 imap_provider.shutdown = NULL; 116 117 117 118 camel_provider_register(&imap_provider); releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/providers/pop3/camel-pop3-provider.c
r2950 r3714 90 90 }; 91 91 92 static void 93 pop3_shutdown (CamelProvider *provider) 94 { 95 camel_pop3_store_kill_threads (); 96 } 97 92 98 void 93 99 camel_provider_module_init(void) … … 106 112 pop3_provider.authtypes = g_list_prepend(pop3_provider.authtypes, &camel_pop3_password_authtype); 107 113 pop3_provider.translation_domain = GETTEXT_PACKAGE; 114 pop3_provider.shutdown = pop3_shutdown; 108 115 109 116 camel_provider_register(&pop3_provider); releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/providers/pop3/camel-pop3-store.c
r3689 r3714 84 84 85 85 static CamelStoreClass *parent_class = NULL; 86 static GMutex *wait_for_login_mutex = NULL; 87 static GCond *wait_for_login_cond = NULL; 88 static GList *wait_for_login_threads = NULL; 86 89 87 90 static void finalize (CamelObject *object); … … 162 165 163 166 if (store->engine == NULL) { 164 g_static_rec_mutex_ lock (store->eng_lock);167 g_static_rec_mutex_unlock (store->eng_lock); 165 168 return TRUE; 166 169 } … … 175 178 } 176 179 180 g_static_rec_mutex_unlock (store->eng_lock); 181 177 182 g_timeout_add (20000, unref_it, store->engine); 178 183 store->engine = NULL; 179 g_static_rec_mutex_unlock (store->eng_lock);180 184 181 185 /* camel_object_unref((CamelObject *)store->engine); */ … … 404 408 g_static_rec_mutex_unlock (store->eng_lock); 405 409 410 g_mutex_lock (wait_for_login_mutex); 406 411 while (!killed) { 407 408 sleep (login_delay); 409 412 GTimeVal tv_delay = {0, 0}; 413 414 tv_delay.tv_sec = login_delay; 415 416 g_cond_timed_wait (wait_for_login_cond, wait_for_login_mutex, &tv_delay); 417 418 if (!store->engine) { 419 break; 420 } 410 421 411 422 if (!store->is_refreshing) { … … 423 434 424 435 camel_object_unref (store); 436 wait_for_login_threads = g_list_append (wait_for_login_threads, store->login_delay_thread); 437 g_mutex_unlock (wait_for_login_mutex); 425 438 return NULL; 426 439 } … … 921 934 camel_pop3_store_prepare (CamelStore *store) 922 935 { 936 CamelPOP3Store *pstore = (CamelPOP3Store *) store; 923 937 camel_object_ref (store); 924 g_thread_create (wait_for_login_delay, store, FALSE, NULL); 938 g_mutex_lock (wait_for_login_mutex); 939 pstore->login_delay_thread = g_thread_create (wait_for_login_delay, store, TRUE, NULL); 940 g_mutex_unlock (wait_for_login_mutex); 925 941 } 926 942 … … 1020 1036 1021 1037 g_timeout_add (20000, unref_it, store->engine); 1022 /* camel_object_unref((CamelObject *)store->engine); */1023 1038 store->engine = NULL; 1024 1025 1039 //g_static_rec_mutex_unlock (store->eng_lock); 1026 1040 … … 1200 1214 } 1201 1215 1216 void 1217 camel_pop3_store_kill_threads (void) 1218 { 1219 GThread *thread_to_join; 1220 g_mutex_lock (wait_for_login_mutex); 1221 while (wait_for_login_threads) { 1222 thread_to_join = wait_for_login_threads->data; 1223 g_cond_broadcast (wait_for_login_cond); 1224 g_mutex_unlock (wait_for_login_mutex); 1225 g_thread_join (thread_to_join); 1226 g_mutex_lock (wait_for_login_mutex); 1227 wait_for_login_threads = g_list_remove (wait_for_login_threads, thread_to_join); 1228 } 1229 g_mutex_unlock (wait_for_login_mutex); 1230 } 1231 1202 1232 static void 1203 1233 camel_pop3_store_class_init (CamelPOP3StoreClass *camel_pop3_store_class) … … 1211 1241 1212 1242 parent_class = CAMEL_STORE_CLASS (camel_type_get_global_classfuncs (camel_disco_store_get_type ())); 1243 wait_for_login_mutex = g_mutex_new (); 1244 wait_for_login_cond = g_cond_new (); 1245 wait_for_login_threads = NULL; 1213 1246 1214 1247 /* virtual method overload */ … … 1256 1289 store->uidl_lock = g_new0 (GStaticRecMutex, 1); 1257 1290 g_static_rec_mutex_init (store->uidl_lock); 1291 store->login_delay_thread = NULL; 1258 1292 1259 1293 return; releases/modest/diablo-pe2/libtinymail-camel/camel-lite/camel/providers/pop3/camel-pop3-store.h
r3044 r3714 54 54 gpointer book; 55 55 guint login_delay; 56 GThread *login_delay_thread; 56 57 57 58 GPtrArray *uids; … … 79 80 80 81 void camel_pop3_store_destroy_lists (CamelPOP3Store *pop3_store); 82 void camel_pop3_store_kill_threads (void); 81 83 82 84 G_END_DECLS releases/modest/diablo-pe2/libtinymail-camel/tny-camel-pop-store-account.c
r3667 r3714 96 96 if (self && TNY_IS_CAMEL_STORE_ACCOUNT (self)) { 97 97 TnyCamelStoreAccountPriv *priv = TNY_CAMEL_STORE_ACCOUNT_GET_PRIVATE (self); 98 TnyCamelPopStoreAccountPriv *ppriv = TNY_CAMEL_POP_STORE_ACCOUNT_GET_PRIVATE (self); 98 99 g_static_rec_mutex_lock (priv->factory_lock); 99 100 priv->managed_folders = g_list_remove_all (priv->managed_folders, folder); 100 101 g_static_rec_mutex_unlock (priv->factory_lock); 102 if (ppriv->inbox == folder) { 103 ppriv->inbox = NULL; 104 } 101 105 } 102 106 } … … 116 120 g_object_weak_ref (G_OBJECT (ppriv->inbox), (GWeakNotify) notify_factory_del, self); 117 121 priv->managed_folders = g_list_prepend (priv->managed_folders, ppriv->inbox); 122 } else { 123 g_object_ref (ppriv->inbox); 118 124 } 119 125 120 126 g_static_rec_mutex_unlock (priv->factory_lock); 121 127 122 return (TnyFolder *) g_object_ref (ppriv->inbox);128 return (TnyFolder *) ppriv->inbox; 123 129 } 124 130 … … 142 148 { 143 149 TnyCamelPopStoreAccountPriv *priv = TNY_CAMEL_POP_STORE_ACCOUNT_GET_PRIVATE (object); 144 145 if (priv->inbox)146 g_object_unref (priv->inbox);147 150 148 151 g_mutex_free (priv->lock);
