@@ -99,18 +99,30 @@ def use_region(self, offset, size, _is_recursive=False):
9999 # END check existing region
100100
101101 if need_region :
102+ window_size = man ._window_size
103+
102104 # abort on offsets beyond our mapped file's size - currently we are invalid
103105 if offset >= self .file_size ():
104106 return self
105107 # END handle offset too large
106108
107109 existing_region = None
108- for region in self ._rlist :
109- if region .includes_ofs (offset ):
110- existing_region = region
111- break
112- #END handle existing region
113- #END for each existing region
110+ a = self ._rlist
111+ lo = 0
112+ hi = len (a )
113+ while lo < hi :
114+ mid = (lo + hi )// 2
115+ ofs = a [mid ]._b
116+ if ofs <= offset :
117+ if a [mid ].includes_ofs (offset ):
118+ existing_region = a [mid ]
119+ break
120+ #END have region
121+ lo = mid + 1
122+ else :
123+ hi = mid
124+ #END handle position
125+ #END while bisecting
114126
115127 if existing_region is None :
116128 left = MemoryWindow (0 , 0 )
@@ -119,20 +131,23 @@ def use_region(self, offset, size, _is_recursive=False):
119131
120132 # we want to honor the max memory size, and assure we have anough
121133 # memory available
122- man ._collect_lru_region (man .window_size ())
134+ # Save calls !
135+ if self ._manager ._memory_size + window_size > self ._manager ._max_memory_size :
136+ man ._collect_lru_region (window_size )
137+ #END handle collection
123138
124139 # we assume the list remains sorted by offset
125140 insert_pos = 0
126- len_regions = len (self . _rlist )
141+ len_regions = len (a )
127142 if len_regions == 1 :
128- if self . _rlist [0 ].ofs_begin () <= offset :
143+ if a [0 ]._b <= offset :
129144 insert_pos = 1
130145 #END maintain sort
131146 else :
132147 # find insert position
133148 insert_pos = len_regions
134- for i , region in enumerate (self . _rlist ):
135- if region .ofs_begin () > offset :
149+ for i , region in enumerate (a ):
150+ if region ._b > offset :
136151 insert_pos = i
137152 break
138153 #END if insert position is correct
@@ -143,17 +158,17 @@ def use_region(self, offset, size, _is_recursive=False):
143158 # possible mapping
144159 if insert_pos == 0 :
145160 if len_regions :
146- right = MemoryWindow .from_region (self . _rlist [insert_pos ])
161+ right = MemoryWindow .from_region (a [insert_pos ])
147162 #END adjust right side
148163 else :
149164 if insert_pos != len_regions :
150- right = MemoryWindow .from_region (self . _rlist [insert_pos ])
165+ right = MemoryWindow .from_region (a [insert_pos ])
151166 # END adjust right window
152- left = MemoryWindow .from_region (self . _rlist [insert_pos - 1 ])
167+ left = MemoryWindow .from_region (a [insert_pos - 1 ])
153168 #END adjust surrounding windows
154169
155- mid .extend_left_to (left , man . _window_size )
156- mid .extend_right_to (right , man . _window_size )
170+ mid .extend_left_to (left , window_size )
171+ mid .extend_right_to (right , window_size )
157172 mid .align ()
158173
159174 # it can happen that we align beyond the end of the file
@@ -166,7 +181,7 @@ def use_region(self, offset, size, _is_recursive=False):
166181 if man ._handle_count >= man ._max_handle_count :
167182 raise Exception
168183 #END assert own imposed max file handles
169- self ._region = MappedRegion (self . _rlist .path (), mid .ofs , mid .size )
184+ self ._region = MappedRegion (a .path (), mid .ofs , mid .size )
170185 except Exception :
171186 # apparently we are out of system resources or hit a limit
172187 # As many more operations are likely to fail in that condition (
@@ -185,14 +200,14 @@ def use_region(self, offset, size, _is_recursive=False):
185200
186201 man ._handle_count += 1
187202 man ._memory_size += self ._region .size ()
188- self . _rlist .insert (insert_pos , self ._region )
203+ a .insert (insert_pos , self ._region )
189204 else :
190205 self ._region = existing_region
191206 #END need region handling
192207 #END handle acquire region
193208
194209 self ._region .increment_usage_count ()
195- self ._ofs = offset - self ._region .ofs_begin ()
210+ self ._ofs = offset - self ._region ._b
196211 self ._size = min (size , self ._region .ofs_end () - offset )
197212
198213 return self
@@ -220,12 +235,12 @@ def is_associated(self):
220235
221236 def ofs_begin (self ):
222237 """:return: offset to the first byte pointed to by our cursor"""
223- return self ._region .ofs_begin () + self ._ofs
238+ return self ._region ._b + self ._ofs
224239
225240 def ofs_end (self ):
226241 """:return: offset to one past the last available byte"""
227242 # unroll method calls for performance !
228- return self ._region .ofs_begin () + self ._ofs + self ._size
243+ return self ._region ._b + self ._ofs + self ._size
229244
230245 def size (self ):
231246 """:return: amount of bytes we point to"""
@@ -241,10 +256,9 @@ def region_ref(self):
241256 def includes_ofs (self , ofs ):
242257 """:return: True if the given absolute offset is contained in the cursors
243258 current region
244- :note: always False if the cursor does not point to a valid region"""
245- if self ._region is None :
246- return False
247- return self .ofs_begin () <= ofs < self .ofs_end ()
259+ :note: cursor must be valid for this to work"""
260+ # unroll methods
261+ return (self ._region ._b + self ._ofs ) <= ofs < (self ._region ._b + self ._ofs + self ._size )
248262
249263 def file_size (self ):
250264 """:return: size of the underlying file"""
@@ -327,7 +341,7 @@ def _collect_lru_region(self, size):
327341 for region in regions :
328342 # check client count - consider that we keep one reference ourselves !
329343 if (region .client_count ()- 2 == 0 and
330- (lru_region is None or region .usage_count () < lru_region .usage_count () )):
344+ (lru_region is None or region ._uc < lru_region ._uc )):
331345 lru_region = region
332346 lru_list = regions
333347 # END update lru_region
0 commit comments