summaryrefslogtreecommitdiff
path: root/paramiko/sftp_file.py
diff options
context:
space:
mode:
authorJeff Forcier <jeff@bitprophet.org>2016-04-24 22:03:53 -0700
committerJeff Forcier <jeff@bitprophet.org>2016-04-24 22:03:53 -0700
commit8740474f4dad288632135d38ce04d268a9a8ad65 (patch)
tree1fb80145cae129a3fbeb16ea2aedf3121634915e /paramiko/sftp_file.py
parent905e4a115f90a356df92394067d1b6c555c18fad (diff)
parent30dabfffe8f4e41d6d8f75fc7fbef32e55f15983 (diff)
downloadparamiko-8740474f4dad288632135d38ce04d268a9a8ad65.tar.gz
Merge branch '1.15' into 1.16
Diffstat (limited to 'paramiko/sftp_file.py')
-rw-r--r--paramiko/sftp_file.py20
1 files changed, 12 insertions, 8 deletions
diff --git a/paramiko/sftp_file.py b/paramiko/sftp_file.py
index c5b65488..fe0f8c79 100644
--- a/paramiko/sftp_file.py
+++ b/paramiko/sftp_file.py
@@ -459,8 +459,8 @@ class SFTPFile (BufferedFile):
# do these read requests in a temporary thread because there may be
# a lot of them, so it may block.
for offset, length in chunks:
+ num = self.sftp._async_request(self, CMD_READ, self.handle, long(offset), int(length))
with self._prefetch_lock:
- num = self.sftp._async_request(self, CMD_READ, self.handle, long(offset), int(length))
self._prefetch_extents[num] = (offset, length)
def _async_response(self, t, msg, num):
@@ -474,13 +474,17 @@ class SFTPFile (BufferedFile):
if t != CMD_DATA:
raise SFTPError('Expected data')
data = msg.get_string()
- with self._prefetch_lock:
- offset, length = self._prefetch_extents[num]
- self._prefetch_data[offset] = data
- del self._prefetch_extents[num]
- if len(self._prefetch_extents) == 0:
- self._prefetch_done = True
-
+ while True:
+ with self._prefetch_lock:
+ # spin if in race with _prefetch_thread
+ if num in self._prefetch_extents:
+ offset, length = self._prefetch_extents[num]
+ self._prefetch_data[offset] = data
+ del self._prefetch_extents[num]
+ if len(self._prefetch_extents) == 0:
+ self._prefetch_done = True
+ break
+
def _check_exception(self):
"""if there's a saved exception, raise & clear it"""
if self._saved_exception is not None: