1a326a116f7f9fb939fac3d28c80d32542016deccTim Murray/*
2a326a116f7f9fb939fac3d28c80d32542016deccTim Murray * Copyright (C) 2015 The Android Open Source Project
3a326a116f7f9fb939fac3d28c80d32542016deccTim Murray *
4a326a116f7f9fb939fac3d28c80d32542016deccTim Murray * Licensed under the Apache License, Version 2.0 (the "License");
5a326a116f7f9fb939fac3d28c80d32542016deccTim Murray * you may not use this file except in compliance with the License.
6a326a116f7f9fb939fac3d28c80d32542016deccTim Murray * You may obtain a copy of the License at
7a326a116f7f9fb939fac3d28c80d32542016deccTim Murray *
8a326a116f7f9fb939fac3d28c80d32542016deccTim Murray *      http://www.apache.org/licenses/LICENSE-2.0
9a326a116f7f9fb939fac3d28c80d32542016deccTim Murray *
10a326a116f7f9fb939fac3d28c80d32542016deccTim Murray * Unless required by applicable law or agreed to in writing, software
11a326a116f7f9fb939fac3d28c80d32542016deccTim Murray * distributed under the License is distributed on an "AS IS" BASIS,
12a326a116f7f9fb939fac3d28c80d32542016deccTim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a326a116f7f9fb939fac3d28c80d32542016deccTim Murray * See the License for the specific language governing permissions and
14a326a116f7f9fb939fac3d28c80d32542016deccTim Murray * limitations under the License.
15a326a116f7f9fb939fac3d28c80d32542016deccTim Murray */
16a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
17a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#define LOG_TAG "ActivityManagerService"
18a326a116f7f9fb939fac3d28c80d32542016deccTim Murray//#define LOG_NDEBUG 0
19a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
20a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <android_runtime/AndroidRuntime.h>
21a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <jni.h>
22a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
23a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <ScopedLocalRef.h>
24a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <ScopedPrimitiveArray.h>
25a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
26a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <cutils/log.h>
27a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <utils/misc.h>
28a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <utils/Log.h>
29a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
30a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <stdio.h>
31a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <errno.h>
32a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <fcntl.h>
33a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <semaphore.h>
34a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <stddef.h>
35a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <string.h>
36a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <sys/stat.h>
37a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <sys/types.h>
38a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#include <unistd.h>
39a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
40a326a116f7f9fb939fac3d28c80d32542016deccTim Murraynamespace android
41a326a116f7f9fb939fac3d28c80d32542016deccTim Murray{
42a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
43a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    // migrate from foreground to foreground_boost
44a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    static jint migrateToBoost(JNIEnv *env, jobject _this)
45a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    {
46a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#ifdef USE_SCHED_BOOST
47a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        // File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error
48a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        FILE* fg_cpuset_file = NULL;
49a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        int   boost_cpuset_fd = 0;
50a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        if (!access("/dev/cpuset/tasks", F_OK)) {
51a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            fg_cpuset_file = fopen("/dev/cpuset/foreground/tasks", "r+");
52a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            if (ferror(fg_cpuset_file)) {
53a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                return 0;
54a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            }
55a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            boost_cpuset_fd = open("/dev/cpuset/foreground/boost/tasks", O_WRONLY);
56a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            if (boost_cpuset_fd < 0) {
57a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                fclose(fg_cpuset_file);
58a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                return 0;
59a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            }
60a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
61a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        }
62a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        if (!fg_cpuset_file || !boost_cpuset_fd) {
63a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            fclose(fg_cpuset_file);
64a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            close(boost_cpuset_fd);
65a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            return 0;
66a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        }
67a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        char buf[17];
68a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        while (fgets(buf, 16, fg_cpuset_file)) {
69a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            int i = 0;
70a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            for (; i < 16; i++) {
71a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                if (buf[i] == '\n') {
72a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                    buf[i] = 0;
73a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                    break;
74a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                }
75a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            }
76a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            if (write(boost_cpuset_fd, buf, i) < 0) {
77a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                // ignore error
78a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            }
79a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            if (feof(fg_cpuset_file))
80a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                break;
81a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        }
82a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        fclose(fg_cpuset_file);
83a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        close(boost_cpuset_fd);
84a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#endif
85a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        return 0;
86a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    }
87a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
88a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    // migrate from foreground_boost to foreground
89a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    static jint migrateFromBoost(JNIEnv *env, jobject _this)
90a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    {
91a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#ifdef USE_SCHED_BOOST
92a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        // File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error
93a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        int   fg_cpuset_fd = 0;
94a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        FILE* boost_cpuset_file = NULL;
95a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        if (!access("/dev/cpuset/tasks", F_OK)) {
96a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            boost_cpuset_file = fopen("/dev/cpuset/foreground/boost/tasks", "r+");
97a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            if (ferror(boost_cpuset_file)) {
98a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                return 0;
99a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            }
100a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            fg_cpuset_fd = open("/dev/cpuset/foreground/tasks", O_WRONLY);
101a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            if (fg_cpuset_fd < 0) {
102a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                fclose(boost_cpuset_file);
103a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                return 0;
104a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            }
105a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
106a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        }
107a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        if (!boost_cpuset_file || !fg_cpuset_fd) {
108a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            fclose(boost_cpuset_file);
109a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            close(fg_cpuset_fd);
110a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            return 0;
111a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        }
112a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        char buf[17];
113a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        while (fgets(buf, 16, boost_cpuset_file)) {
114a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            //ALOGE("Appending FD %s to fg", buf);
115a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            int i = 0;
116a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            for (; i < 16; i++) {
117a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                if (buf[i] == '\n') {
118a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                    buf[i] = 0;
119a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                    break;
120a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                }
121a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            }
122a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            if (write(fg_cpuset_fd, buf, i) < 0) {
123a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                //ALOGE("Appending FD %s to fg ERROR", buf);
124a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                // handle error?
125a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            }
126a326a116f7f9fb939fac3d28c80d32542016deccTim Murray            if (feof(boost_cpuset_file))
127a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                break;
128a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        }
129a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
130a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        close(fg_cpuset_fd);
131a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        fclose(boost_cpuset_file);
132a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
133a326a116f7f9fb939fac3d28c80d32542016deccTim Murray#endif
134a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        return 0;
135a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
136a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    }
137a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
138a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
139a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    static JNINativeMethod method_table[] = {
140a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        { "nativeMigrateToBoost",   "()I", (void*)migrateToBoost },
141a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        { "nativeMigrateFromBoost", "()I", (void*)migrateFromBoost },
142a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    };
143a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
144a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    int register_android_server_ActivityManagerService(JNIEnv *env)
145a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    {
146a326a116f7f9fb939fac3d28c80d32542016deccTim Murray        return jniRegisterNativeMethods(env, "com/android/server/am/ActivityManagerService",
147a326a116f7f9fb939fac3d28c80d32542016deccTim Murray                                        method_table, NELEM(method_table));
148a326a116f7f9fb939fac3d28c80d32542016deccTim Murray    }
149a326a116f7f9fb939fac3d28c80d32542016deccTim Murray
150a326a116f7f9fb939fac3d28c80d32542016deccTim Murray}
151