diff options
author | Paul Pogonyshev <pogonyshev@gmx.net> | 2008-12-21 16:08:01 +0000 |
---|---|---|
committer | Paul Pogonyshev <paulp@src.gnome.org> | 2008-12-21 16:08:01 +0000 |
commit | a1b44acabfbca2fd6931699a9407fe8f9d95d253 (patch) | |
tree | 34ee13f3903add4b34ee9499cf1d05d7e0e9f620 | |
parent | 95886775af564a05aaaf5708f0b37279f82d0d76 (diff) | |
download | pygobject-a1b44acabfbca2fd6931699a9407fe8f9d95d253.tar.gz pygobject-a1b44acabfbca2fd6931699a9407fe8f9d95d253.tar.xz pygobject-a1b44acabfbca2fd6931699a9407fe8f9d95d253.zip |
Merge from 2.16 branch:
2008-12-21 Paul Pogonyshev <pogonyshev@gmx.net>
Bug 564102 – _wrap_g_output_stream_write_async not adding a
reference to the buffer passed
* gio/gio.override (pygio_notify_copy_buffer): New function.
(pygio_free_notify): Free new `buffer' field if it is set.
* gio/goutputstream.override (_wrap_g_output_stream_write_async):
Copy the buffer with new pygio_notify_copy_buffer() and use the
copy for g_output_stream_write_async() call.
* gio/gfile.override (_wrap_g_file_replace_contents_async): Same
as for _wrap_g_output_stream_write_async().
svn path=/trunk/; revision=981
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | gio/gfile.override | 5 | ||||
-rw-r--r-- | gio/gio.override | 14 | ||||
-rw-r--r-- | gio/goutputstream.override | 5 |
4 files changed, 35 insertions, 4 deletions
@@ -1,3 +1,18 @@ +2008-12-21 Paul Pogonyshev <pogonyshev@gmx.net> + + Bug 564102 – _wrap_g_output_stream_write_async not adding a + reference to the buffer passed + + * gio/gio.override (pygio_notify_copy_buffer): New function. + (pygio_free_notify): Free new `buffer' field if it is set. + + * gio/goutputstream.override (_wrap_g_output_stream_write_async): + Copy the buffer with new pygio_notify_copy_buffer() and use the + copy for g_output_stream_write_async() call. + + * gio/gfile.override (_wrap_g_file_replace_contents_async): Same + as for _wrap_g_output_stream_write_async(). + 2008-12-03 Paul Pogonyshev <pogonyshev@gmx.net> * glib/pyglib.c (pyglib_error_check): Test if `domain' is not-null diff --git a/gio/gfile.override b/gio/gfile.override index 77dad6f..deb43e8 100644 --- a/gio/gfile.override +++ b/gio/gfile.override @@ -1110,9 +1110,10 @@ _wrap_g_file_replace_contents_async(PyGObject *self, PyObject *args, PyObject *k Py_INCREF(notify->callback); Py_XINCREF(notify->data); + pygio_notify_copy_buffer(notify, contents, length); g_file_replace_contents_async(G_FILE(self->obj), - contents, - length, + notify->buffer, + notify->buffer_size, etag, make_backup, flags, diff --git a/gio/gio.override b/gio/gio.override index e6916a0..0f6ae5f 100644 --- a/gio/gio.override +++ b/gio/gio.override @@ -36,6 +36,8 @@ headers typedef struct { PyObject *callback; PyObject *data; + gpointer buffer; + gsize buffer_size; } PyGIONotify; static void @@ -45,10 +47,22 @@ py_decref_callback (gpointer data) } static void +pygio_notify_copy_buffer(PyGIONotify *notify, gpointer buffer, gsize buffer_size) +{ + if (buffer_size > 0) { + notify->buffer = g_slice_copy(buffer_size, buffer); + notify->buffer_size = buffer_size; + } +} + +static void pygio_free_notify(PyGIONotify *notify) { Py_XDECREF(notify->callback); Py_XDECREF(notify->data); + if (notify->buffer) + g_slice_free1(notify->buffer_size, notify->buffer); + g_slice_free(PyGIONotify, notify); } diff --git a/gio/goutputstream.override b/gio/goutputstream.override index 3b44632..df9ea94 100644 --- a/gio/goutputstream.override +++ b/gio/goutputstream.override @@ -130,9 +130,10 @@ _wrap_g_output_stream_write_async(PyGObject *self, if (!pygio_check_cancellable(pycancellable, &cancellable)) return NULL; + pygio_notify_copy_buffer(notify, buffer, count); g_output_stream_write_async(G_OUTPUT_STREAM(self->obj), - buffer, - count, + notify->buffer, + notify->buffer_size, io_priority, cancellable, (GAsyncReadyCallback)async_result_callback_marshal, |