diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | ChangeLog.ja | 6 | ||||
-rw-r--r-- | libsylph/session.c | 6 | ||||
-rw-r--r-- | libsylph/socket.c | 20 |
4 files changed, 35 insertions, 3 deletions
@@ -1,5 +1,11 @@ 2007-01-19 + * libsylph/session.c + libsylph/socket.c: win32: increased SO_SNDBUF and SO_RCVBUF + (fixes low performance on sending data). + +2007-01-19 + * src/send_message.c: send_message_smtp(): prevent incorporation while executing the event loop. diff --git a/ChangeLog.ja b/ChangeLog.ja index 5bcf1f5b..ce70fc60 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,5 +1,11 @@ 2007-01-19 + * libsylph/session.c + libsylph/socket.c: win32: SO_SNDBUF と SO_RCVBUF を増加(データ送信 + 時の性能を向上)。 + +2007-01-19 + * src/send_message.c: send_message_smtp(): イベントループの実行中は 受信を行わないようにした。 diff --git a/libsylph/session.c b/libsylph/session.c index 3109a478..73691dca 100644 --- a/libsylph/session.c +++ b/libsylph/session.c @@ -956,9 +956,11 @@ static gint session_write_buf(Session *session) return 0; } +#define WRITE_DATA_BUFFSIZE 8192 + static gint session_write_data(Session *session) { - gchar buf[SESSION_BUFFSIZE]; + gchar buf[WRITE_DATA_BUFFSIZE]; gint write_len; gint to_write_len; @@ -967,7 +969,7 @@ static gint session_write_data(Session *session) g_return_val_if_fail(session->write_data_len > 0, -1); to_write_len = session->write_data_len - session->write_data_pos; - to_write_len = MIN(to_write_len, SESSION_BUFFSIZE); + to_write_len = MIN(to_write_len, WRITE_DATA_BUFFSIZE); if (fread(buf, to_write_len, 1, session->write_data_fp) < 1) { g_warning("session_write_data: reading data from file failed\n"); session->state = SESSION_ERROR; diff --git a/libsylph/socket.c b/libsylph/socket.c index 59b13703..189c1b77 100644 --- a/libsylph/socket.c +++ b/libsylph/socket.c @@ -1,6 +1,6 @@ /* * LibSylph -- E-Mail client library - * Copyright (C) 1999-2006 Hiroyuki Yamamoto + * Copyright (C) 1999-2007 Hiroyuki Yamamoto * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -676,6 +676,21 @@ struct hostent *my_gethostbyname(const gchar *hostname) return hp; } +static void sock_set_buffer_size(gint sock) +{ +#ifdef G_OS_WIN32 + gint val = 32768; + guint len = sizeof(val); + + setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&val, len); + setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&val, len); + getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&val, &len); + debug_print("SO_SNDBUF = %d\n", val); + getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&val, &len); + debug_print("SO_RCVBUF = %d\n", val); +#endif +} + #ifndef INET6 static gint my_inet_aton(const gchar *hostname, struct in_addr *inp) { @@ -771,6 +786,7 @@ static SockDesc sock_connect_by_getaddrinfo(const gchar *hostname, gushort port) sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (!SOCKET_IS_VALID(sock)) continue; + sock_set_buffer_size(sock); if (sock_connect_with_timeout (sock, ai->ai_addr, ai->ai_addrlen, io_timeout) == 0) @@ -808,6 +824,7 @@ SockInfo *sock_connect(const gchar *hostname, gushort port) #endif /* G_OS_WIN32 */ return NULL; } + sock_set_buffer_size(sock); if (sock_connect_by_hostname(sock, hostname, port) < 0) { if (errno != 0) perror("connect"); @@ -990,6 +1007,7 @@ static gint sock_connect_address_list_async(SockConnectData *conn_data) continue; } + sock_set_buffer_size(sock); set_nonblocking_mode(sock, TRUE); if (connect(sock, addr_data->addr, addr_data->addr_len) < 0) { |