diff options
5 files changed, 65 insertions, 0 deletions
diff --git a/core/java/android/bluetooth/BluetoothOutputStream.java b/core/java/android/bluetooth/BluetoothOutputStream.java index a0aa2dee9d34..dfec4e102fd4 100644 --- a/core/java/android/bluetooth/BluetoothOutputStream.java +++ b/core/java/android/bluetooth/BluetoothOutputStream.java @@ -75,4 +75,16 @@ import java.io.OutputStream; } mSocket.write(b, offset, count); } + + /** + * Wait until the data in sending queue is emptied. A polling version + * for flush implementation. Use it to ensure the writing data afterwards will + * be packed in the new RFCOMM frame. + * + * @throws IOException if an i/o error occurs. + * @since Android 4.2.3 + */ + public void flush() throws IOException { + mSocket.flush(); + } } diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java index 760166bfcc5d..a6e3153d6af7 100644 --- a/core/java/android/bluetooth/BluetoothSocket.java +++ b/core/java/android/bluetooth/BluetoothSocket.java @@ -515,6 +515,20 @@ public final class BluetoothSocket implements Closeable { return mSocketIS.available(); } + /** + * Wait until the data in sending queue is emptied. A polling version + * for flush implementation. Used to ensure the writing data afterwards will + * be packed in new RFCOMM frame. + * + * @throws IOException if an i/o error occurs. + */ + @UnsupportedAppUsage + /*package*/ void flush() throws IOException { + if (mSocketOS == null) throw new IOException("flush is called on null OutputStream"); + if (VDBG) Log.d(TAG, "flush: " + mSocketOS); + mSocketOS.flush(); + } + /*package*/ int read(byte[] b, int offset, int length) throws IOException { int ret = 0; if (VDBG) Log.d(TAG, "read in: " + mSocketIS + " len: " + length); diff --git a/core/java/android/net/LocalSocketImpl.java b/core/java/android/net/LocalSocketImpl.java index b066a15106af..fe7632c25445 100644 --- a/core/java/android/net/LocalSocketImpl.java +++ b/core/java/android/net/LocalSocketImpl.java @@ -157,6 +157,40 @@ class LocalSocketImpl write_native(b, myFd); } } + + /** + * Wait until the data in sending queue is emptied. A polling version + * for flush implementation. + * @throws IOException + * if an i/o error occurs. + */ + @Override + public void flush() throws IOException { + FileDescriptor myFd = fd; + if (myFd == null) throw new IOException("socket closed"); + + // Loop until the output buffer is empty. + Int32Ref pending = new Int32Ref(0); + while (true) { + try { + // See linux/net/unix/af_unix.c + Os.ioctlInt(myFd, OsConstants.TIOCOUTQ, pending); + } catch (ErrnoException e) { + throw e.rethrowAsIOException(); + } + + if (pending.value <= 0) { + // The output buffer is empty. + break; + } + + try { + Thread.sleep(10); + } catch (InterruptedException ie) { + break; + } + } + } } private native int read_native(FileDescriptor fd) throws IOException; diff --git a/services/core/java/com/android/server/RecoverySystemService.java b/services/core/java/com/android/server/RecoverySystemService.java index 997178e1582b..1517887efec2 100644 --- a/services/core/java/com/android/server/RecoverySystemService.java +++ b/services/core/java/com/android/server/RecoverySystemService.java @@ -25,12 +25,15 @@ import android.os.PowerManager; import android.os.RecoverySystem; import android.os.RemoteException; import android.os.SystemProperties; +import android.system.ErrnoException; +import android.system.Os; import android.util.Slog; import libcore.io.IoUtils; import java.io.DataInputStream; import java.io.DataOutputStream; +import java.io.File; import java.io.FileWriter; import java.io.IOException; @@ -285,6 +288,7 @@ public final class RecoverySystemService extends SystemService { byte[] cmdUtf8 = command.getBytes("UTF-8"); dos.writeInt(cmdUtf8.length); dos.write(cmdUtf8, 0, cmdUtf8.length); + dos.flush(); } // Read the status from the socket. diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 063ad75fe7e2..1bd29e51b8e2 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -2082,6 +2082,7 @@ public class Vpn { } out.write(0xFF); out.write(0xFF); + out.flush(); // Wait for End-of-File. InputStream in = mSockets[i].getInputStream(); |