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