Read data into *buf* with at most one system call.
(self, buf, read1)
| 1169 | # similar to the io implementation (which implements the methods for |
| 1170 | # performance reasons). |
| 1171 | def _readinto(self, buf, read1): |
| 1172 | """Read data into *buf* with at most one system call.""" |
| 1173 | |
| 1174 | self._checkClosed("readinto of closed file") |
| 1175 | |
| 1176 | # Need to create a memoryview object of type 'b', otherwise |
| 1177 | # we may not be able to assign bytes to it, and slicing it |
| 1178 | # would create a new object. |
| 1179 | if not isinstance(buf, memoryview): |
| 1180 | buf = memoryview(buf) |
| 1181 | if buf.nbytes == 0: |
| 1182 | return 0 |
| 1183 | buf = buf.cast('B') |
| 1184 | |
| 1185 | written = 0 |
| 1186 | with self._read_lock: |
| 1187 | while written < len(buf): |
| 1188 | |
| 1189 | # First try to read from internal buffer |
| 1190 | avail = min(len(self._read_buf) - self._read_pos, len(buf)) |
| 1191 | if avail: |
| 1192 | buf[written:written+avail] = \ |
| 1193 | self._read_buf[self._read_pos:self._read_pos+avail] |
| 1194 | self._read_pos += avail |
| 1195 | written += avail |
| 1196 | if written == len(buf): |
| 1197 | break |
| 1198 | |
| 1199 | # If remaining space in callers buffer is larger than |
| 1200 | # internal buffer, read directly into callers buffer |
| 1201 | if len(buf) - written > self.buffer_size: |
| 1202 | n = self.raw.readinto(buf[written:]) |
| 1203 | if not n: |
| 1204 | break # eof |
| 1205 | written += n |
| 1206 | |
| 1207 | # Otherwise refill internal buffer - unless we're |
| 1208 | # in read1 mode and already got some data |
| 1209 | elif not (read1 and written): |
| 1210 | if not self._peek_unlocked(1): |
| 1211 | break # eof |
| 1212 | |
| 1213 | # In readinto1 mode, return as soon as we have some data |
| 1214 | if read1 and written: |
| 1215 | break |
| 1216 | |
| 1217 | return written |
| 1218 | |
| 1219 | def tell(self): |
| 1220 | # GH-95782: Keep return value non-negative |
nothing calls this directly
no test coverage detected