2005-06-02 [colin] 1.9.11cvs35
authorColin Leroy <colin@colino.net>
Thu, 2 Jun 2005 16:46:13 +0000 (16:46 +0000)
committerColin Leroy <colin@colino.net>
Thu, 2 Jun 2005 16:46:13 +0000 (16:46 +0000)
* src/imap.c
Use a non-blocking imap_getline() if possible.
This should completely prevent the interface
from freezin on imap operations, although it
may do strange stuff in case of folder switching
while a big imap operation is taking place...

In addition, fix a leak in the case thread
creation fails on connection.

ChangeLog-gtk2.claws
PATCHSETS
configure.ac
src/imap.c

index 64bf0377bcb2700861ff9852a73fae45f01e5ce6..014123b9a30216608f9ab124235879c0b1811748 100644 (file)
@@ -1,3 +1,15 @@
+2005-06-02 [colin]     1.9.11cvs35
+
+       * src/imap.c
+               Use a non-blocking imap_getline() if possible.
+               This should completely prevent the interface
+               from freezin on imap operations, although it
+               may do strange stuff in case of folder switching
+               while a big imap operation is taking place...
+
+               In addition, fix a leak in the case thread
+               creation fails on connection.
+
 2005-06-02 [colin]     1.9.11cvs34
 
        * src/crash.c
index c4c413192e8ccb9e9bca7675c56aa69ea4c487d8..7f30bf7e7073269465e267d453da8c4455ad1834 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.179.2.17 -r 1.179.2.18 src/imap.c;  cvs diff -u -r 1.1.2.7 -r 1.1.2.8 src/imap_gtk.c;  cvs diff -u -r 1.1.2.1 -r 1.1.2.2 src/imap_gtk.h;  cvs diff -u -r 1.47.2.19 -r 1.47.2.20 src/procheader.c;  ) > 1.9.11cvs32.patchset
 ( cvs diff -u -r 1.105.2.24 -r 1.105.2.25 src/prefs_account.c;  ) > 1.9.11cvs33.patchset
 ( cvs diff -u -r 1.23.2.9 -r 1.23.2.10 src/crash.c;  cvs diff -u -r 1.103.2.19 -r 1.103.2.20 src/prefs_common.h;  ) > 1.9.11cvs34.patchset
