Merge "Protect SparseImage._GetRangeData() with lock"

This commit is contained in:
Tianjie Xu 2018-01-30 23:34:50 +00:00 committed by Gerrit Code Review
commit 5edd2821de
2 changed files with 36 additions and 36 deletions

View File

@ -776,8 +776,6 @@ class BlockImageDiff(object):
src_ranges = xf.src_ranges
tgt_ranges = xf.tgt_ranges
# Needs lock since WriteRangeDataToFd() is stateful (calling seek).
with lock:
src_file = common.MakeTempFile(prefix="src-")
with open(src_file, "wb") as fd:
self.src.WriteRangeDataToFd(src_ranges, fd)
@ -1430,7 +1428,6 @@ class BlockImageDiff(object):
src_file = common.MakeTempFile(prefix="src-")
tgt_file = common.MakeTempFile(prefix="tgt-")
with transfer_lock:
with open(src_file, "wb") as src_fd:
self.src.WriteRangeDataToFd(src_ranges, src_fd)
with open(tgt_file, "wb") as tgt_fd:

View File

@ -15,6 +15,7 @@
import bisect
import os
import struct
import threading
from hashlib import sha1
import rangelib
@ -111,6 +112,8 @@ class SparseImage(object):
raise ValueError("Unknown chunk type 0x%04X not supported" %
(chunk_type,))
self.generator_lock = threading.Lock()
self.care_map = rangelib.RangeSet(care_data)
self.offset_index = [i[0] for i in offset_map]
@ -173,11 +176,11 @@ class SparseImage(object):
particular is not necessarily equal to the number of ranges in
'ranges'.
This generator is stateful -- it depends on the open file object
contained in this SparseImage, so you should not try to run two
Use a lock to protect the generator so that we will not run two
instances of this generator on the same object simultaneously."""
f = self.simg_f
with self.generator_lock:
for s, e in ranges:
to_read = e-s
idx = bisect.bisect_right(self.offset_index, s) - 1