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

Commit fb076789 authored by Tim Murray's avatar Tim Murray
Browse files

add android.os.Process.getRss()

This is necessary for low-impact logging useful for training.

Test: gets RSS correctly
bug 119789589

Change-Id: Ie32202ff9280208dbe967a22883d8ed1198fa724
parent 459e4069
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -1055,6 +1055,9 @@ public class Process {
     */
     */
    public static final native long getPss(int pid);
    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.
     * Specifies the outcome of having started a process.
     * @hide
     * @hide
+0 −6
Original line number Original line Diff line number Diff line
@@ -33,8 +33,6 @@
#include <iomanip>
#include <iomanip>
#include <string>
#include <string>


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


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

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


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


namespace android {
namespace android {


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


using UniqueFile = std::unique_ptr<FILE, decltype(&safeFclose)>;
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);
UniqueFile OpenSmapsOrRollup(int pid);


}  // namespace android
}  // namespace android
+34 −0
Original line number Original line Diff line number Diff line
@@ -1128,6 +1128,39 @@ static jlong android_os_Process_getPss(JNIEnv* env, jobject clazz, jint pid)
    return pss * 1024;
    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,
jintArray android_os_Process_getPidsForCommands(JNIEnv* env, jobject clazz,
        jobjectArray commandNames)
        jobjectArray commandNames)
{
{
@@ -1253,6 +1286,7 @@ static const JNINativeMethod methods[] = {
    {"parseProcLine", "([BII[I[Ljava/lang/String;[J[F)Z", (void*)android_os_Process_parseProcLine},
    {"parseProcLine", "([BII[I[Ljava/lang/String;[J[F)Z", (void*)android_os_Process_parseProcLine},
    {"getElapsedCpuTime", "()J", (void*)android_os_Process_getElapsedCpuTime},
    {"getElapsedCpuTime", "()J", (void*)android_os_Process_getElapsedCpuTime},
    {"getPss", "(I)J", (void*)android_os_Process_getPss},
    {"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},
    {"getPidsForCommands", "([Ljava/lang/String;)[I", (void*)android_os_Process_getPidsForCommands},
    //{"setApplicationObject", "(Landroid/os/IBinder;)V", (void*)android_os_Process_setApplicationObject},
    //{"setApplicationObject", "(Landroid/os/IBinder;)V", (void*)android_os_Process_setApplicationObject},
    {"killProcessGroup", "(II)I", (void*)android_os_Process_killProcessGroup},
    {"killProcessGroup", "(II)I", (void*)android_os_Process_killProcessGroup},