Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8faacd38 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "add android.os.Process.getRss()"

parents 11cf88e2 fb076789
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1055,6 +1055,9 @@ public class Process {
     */
    public static final native long getPss(int pid);

    /** @hide */
    public static final native long[] getRss(int pid);

    /**
     * Specifies the outcome of having started a process.
     * @hide
+0 −6
Original line number Diff line number Diff line
@@ -33,8 +33,6 @@
#include <iomanip>
#include <string>

#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
#include <debuggerd/client.h>
#include <log/log.h>
#include <utils/misc.h>
@@ -50,10 +48,6 @@
namespace android
{

static inline UniqueFile MakeUniqueFile(const char* path, const char* mode) {
    return UniqueFile(fopen(path, mode), safeFclose);
}

enum {
    HEAP_UNKNOWN,
    HEAP_DALVIK,
+7 −0
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@

#include <memory>
#include <stdio.h>
#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>

namespace android {

@@ -27,6 +29,11 @@ inline void safeFclose(FILE* fp) {
}

using UniqueFile = std::unique_ptr<FILE, decltype(&safeFclose)>;

inline UniqueFile MakeUniqueFile(const char* path, const char* mode) {
    return UniqueFile(fopen(path, mode), safeFclose);
}

UniqueFile OpenSmapsOrRollup(int pid);

}  // namespace android
+34 −0
Original line number Diff line number Diff line
@@ -1128,6 +1128,39 @@ static jlong android_os_Process_getPss(JNIEnv* env, jobject clazz, jint pid)
    return pss * 1024;
}

static jlongArray android_os_Process_getRss(JNIEnv* env, jobject clazz, jint pid)
{
    // total, file, anon, swap
    jlong rss[4] = {0, 0, 0, 0};
    std::string status_path =
            android::base::StringPrintf("/proc/%d/status", pid);
    UniqueFile file = MakeUniqueFile(status_path.c_str(), "re");

    char line[256];
    while (fgets(line, sizeof(line), file.get())) {
        jlong v;
        if ( sscanf(line, "VmRSS: %" SCNd64 " kB", &v) == 1) {
            rss[0] = v;
        } else if ( sscanf(line, "RssFile: %" SCNd64 " kB", &v) == 1) {
            rss[1] = v;
        } else if ( sscanf(line, "RssAnon: %" SCNd64 " kB", &v) == 1) {
            rss[2] = v;
        } else if ( sscanf(line, "VmSwap: %" SCNd64 " kB", &v) == 1) {
            rss[3] = v;
        }
    }

    jlongArray rssArray = env->NewLongArray(4);
    if (rssArray == NULL) {
        jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
        return NULL;
    }

    env->SetLongArrayRegion(rssArray, 0, 4, rss);

    return rssArray;
}

jintArray android_os_Process_getPidsForCommands(JNIEnv* env, jobject clazz,
        jobjectArray commandNames)
{
@@ -1253,6 +1286,7 @@ static const JNINativeMethod methods[] = {
    {"parseProcLine", "([BII[I[Ljava/lang/String;[J[F)Z", (void*)android_os_Process_parseProcLine},
    {"getElapsedCpuTime", "()J", (void*)android_os_Process_getElapsedCpuTime},
    {"getPss", "(I)J", (void*)android_os_Process_getPss},
    {"getRss", "(I)[J", (void*)android_os_Process_getRss},
    {"getPidsForCommands", "([Ljava/lang/String;)[I", (void*)android_os_Process_getPidsForCommands},
    //{"setApplicationObject", "(Landroid/os/IBinder;)V", (void*)android_os_Process_setApplicationObject},
    {"killProcessGroup", "(II)I", (void*)android_os_Process_killProcessGroup},