aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--libsylph/pop.c10
-rw-r--r--libsylph/session.c17
-rw-r--r--libsylph/socket.c13
-rw-r--r--libsylph/socket.h2
-rw-r--r--libsylph/utils.c18
-rw-r--r--libsylph/utils.h4
-rw-r--r--src/inc.c27
-rw-r--r--src/main.c12
9 files changed, 99 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index fc9c972d..bb74f56e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);
diff --git a/src/inc.c b/src/inc.c
index b9641b3b..2a55fe2c 100644
--- a/src/inc.c
+++ b/src/inc.c
@@ -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;
}
diff --git a/src/main.c b/src/main.c
index cb14d223..82937164 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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