diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | libsylph/pop.c | 10 | ||||
-rw-r--r-- | libsylph/session.c | 17 | ||||
-rw-r--r-- | libsylph/socket.c | 13 | ||||
-rw-r--r-- | libsylph/socket.h | 2 | ||||
-rw-r--r-- | libsylph/utils.c | 18 | ||||
-rw-r--r-- | libsylph/utils.h | 4 | ||||
-rw-r--r-- | src/inc.c | 27 | ||||
-rw-r--r-- | src/main.c | 12 |
9 files changed, 99 insertions, 13 deletions
@@ -1,3 +1,12 @@ +2009-09-25 + + * libsylph/utils.[ch] + libsylph/socket.[ch] + libsylph/session.c + libsylph/pop.c + src/inc.c + src/main.c: fixed the handling of GDK thread lock. + 2009-09-18 * libsylph/utils.c: execute_command_line_async_wait(): disable diff --git a/libsylph/pop.c b/libsylph/pop.c index 57d7fd2b..e384e66c 100644 --- a/libsylph/pop.c +++ b/libsylph/pop.c @@ -335,6 +335,7 @@ gint pop3_retr_send(Pop3Session *session) { session->state = POP3_RETR; pop3_gen_send(session, "RETR %d", session->cur_msg); + g_print("sent RETR\n"); return PS_SUCCESS; } @@ -343,6 +344,8 @@ gint pop3_retr_recv(Pop3Session *session, FILE *fp, guint len) gchar *file; gint drop_ok; + g_print("pop3_retr_recv (%d)\n", session->cur_msg); + file = get_tmp_file(); if (pop3_write_msg_to_file(file, fp, len) < 0) { g_free(file); @@ -368,6 +371,7 @@ gint pop3_retr_recv(Pop3Session *session, FILE *fp, guint len) : drop_ok == DROP_DELETE ? RECV_TIME_DELETE : session->current_time; + g_print("pop3_retr_recv done (%d)\n", session->cur_msg); return PS_SUCCESS; } @@ -630,6 +634,7 @@ static Pop3State pop3_lookup_next(Pop3Session *session) gint size; gboolean size_limit_over; + g_print("pop3_lookup_next (%d -)\n", session->cur_msg); for (;;) { msg = &session->msg[session->cur_msg]; size = msg->size; @@ -670,6 +675,7 @@ static Pop3State pop3_lookup_next(Pop3Session *session) } pop3_retr_send(session); + g_print("pop3_lookup_next (%d) done\n", session->cur_msg); return POP3_RETR; } @@ -852,6 +858,7 @@ static gint pop3_session_recv_data_finished(Session *session, guchar *data, Pop3Session *pop3_session = POP3_SESSION(session); Pop3ErrorValue val = PS_SUCCESS; + g_print("pop3_session_recv_data_finished\n"); switch (pop3_session->state) { case POP3_GETRANGE_UIDL_RECV: val = pop3_getrange_uidl_recv(pop3_session, (gchar *)data, len); @@ -876,6 +883,7 @@ static gint pop3_session_recv_data_finished(Session *session, guchar *data, return -1; } + g_print("pop3_session_recv_data_finished done\n"); return 0; } @@ -886,6 +894,7 @@ static gint pop3_session_recv_data_as_file_finished(Session *session, FILE *fp, g_return_val_if_fail(pop3_session->state == POP3_RETR_RECV, -1); + g_print("pop3_session_recv_data_as_file_finished (%d)\n", pop3_session->cur_msg); if (pop3_retr_recv(pop3_session, fp, len) < 0) return -1; @@ -903,6 +912,7 @@ static gint pop3_session_recv_data_as_file_finished(Session *session, FILE *fp, if (pop3_lookup_next(pop3_session) == POP3_ERROR) return -1; } + g_print("pop3_session_recv_data_as_file_finished done (next %d)\n", pop3_session->cur_msg); return 0; } diff --git a/libsylph/session.c b/libsylph/session.c index 0617e402..4d043063 100644 --- a/libsylph/session.c +++ b/libsylph/session.c @@ -1,6 +1,6 @@ /* * LibSylph -- E-Mail client library - * Copyright (C) 1999-2007 Hiroyuki Yamamoto + * Copyright (C) 1999-2009 Hiroyuki Yamamoto * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -121,7 +121,6 @@ gint session_connect(Session *session, const gchar *server, gushort port) { #ifndef G_OS_UNIX SockInfo *sock = NULL; - gint flag = 0; #endif g_return_val_if_fail(session != NULL, -1); g_return_val_if_fail(server != NULL, -1); @@ -143,7 +142,7 @@ gint session_connect(Session *session, const gchar *server, gushort port) } return 0; -#else +#elif USE_THREADS session->conn_id = sock_connect_async(server, port); if (session->conn_id < 0) { g_warning("can't connect to server."); @@ -157,6 +156,15 @@ gint session_connect(Session *session, const gchar *server, gushort port) } return session_connect_cb(sock, session); +#else /* !USE_THREADS */ + sock = sock_connect(server, port); + if (sock == NULL) { + g_warning("can't connect to server."); + session->state = SESSION_ERROR; + return -1; + } + + return session_connect_cb(sock, session); #endif } @@ -348,7 +356,8 @@ static gint session_close(Session *session) { g_return_val_if_fail(session != NULL, -1); -#ifdef G_OS_UNIX +//#ifdef G_OS_UNIX +#if 0 if (session->conn_id > 0) { sock_connect_async_cancel(session->conn_id); session->conn_id = 0; diff --git a/libsylph/socket.c b/libsylph/socket.c index 5e6df275..5b2ea960 100644 --- a/libsylph/socket.c +++ b/libsylph/socket.c @@ -87,11 +87,11 @@ struct _SockConnectData { SockLookupData *lookup_data; GIOChannel *channel; guint io_tag; -#else +#elif USE_THREADS gint flag; GThread *thread; SockInfo *sock; -#endif +#endif /* G_OS_UNIX */ SockConnectFunc func; gpointer data; }; @@ -1323,8 +1323,8 @@ static gint sock_get_address_info_async_cancel(SockLookupData *lookup_data) return 0; } -#else /* G_OS_UNIX */ - +#else /* !G_OS_UNIX */ +#if USE_THREADS static gpointer sock_connect_async_func(gpointer data) { SockConnectData *conn_data = (SockConnectData *)data; @@ -1382,7 +1382,7 @@ gint sock_connect_async_wait(gint id, SockInfo **sock) g_print("sock_connect_async_wait: waiting thread\n"); while (conn_data->flag == 0) - g_main_context_iteration(NULL, TRUE); + event_loop_iterate(); g_print("sock_connect_async_wait: flagged\n"); g_thread_join(conn_data->thread); @@ -1394,7 +1394,10 @@ gint sock_connect_async_wait(gint id, SockInfo **sock) conn_data); g_free(conn_data->hostname); g_free(conn_data); + + return 0; } +#endif /* USE_THREADS */ #endif /* G_OS_UNIX */ diff --git a/libsylph/socket.h b/libsylph/socket.h index 0ddf0374..37d1e397 100644 --- a/libsylph/socket.h +++ b/libsylph/socket.h @@ -103,7 +103,7 @@ SockInfo *sock_connect (const gchar *hostname, gushort port); gint sock_connect_async (const gchar *hostname, gushort port, SockConnectFunc func, gpointer data); gint sock_connect_async_cancel (gint id); -#else +#elif USE_THREADS gint sock_connect_async (const gchar *hostname, gushort port); gint sock_connect_async_wait (gint id, SockInfo **sock); #endif diff --git a/libsylph/utils.c b/libsylph/utils.c index 2898ef76..c0664488 100644 --- a/libsylph/utils.c +++ b/libsylph/utils.c @@ -3884,6 +3884,7 @@ static gpointer execute_command_line_async_func(gpointer data) cmd_data->flag = 1; g_main_context_wakeup(NULL); + g_print("execute_command_line_async_func: exiting\n"); return GINT_TO_POINTER(0); } @@ -3910,7 +3911,7 @@ gint execute_command_line_async_wait(const gchar *cmdline) g_print("execute_command_line_async_wait: waiting thread\n"); while (data.flag == 0) - g_main_context_iteration(NULL, TRUE); + event_loop_iterate(); g_print("execute_command_line_async_wait: flagged\n"); g_thread_join(thread); @@ -4216,6 +4217,21 @@ void ui_update(void) ui_update_func(); } +static EventLoopFunc event_loop_func = NULL; + +void set_event_loop_func(EventLoopFunc func) +{ + event_loop_func = func; +} + +void event_loop_iterate(void) +{ + if (event_loop_func) + event_loop_func(); + else + g_main_context_iteration(NULL, TRUE); +} + static ProgressFunc progress_func = NULL; void set_progress_func(ProgressFunc func) diff --git a/libsylph/utils.h b/libsylph/utils.h index 3bbc42cb..5f21dc63 100644 --- a/libsylph/utils.h +++ b/libsylph/utils.h @@ -181,6 +181,7 @@ gint syl_link (const gchar *src, } typedef void (*UIUpdateFunc) (void); +typedef void (*EventLoopFunc) (void); typedef void (*ProgressFunc) (gint cur, gint total); typedef gchar * (*QueryPasswordFunc) (const gchar *server, @@ -496,6 +497,9 @@ size_t my_strftime (gchar *s, void set_ui_update_func (UIUpdateFunc func); void ui_update (void); +void set_event_loop_func (EventLoopFunc func); +void event_loop_iterate (void); + void set_progress_func (ProgressFunc func); void progress_show (gint cur, gint total); @@ -862,8 +862,9 @@ static IncState inc_pop3_session_do(IncSession *session) } while (session_is_connected(SESSION(pop3_session)) && - session->inc_state != INC_CANCEL) + session->inc_state != INC_CANCEL) { gtk_main_iteration(); + } if (session->inc_state == INC_SUCCESS) { switch (pop3_session->error_val) { @@ -1104,6 +1105,8 @@ static gint inc_recv_data_progressive(Session *session, guint cur_len, if (!pop3_session->new_msg_exist) return 0; + gdk_threads_enter(); + cur_total = pop3_session->cur_total_bytes + cur_len; if (cur_total > pop3_session->total_bytes) cur_total = pop3_session->total_bytes; @@ -1113,6 +1116,7 @@ static gint inc_recv_data_progressive(Session *session, guint cur_len, inc_progress_dialog_update_periodic(inc_dialog, inc_session); inc_update_folderview_periodic(inc_dialog, inc_session); + gdk_threads_leave(); return 0; } @@ -1127,11 +1131,14 @@ static gint inc_recv_data_finished(Session *session, guint len, gpointer data) inc_recv_data_progressive(session, 0, 0, inc_session); + gdk_threads_enter(); + if (POP3_SESSION(session)->state == POP3_LOGOUT) { inc_progress_dialog_update(inc_dialog, inc_session); inc_update_folderview(inc_dialog, inc_session); } + gdk_threads_leave(); return 0; } @@ -1152,14 +1159,18 @@ static gint inc_recv_message(Session *session, const gchar *msg, gpointer data) case POP3_GETRANGE_LAST: case POP3_GETRANGE_UIDL: case POP3_GETSIZE_LIST: + gdk_threads_enter(); inc_progress_dialog_update(inc_dialog, inc_session); + gdk_threads_leave(); break; case POP3_RETR: inc_recv_data_progressive(session, 0, 0, inc_session); break; case POP3_LOGOUT: + gdk_threads_enter(); inc_progress_dialog_update(inc_dialog, inc_session); inc_update_folderview(inc_dialog, inc_session); + gdk_threads_leave(); break; default: break; @@ -1180,6 +1191,10 @@ static gint inc_drop_message(Pop3Session *session, const gchar *file) g_return_val_if_fail(inc_session != NULL, DROP_ERROR); + g_print("inc_drop_message\n"); + + gdk_threads_enter(); + if (session->ac_prefs->inbox) { inbox = folder_find_item_from_identifier (session->ac_prefs->inbox); @@ -1187,8 +1202,10 @@ static gint inc_drop_message(Pop3Session *session, const gchar *file) inbox = folder_get_default_inbox(); } else inbox = folder_get_default_inbox(); - if (!inbox) + if (!inbox) { + gdk_threads_leave(); return DROP_ERROR; + } fltinfo = filter_info_new(); fltinfo->account = session->ac_prefs; @@ -1199,6 +1216,7 @@ static gint inc_drop_message(Pop3Session *session, const gchar *file) if (!msginfo) { g_warning("inc_drop_message: procheader_parse_file failed"); filter_info_free(fltinfo); + gdk_threads_leave(); return DROP_ERROR; } msginfo->file_path = g_strdup(file); @@ -1217,6 +1235,7 @@ static gint inc_drop_message(Pop3Session *session, const gchar *file) procmsg_msginfo_free(msginfo); filter_info_free(fltinfo); inc_session->inc_state = INC_ERROR; + gdk_threads_leave(); return DROP_ERROR; } } @@ -1239,6 +1258,7 @@ static gint inc_drop_message(Pop3Session *session, const gchar *file) procmsg_msginfo_free(msginfo); filter_info_free(fltinfo); inc_session->inc_state = INC_ERROR; + gdk_threads_leave(); return DROP_ERROR; } } @@ -1249,6 +1269,7 @@ static gint inc_drop_message(Pop3Session *session, const gchar *file) if (folder_item_add_msg_msginfo(inbox, msginfo, FALSE) < 0) { procmsg_msginfo_free(msginfo); filter_info_free(fltinfo); + gdk_threads_leave(); return DROP_ERROR; } fltinfo->dest_list = g_slist_append(fltinfo->dest_list, inbox); @@ -1279,6 +1300,8 @@ static gint inc_drop_message(Pop3Session *session, const gchar *file) procmsg_msginfo_free(msginfo); filter_info_free(fltinfo); + gdk_threads_leave(); + g_print("inc_drop_message done\n"); return val; } @@ -579,6 +579,15 @@ static gint get_queued_message_num(void) return queue->total; } +#if USE_THREADS +static void event_loop_iteration_func(void) +{ + //g_print("event_loop_iteration_func start\n"); + gtk_main_iteration(); + //g_print("event_loop_iteration_func end\n"); +} +#endif + static void app_init(void) { #if USE_THREADS @@ -591,6 +600,9 @@ static void app_init(void) #endif syl_init(); +#if USE_THREADS + set_event_loop_func(event_loop_iteration_func); +#endif prog_version = PROG_VERSION; #ifdef G_OS_WIN32 |