Work around Os.write() not updating position

ByteBuffer position is not updated as expected by Os.write() on old
Android versions. Count the remaining bytes manually.
This commit is contained in:
Barry 2018-11-18 19:07:31 +08:00
parent 3a390b02fa
commit d61f0521d0

View file

@ -14,9 +14,18 @@ public class IO {
}
public static void writeFully(FileDescriptor fd, ByteBuffer from) throws IOException {
while (from.hasRemaining()) {
// ByteBuffer position is not updated as expected by Os.write() on old Android versions, so
// count the remaining bytes manually.
// See <https://github.com/Genymobile/scrcpy/issues/291>.
int remaining = from.remaining();
while (remaining > 0) {
try {
Os.write(fd, from);
int w = Os.write(fd, from);
if (BuildConfig.DEBUG && w < 0) {
// w should not be negative, since an exception is thrown on error
throw new AssertionError("Os.write() returned a negative value (" + w + ")");
}
remaining -= w;
} catch (ErrnoException e) {
if (e.errno != OsConstants.EINTR) {
throw new IOException(e);