--- The workflow to read and write data has been made pseudo-synchronous.
The "write_async" call is executed, after the execution of "read_async" call; and the "next" "read_async" call is executed, after the "current" "write_async" call has been completed. Note that, the testing was done with the 860-bytes "__init__.py" file (http://bugs.sugarlabs.org/ticket/3286#comment:3) Without this patch, the buggy condition occurred about 7/10 times; with the patch applied, it occurred 0/30 times. src/jarabe/model/filetransfer.py | 37 +++++++++++++++++-------------------- 1 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/jarabe/model/filetransfer.py b/src/jarabe/model/filetransfer.py index 710c3a4..447a74a 100644 --- a/src/jarabe/model/filetransfer.py +++ b/src/jarabe/model/filetransfer.py @@ -70,46 +70,43 @@ class StreamSplicer(gobject.GObject): self._input_stream = input_stream self._output_stream = output_stream - self._pending_buffers = [] def start(self): self._input_stream.read_async(self._CHUNK_SIZE, self.__read_async_cb, gobject.PRIORITY_LOW) + """ + Fix for bug sl#3286. + + The workflow to read and write data has been made + pseudo-synchronous. + The "write_async" call is executed, after the execution + of "read_async" call; and the "next" "read_async" call + is executed, after the "current" "write_async" call has + been completed. + """ def __read_async_cb(self, input_stream, result): data = input_stream.read_finish(result) if not data: logging.debug('closing input stream') self._input_stream.close() - else: - self._pending_buffers.append(data) - self._input_stream.read_async(self._CHUNK_SIZE, - self.__read_async_cb, - gobject.PRIORITY_LOW) - self._write_next_buffer() - - def __write_async_cb(self, output_stream, result, user_data): - count_ = output_stream.write_finish(result) - - if not self._pending_buffers and \ - not self._output_stream.has_pending() and \ - not self._input_stream.has_pending(): logging.debug('closing output stream') - output_stream.close() + self._output_stream.close() self.emit('finished') else: - self._write_next_buffer() - - def _write_next_buffer(self): - if self._pending_buffers and not self._output_stream.has_pending(): - data = self._pending_buffers.pop(0) # TODO: we pass the buffer as user_data because of # http://bugzilla.gnome.org/show_bug.cgi?id=564102 self._output_stream.write_async(data, self.__write_async_cb, gobject.PRIORITY_LOW, user_data=data) + def __write_async_cb(self, output_stream, result, user_data): + output_stream.write_finish(result) + self._input_stream.read_async(self._CHUNK_SIZE, + self.__read_async_cb, + gobject.PRIORITY_LOW) + class BaseFileTransfer(gobject.GObject): -- 1.7.4.4 _______________________________________________ Sugar-devel mailing list [email protected] http://lists.sugarlabs.org/listinfo/sugar-devel

