From: Matthias Clasen Date: Thu, 1 Jun 2006 15:57:38 +0000 (+0000) Subject: Avoid running in an assertion with small writes. (#343566, Chris Wilson) X-Git-Tag: GLIB_2_11_2~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=14538bb8d6d4e8af33151fb4d84dc893fa850577;p=platform%2Fupstream%2Fglib.git Avoid running in an assertion with small writes. (#343566, Chris Wilson) 2006-06-01 Matthias Clasen * glib/giochannel.c (g_io_channel_write_chars): Avoid running in an assertion with small writes. (#343566, Chris Wilson) * tests/iochannel-test.c: Add a testcase for small writes. --- diff --git a/ChangeLog b/ChangeLog index c782756..95a2509 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2006-06-01 Matthias Clasen + * glib/giochannel.c (g_io_channel_write_chars): Avoid + running in an assertion with small writes. (#343566, Chris + Wilson) + + * tests/iochannel-test.c: Add a testcase for small writes. + * glib/glib.symbols: * glib/ghash.h: * glib/ghash.c: Add g_hash_table_{remove,steal}_all to diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index c782756..95a2509 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,5 +1,11 @@ 2006-06-01 Matthias Clasen + * glib/giochannel.c (g_io_channel_write_chars): Avoid + running in an assertion with small writes. (#343566, Chris + Wilson) + + * tests/iochannel-test.c: Add a testcase for small writes. + * glib/glib.symbols: * glib/ghash.h: * glib/ghash.c: Add g_hash_table_{remove,steal}_all to diff --git a/glib/giochannel.c b/glib/giochannel.c index 8667ae2..49d7cb3 100644 --- a/glib/giochannel.c +++ b/glib/giochannel.c @@ -2009,7 +2009,7 @@ g_io_channel_write_chars (GIOChannel *channel, * and never receiving an EAGAIN. */ - if (channel->write_buf->len >= channel->buf_size) + if (channel->write_buf->len >= channel->buf_size - MAX_CHAR_SIZE) { gsize did_write = 0, this_time; diff --git a/tests/iochannel-test.c b/tests/iochannel-test.c index 80e8e34..39b3337 100644 --- a/tests/iochannel-test.c +++ b/tests/iochannel-test.c @@ -11,6 +11,47 @@ #define BUFFER_SIZE 1024 +static void +test_small_writes (void) +{ + GIOChannel *io; + GIOStatus status; + guint cnt; + gchar tmp; + GError *error = NULL; + + io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error); + if (error) + { + g_warning ("Unable to open file %s: %s", + "iochannel-test-outfile", + error->message); + g_error_free (error); + + exit (1); + } + + g_io_channel_set_encoding (io, NULL, NULL); + g_io_channel_set_buffer_size (io, 1022); + + cnt = 2 * g_io_channel_get_buffer_size (io); + tmp = 0; + + while (cnt) + { + status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL); + if (status == G_IO_STATUS_ERROR) + break; + if (status == G_IO_STATUS_NORMAL) + cnt--; + } + + g_assert (status == G_IO_STATUS_NORMAL); + + g_io_channel_unref (io); +} + + gint main (gint argc, gchar * argv[]) { GIOChannel *gio_r, *gio_w ; @@ -125,6 +166,8 @@ gint main (gint argc, gchar * argv[]) g_io_channel_unref(gio_r); g_io_channel_unref(gio_w); + + test_small_writes (); return 0; }