summaryrefslogtreecommitdiff
path: root/core/java/android/os/Process.java
diff options
context:
space:
mode:
authorMarco Ballesio <balejs@google.com>2021-01-06 15:25:50 -0800
committerMarco Ballesio <balejs@google.com>2021-01-20 22:33:20 +0000
commit80a05232a04a5ef8df9f5e5fb0afd7471ea7eb38 (patch)
tree2152bede77cfef98c17cddaac1c005a5c513ea0d /core/java/android/os/Process.java
parent2dd4e12e5447c0a611fa0c076d4fbdb1d3237b93 (diff)
ActivityManager: don't freeze processes holding file locks
As a temporary measure waiting for the more robust b/176927978 to be implemented, query the file lock status of processes prior freezing them, and skip freeze if any locks are held. Test: verified form the logs that processes holding file locks are not frozen Bug: 176928302 Change-Id: Ib7e1715effb63c1b304ce22a9451294fd9f7b10d Merged-In: Ib7e1715effb63c1b304ce22a9451294fd9f7b10d
Diffstat (limited to 'core/java/android/os/Process.java')
-rw-r--r--core/java/android/os/Process.java38
1 files changed, 38 insertions, 0 deletions
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index efea9537c4cf..47598cf35974 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -31,8 +31,12 @@ import dalvik.system.VMRuntime;
import libcore.io.IoUtils;
+import java.io.BufferedReader;
import java.io.FileDescriptor;
+import java.io.FileReader;
+import java.io.IOException;
import java.util.Map;
+import java.util.StringTokenizer;
import java.util.concurrent.TimeoutException;
/**
@@ -1393,4 +1397,38 @@ public class Process {
}
private static native int nativePidFdOpen(int pid, int flags) throws ErrnoException;
+
+ /**
+ * Checks if a process corresponding to a specific pid owns any file locks.
+ * @param pid The process ID for which we want to know the existence of file locks.
+ * @return true If the process holds any file locks, false otherwise.
+ * @throws IOException if /proc/locks can't be accessed.
+ *
+ * @hide
+ */
+ public static boolean hasFileLocks(int pid) throws IOException {
+ BufferedReader br = null;
+
+ try {
+ br = new BufferedReader(new FileReader("/proc/locks"));
+ String line;
+
+ while ((line = br.readLine()) != null) {
+ StringTokenizer st = new StringTokenizer(line);
+
+ for (int i = 0; i < 5 && st.hasMoreTokens(); i++) {
+ String str = st.nextToken();
+ if (i == 4 && Integer.parseInt(str) == pid) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ } finally {
+ if (br != null) {
+ br.close();
+ }
+ }
+ }
}