aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-04-19 06:05:29 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-04-19 06:05:29 +0000
commitc326ff3afcb25e7cee4da51ec9e0af5ac0f96981 (patch)
tree91c5d3b80049021e58ad30903af4adc4b0e4834d
parent2902d75dc20e2cc4f94335d7dab0db9915bbc554 (diff)
reduced memory usage when sending messages.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@221 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r--ChangeLog5
-rw-r--r--ChangeLog.ja5
-rw-r--r--src/session.c77
-rw-r--r--src/session.h8
4 files changed, 78 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index ea25c330..9b5e8d3b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2005-04-19
+ * src/session.[ch]: use separate buffer for large data to be sent,
+ and don't duplicate it (reduces memory usage).
+
+2005-04-19
+
* src/compose.c
src/prefs_common.c: removed '/Edit/Advanced' menu which had been
provided for old GtkSText, and had interfered with gtk-key-theme
diff --git a/ChangeLog.ja b/ChangeLog.ja
index 5ebbc1c0..db28d01c 100644
--- a/ChangeLog.ja
+++ b/ChangeLog.ja
@@ -1,5 +1,10 @@
2005-04-19
+ * src/session.[ch]: 大きい送信データ用に別のバッファを使用し、
+ そのデータを複製しないようにした(メモリ使用量を削減)。
+
+2005-04-19
+
* src/compose.c
src/prefs_common.c: 古い GtkSText のために用意され、 gtk-key-theme
の設定と干渉していた '/編集/高度な操作' メニューを削除。
diff --git a/src/session.c b/src/session.c
index e0527752..fe9db74b 100644
--- a/src/session.c
+++ b/src/session.c
@@ -1,6 +1,6 @@
/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2004 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2005 Hiroyuki Yamamoto
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -91,6 +91,10 @@ void session_init(Session *session)
session->write_buf_p = NULL;
session->write_buf_len = 0;
+ session->write_data = NULL;
+ session->write_data_p = NULL;
+ session->write_data_len = 0;
+
session->timeout_tag = 0;
session->timeout_interval = 0;
@@ -363,16 +367,15 @@ gint session_send_data(Session *session, const guchar *data, guint size)
{
gboolean ret;
- g_return_val_if_fail(session->write_buf == NULL, -1);
+ g_return_val_if_fail(session->write_data == NULL, -1);
g_return_val_if_fail(data != NULL, -1);
g_return_val_if_fail(size != 0, -1);
session->state = SESSION_SEND;
- session->write_buf = g_malloc(size);
- session->write_buf_p = session->write_buf;
- memcpy(session->write_buf, data, size);
- session->write_buf_len = size;
+ session->write_data = data;
+ session->write_data_p = session->write_data;
+ session->write_data_len = size;
gettimeofday(&session->tv_prev, NULL);
ret = session_write_data_cb(session->sock, G_IO_OUT, session);
@@ -654,6 +657,48 @@ static gint session_write_buf(Session *session)
return 0;
}
+static gint session_write_data(Session *session)
+{
+ gint write_len;
+ gint to_write_len;
+
+ g_return_val_if_fail(session->write_data != NULL, -1);
+ g_return_val_if_fail(session->write_data_p != NULL, -1);
+ g_return_val_if_fail(session->write_data_len > 0, -1);
+
+ to_write_len = session->write_data_len -
+ (session->write_data_p - session->write_data);
+ to_write_len = MIN(to_write_len, SESSION_BUFFSIZE);
+
+ write_len = sock_write(session->sock, session->write_data_p,
+ to_write_len);
+
+ if (write_len < 0) {
+ switch (errno) {
+ case EAGAIN:
+ write_len = 0;
+ break;
+ default:
+ g_warning("sock_write: %s\n", g_strerror(errno));
+ session->state = SESSION_ERROR;
+ return -1;
+ }
+ }
+
+ /* incomplete write */
+ if (session->write_data_p - session->write_data + write_len <
+ session->write_data_len) {
+ session->write_data_p += write_len;
+ return 1;
+ }
+
+ session->write_data = NULL;
+ session->write_data_p = NULL;
+ session->write_data_len = 0;
+
+ return 0;
+}
+
static gboolean session_write_msg_cb(SockInfo *source, GIOCondition condition,
gpointer data)
{
@@ -687,17 +732,17 @@ static gboolean session_write_data_cb(SockInfo *source,
GIOCondition condition, gpointer data)
{
Session *session = SESSION(data);
- guint write_buf_len;
+ guint write_data_len;
gint ret;
g_return_val_if_fail(condition == G_IO_OUT, FALSE);
- g_return_val_if_fail(session->write_buf != NULL, FALSE);
- g_return_val_if_fail(session->write_buf_p != NULL, FALSE);
- g_return_val_if_fail(session->write_buf_len > 0, FALSE);
+ g_return_val_if_fail(session->write_data != NULL, FALSE);
+ g_return_val_if_fail(session->write_data_p != NULL, FALSE);
+ g_return_val_if_fail(session->write_data_len > 0, FALSE);
- write_buf_len = session->write_buf_len;
+ write_data_len = session->write_data_len;
- ret = session_write_buf(session);
+ ret = session_write_data(session);
if (ret < 0) {
session->state = SESSION_ERROR;
@@ -712,8 +757,8 @@ static gboolean session_write_data_cb(SockInfo *source,
session_set_timeout(session, session->timeout_interval);
session->send_data_progressive_notify
(session,
- session->write_buf_p - session->write_buf,
- write_buf_len,
+ session->write_data_p - session->write_data,
+ write_data_len,
session->send_data_progressive_notify_data);
gettimeofday(&session->tv_prev, NULL);
}
@@ -726,8 +771,8 @@ static gboolean session_write_data_cb(SockInfo *source,
}
/* callback */
- ret = session->send_data_finished(session, write_buf_len);
- session->send_data_notify(session, write_buf_len,
+ ret = session->send_data_finished(session, write_data_len);
+ session->send_data_notify(session, write_data_len,
session->send_data_notify_data);
return FALSE;
diff --git a/src/session.h b/src/session.h
index 093f12f4..a0aa680a 100644
--- a/src/session.h
+++ b/src/session.h
@@ -1,6 +1,6 @@
/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2004 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2005 Hiroyuki Yamamoto
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -116,10 +116,16 @@ struct _Session
GByteArray *read_data_buf;
gchar *read_data_terminator;
+ /* buffer for short messages */
gchar *write_buf;
gchar *write_buf_p;
gint write_buf_len;
+ /* buffer for large data */
+ const guchar *write_data;
+ const guchar *write_data_p;
+ gint write_data_len;
+
guint timeout_tag;
guint timeout_interval;