diff options
author | Ajay Garg <ajay@activitycentral.com> | 2012-01-28 08:38:56 (GMT) |
---|---|---|
committer | Anish Mangal <anish@activitycentral.com> | 2012-04-27 10:02:36 (GMT) |
commit | 3830e3769d60f80886d299f6c969acebe619fa0a (patch) | |
tree | 3368f8985c87ed1b06f32ce27d01548838cb6c68 | |
parent | c3a7e5872ed2b60c6f62ed506568e41d4f04b8f7 (diff) |
sl#3286: race condition fixed by making the read- and write- calls pseudo synchronous.
-rw-r--r-- | 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): |