Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAjay Garg <ajay@activitycentral.com>2012-01-28 08:38:56 (GMT)
committer Anish Mangal <anish@activitycentral.com>2012-04-27 10:02:36 (GMT)
commit3830e3769d60f80886d299f6c969acebe619fa0a (patch)
tree3368f8985c87ed1b06f32ce27d01548838cb6c68
parentc3a7e5872ed2b60c6f62ed506568e41d4f04b8f7 (diff)
sl#3286: race condition fixed by making the read- and write- calls pseudo synchronous.
-rw-r--r--src/jarabe/model/filetransfer.py37
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):