+( cvs diff -u -r 1.179.2.18 -r 1.179.2.19 src/imap.c;  ) > 1.9.11cvs35.patchset
index c13cb5ed7c9f32e93a4c3f20cb03c5e675e5f785..ba7ecf184d4a1a9f5a5325a7272107b30592bad0 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=9
 MICRO_VERSION=11
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=34
+EXTRA_VERSION=35
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
index cb560e4a78d2a0d84b716716e238cbc7627701de..4372dc8d430b7c110e5e0e626cc72ec3877e49b2 100644 (file)
@@ -69,6 +69,7 @@ typedef struct _thread_data {
        gchar *server;
        gushort port;
        gboolean done;
+       SockInfo *sock;
 #ifdef USE_OPENSSL
        SSLType ssl_type;
 #endif
@@ -465,6 +466,53 @@ static gchar *imap_item_get_path           (Folder         *folder,
 
 static FolderClass imap_class;
 
+#ifdef USE_PTHREAD
+void *imap_getline_thread(void *data)
+{
+       thread_data *td = (thread_data *)data;
+       gchar *line = NULL;
+       
+       line = sock_getline(td->sock);
+       
+       td->done = TRUE;
+       
+       return (void *)line;
+}
+#endif
+
+static gchar *imap_getline(SockInfo *sock)
+{
+#if (defined USE_PTHREAD && defined __GLIBC__ && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)))
+       thread_data *td = g_new0(thread_data, 1);
+       pthread_t pt;
+       gchar *line;
+       td->sock = sock;
+       td->done = FALSE;
+       
+       debug_print("creating imap_getline_thread...\n");
+       if (pthread_create(&pt, PTHREAD_CREATE_JOINABLE,
+                       imap_getline_thread, td) != 0) {
+               g_free(td);
+               return sock_getline(sock);
+       }
+       
+       debug_print("waiting for imap_getline_thread...\n");
+       while(!td->done) {
+               /* don't let the interface freeze while waiting */
+               sylpheed_do_idle();
+       }
+
+       /* get the thread's return value and clean its resources */
+       pthread_join(pt, (void *)&line);
+       g_free(td);
+
+       debug_print("imap_getline_thread returned %s\n", line);
+       return line;
+#else
+       return sock_getline(sock);
+#endif
+}
+
 FolderClass *imap_get_class(void)
 {
        if (imap_class.idstr == NULL) {
@@ -1880,7 +1928,7 @@ static GSList *imap_get_uncached_messages(IMAPSession *session,
                str = g_string_new(NULL);
 
                for (;;) {
-                       if ((tmp = sock_getline(SESSION(session)->sock)) == NULL) {
+                       if ((tmp = imap_getline(SESSION(session)->sock)) == NULL) {
                                log_warning(_("error occurred while getting envelope.\n"));
                                g_string_free(str, TRUE);
                                break;
@@ -2052,6 +2100,8 @@ static SockInfo *imap_open(const gchar *server, gushort port)
        if (pthread_create(&pt, PTHREAD_CREATE_JOINABLE,
                        imap_open_thread, td) != 0) {
                statusbar_pop_all();
+               g_free(td->server);
+               g_free(td);
 #if USE_OPENSSL
                return imap_open_blocking(server, port, ssl_type);
 #else
@@ -2288,7 +2338,7 @@ static gchar *imap_parse_atom(SockInfo *sock, gchar *src,
        /* read the next line if the current response buffer is empty */
        while (isspace(*(guchar *)cur_pos)) cur_pos++;
        while (*cur_pos == '\0') {
-               if ((nextline = sock_getline(sock)) == NULL)
+               if ((nextline = imap_getline(sock)) == NULL)
                        return cur_pos;
                g_string_assign(str, nextline);
                cur_pos = str->str;
@@ -2321,7 +2371,7 @@ static gchar *imap_parse_atom(SockInfo *sock, gchar *src,
                cur_pos = str->str;
 
                do {
-                       if ((nextline = sock_getline(sock)) == NULL)
+                       if ((nextline = imap_getline(sock)) == NULL)
                                return cur_pos;
                        line_len += strlen(nextline);
                        g_string_append(str, nextline);
@@ -2364,7 +2414,7 @@ static gchar *imap_get_header(SockInfo *sock, gchar *cur_pos, gchar **headers,
        cur_pos = str->str;
 
        do {
-               if ((nextline = sock_getline(sock)) == NULL)
+               if ((nextline = imap_getline(sock)) == NULL)
                        return cur_pos;
                block_len += strlen(nextline);
                g_string_append(str, nextline);
@@ -2381,7 +2431,7 @@ static gchar *imap_get_header(SockInfo *sock, gchar *cur_pos, gchar **headers,
 
        while (isspace(*(guchar *)cur_pos)) cur_pos++;
        while (*cur_pos == '\0') {
-               if ((nextline = sock_getline(sock)) == NULL)
+               if ((nextline = imap_getline(sock)) == NULL)
                        return cur_pos;
                g_string_assign(str, nextline);
                cur_pos = str->str;
@@ -3365,7 +3415,7 @@ static void imap_gen_send(IMAPSession *session, const gchar *format, ...)
 
 static gint imap_gen_recv(IMAPSession *session, gchar **ret)
 {
-       if ((*ret = sock_getline(SESSION(session)->sock)) == NULL)
+       if ((*ret = imap_getline(SESSION(session)->sock)) == NULL)
                return IMAP_SOCKET;
 
        strretchomp(*ret);