summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-12-17 18:21:06 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-12-17 18:21:06 +0000
commite6d63b94627d0072ff1468feca71698df1a0b64e (patch)
tree97f72b1703f86bb141d7e9d800bccec9096e1972 /core/java
parent6d41504d2c2111a55a4c06dd6b183318efd7c598 (diff)
parent894724be3026c84681cdc902cb62eab6ba646e11 (diff)
downloadframeworks_base-e6d63b94627d0072ff1468feca71698df1a0b64e.zip
frameworks_base-e6d63b94627d0072ff1468feca71698df1a0b64e.tar.gz
frameworks_base-e6d63b94627d0072ff1468feca71698df1a0b64e.tar.bz2
Merge "Rewrite selectReadable JNI in Java."
Diffstat (limited to 'core/java')
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java57
1 files changed, 26 insertions, 31 deletions
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 55e3f4a..dbacc84 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -16,6 +16,8 @@
package com.android.internal.os;
+import static android.system.OsConstants.POLLIN;
+import static android.system.OsConstants.POLLOUT;
import static android.system.OsConstants.S_IRWXG;
import static android.system.OsConstants.S_IRWXO;
@@ -32,6 +34,7 @@ import android.os.Trace;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
+import android.system.StructPollfd;
import android.util.EventLog;
import android.util.Log;
import android.util.Slog;
@@ -699,34 +702,36 @@ public class ZygoteInit {
private static void runSelectLoop(String abiList) throws MethodAndArgsCaller {
ArrayList<FileDescriptor> fds = new ArrayList<FileDescriptor>();
ArrayList<ZygoteConnection> peers = new ArrayList<ZygoteConnection>();
- FileDescriptor[] fdArray = new FileDescriptor[4];
fds.add(sServerSocket.getFileDescriptor());
peers.add(null);
while (true) {
- int index;
-
+ StructPollfd[] pollFds = new StructPollfd[fds.size()];
+ for (int i = 0; i < pollFds.length; ++i) {
+ pollFds[i] = new StructPollfd();
+ pollFds[i].fd = fds.get(i);
+ pollFds[i].events = (short) POLLIN;
+ }
try {
- fdArray = fds.toArray(fdArray);
- index = selectReadable(fdArray);
- } catch (IOException ex) {
- throw new RuntimeException("Error in select()", ex);
+ Os.poll(pollFds, -1);
+ } catch (ErrnoException ex) {
+ throw new RuntimeException("poll failed", ex);
}
-
- if (index < 0) {
- throw new RuntimeException("Error in select()");
- } else if (index == 0) {
- ZygoteConnection newPeer = acceptCommandPeer(abiList);
- peers.add(newPeer);
- fds.add(newPeer.getFileDesciptor());
- } else {
- boolean done;
- done = peers.get(index).runOnce();
-
- if (done) {
- peers.remove(index);
- fds.remove(index);
+ for (int i = pollFds.length - 1; i >= 0; --i) {
+ if ((pollFds[i].revents & POLLIN) == 0) {
+ continue;
+ }
+ if (i == 0) {
+ ZygoteConnection newPeer = acceptCommandPeer(abiList);
+ peers.add(newPeer);
+ fds.add(newPeer.getFileDesciptor());
+ } else {
+ boolean done = peers.get(i).runOnce();
+ if (done) {
+ peers.remove(i);
+ fds.remove(i);
+ }
}
}
}
@@ -767,16 +772,6 @@ public class ZygoteInit {
static native int getpgid(int pid) throws IOException;
/**
- * Invokes select() on the provider array of file descriptors (selecting
- * for readability only). Array elements of null are ignored.
- *
- * @param fds non-null; array of readable file descriptors
- * @return index of descriptor that is now readable or -1 for empty array.
- * @throws IOException if an error occurs
- */
- static native int selectReadable(FileDescriptor[] fds) throws IOException;
-
- /**
* Class not instantiable.
*/
private ZygoteInit() {