summaryrefslogtreecommitdiffstats
path: root/luni
diff options
context:
space:
mode:
authorJP Abgrall <jpa@google.com>2011-11-28 18:19:40 -0800
committerAndroid Git Automerger <android-git-automerger@android.com>2011-11-28 18:19:40 -0800
commit064280307728e963cd9bf08796c8863127254ff0 (patch)
tree0be6cf4212e634e0a7c5770dd670a1aeca1e21db /luni
parent6b17c8491886a24993167a619ab44afa7505800c (diff)
parent4ff585466887785d48c02d14a15dcde64934442b (diff)
downloadlibcore-064280307728e963cd9bf08796c8863127254ff0.zip
libcore-064280307728e963cd9bf08796c8863127254ff0.tar.gz
libcore-064280307728e963cd9bf08796c8863127254ff0.tar.bz2
am 4ff58546: libcore: BlockGuard: untag socket on close
* commit '4ff585466887785d48c02d14a15dcde64934442b': libcore: BlockGuard: untag socket on close
Diffstat (limited to 'luni')
-rw-r--r--luni/src/main/java/libcore/io/BlockGuardOs.java23
1 files changed, 18 insertions, 5 deletions
diff --git a/luni/src/main/java/libcore/io/BlockGuardOs.java b/luni/src/main/java/libcore/io/BlockGuardOs.java
index 07ee520..4f2858d 100644
--- a/luni/src/main/java/libcore/io/BlockGuardOs.java
+++ b/luni/src/main/java/libcore/io/BlockGuardOs.java
@@ -42,6 +42,14 @@ public class BlockGuardOs extends ForwardingOs {
}
}
+ private void untagSocket(FileDescriptor fd) throws ErrnoException {
+ try {
+ SocketTagger.get().untag(fd);
+ } catch (SocketException e) {
+ throw new ErrnoException("socket", EINVAL, e);
+ }
+ }
+
@Override public FileDescriptor accept(FileDescriptor fd, InetSocketAddress peerAddress) throws ErrnoException {
BlockGuard.getThreadPolicy().onNetwork();
return tagSocket(os.accept(fd, peerAddress));
@@ -49,11 +57,14 @@ public class BlockGuardOs extends ForwardingOs {
@Override public void close(FileDescriptor fd) throws ErrnoException {
try {
- if (S_ISSOCK(Libcore.os.fstat(fd).st_mode) && isLingerSocket(fd)) {
- // If the fd is a socket with SO_LINGER set, we might block indefinitely.
- // We allow non-linger sockets so that apps can close their network connections in
- // methods like onDestroy which will run on the UI thread.
- BlockGuard.getThreadPolicy().onNetwork();
+ if (S_ISSOCK(Libcore.os.fstat(fd).st_mode)) {
+ if (isLingerSocket(fd)) {
+ // If the fd is a socket with SO_LINGER set, we might block indefinitely.
+ // We allow non-linger sockets so that apps can close their network
+ // connections in methods like onDestroy which will run on the UI thread.
+ BlockGuard.getThreadPolicy().onNetwork();
+ }
+ untagSocket(fd);
}
} catch (ErrnoException ignored) {
// We're called via Socket.close (which doesn't ask for us to be called), so we
@@ -74,6 +85,8 @@ public class BlockGuardOs extends ForwardingOs {
os.connect(fd, address, port);
}
+ // TODO: Untag newFd when needed for dup2(FileDescriptor oldFd, int newFd)
+
@Override public void fdatasync(FileDescriptor fd) throws ErrnoException {
BlockGuard.getThreadPolicy().onWriteToDisk();
os.fdatasync(fd);