diff options
-rw-r--r-- | cmds/atrace/atrace.cpp | 1 | ||||
-rw-r--r-- | cmds/dumpstate/dumpstate.c | 14 | ||||
-rw-r--r-- | include/gui/SensorManager.h | 26 | ||||
-rw-r--r-- | libs/gui/SensorManager.cpp | 93 | ||||
-rw-r--r-- | services/sensorservice/SensorService.cpp | 9 | ||||
-rw-r--r-- | services/surfaceflinger/Android.mk | 4 | ||||
-rw-r--r-- | services/surfaceflinger/main_surfaceflinger.cpp | 7 |
7 files changed, 44 insertions, 110 deletions
diff --git a/cmds/atrace/atrace.cpp b/cmds/atrace/atrace.cpp index 26c5b4ac35..7201e77ca5 100644 --- a/cmds/atrace/atrace.cpp +++ b/cmds/atrace/atrace.cpp @@ -93,6 +93,7 @@ static const TracingCategory k_categories[] = { { "sched", "CPU Scheduling", 0, { { REQ, "/sys/kernel/debug/tracing/events/sched/sched_switch/enable" }, { REQ, "/sys/kernel/debug/tracing/events/sched/sched_wakeup/enable" }, + { OPT, "/sys/kernel/debug/tracing/events/sched/sched_blocked_reason/enable" }, } }, { "irq", "IRQ Events", 0, { { REQ, "/sys/kernel/debug/tracing/events/irq/enable" }, diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c index b88b60551a..a2e4f4bd59 100644 --- a/cmds/dumpstate/dumpstate.c +++ b/cmds/dumpstate/dumpstate.c @@ -262,6 +262,8 @@ static unsigned long logcat_timeout(char *name) { /* End copy from system/core/logd/LogBuffer.cpp */ +static const unsigned long logcat_min_timeout = 40000; /* ms */ + /* dumps the current system state to stdout */ static void dumpstate() { unsigned long timeout; @@ -334,18 +336,18 @@ static void dumpstate() { // dump_file("EVENT LOG TAGS", "/etc/event-log-tags"); // calculate timeout timeout = logcat_timeout("main") + logcat_timeout("system") + logcat_timeout("crash"); - if (timeout < 20000) { - timeout = 20000; + if (timeout < logcat_min_timeout) { + timeout = logcat_min_timeout; } run_command("SYSTEM LOG", timeout / 1000, "logcat", "-v", "threadtime", "-d", "*:v", NULL); timeout = logcat_timeout("events"); - if (timeout < 20000) { - timeout = 20000; + if (timeout < logcat_min_timeout) { + timeout = logcat_min_timeout; } run_command("EVENT LOG", timeout / 1000, "logcat", "-b", "events", "-v", "threadtime", "-d", "*:v", NULL); timeout = logcat_timeout("radio"); - if (timeout < 20000) { - timeout = 20000; + if (timeout < logcat_min_timeout) { + timeout = logcat_min_timeout; } run_command("RADIO LOG", timeout / 1000, "logcat", "-b", "radio", "-v", "threadtime", "-d", "*:v", NULL); diff --git a/include/gui/SensorManager.h b/include/gui/SensorManager.h index f039caf36f..0cff46c076 100644 --- a/include/gui/SensorManager.h +++ b/include/gui/SensorManager.h @@ -22,11 +22,9 @@ #include <stdint.h> #include <sys/types.h> -#include <binder/BinderService.h> #include <binder/IBinder.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> -#include <binder/PermissionCache.h> #include <utils/Errors.h> #include <utils/RefBase.h> @@ -56,8 +54,7 @@ public: static SensorManager& getInstanceForPackage(const String16& packageName); ~SensorManager(); - ssize_t getSensorList(Sensor const* const** list); - ssize_t getAvailableSensorList(Sensor const* const** list); + ssize_t getSensorList(Sensor const* const** list) const; Sensor const* getDefaultSensor(int type); sp<SensorEventQueue> createEventQueue(String8 packageName = String8(""), int mode = 0); bool isDataInjectionEnabled(); @@ -67,27 +64,18 @@ private: void sensorManagerDied(); SensorManager(const String16& opPackageName); - status_t assertStateLocked(); - void updateAvailableSensorList(); + status_t assertStateLocked() const; private: static Mutex sLock; static std::map<String16, SensorManager*> sPackageInstances; - Mutex mLock; - sp<ISensorServer> mSensorServer; - - // for Java API - Sensor const** mSensorList; - - // for NDK API - Sensor const** mAvailableSensorList; - ssize_t mNumAvailableSensor; - - Vector<Sensor> mSensors; - sp<IBinder::DeathRecipient> mDeathObserver; + mutable Mutex mLock; + mutable sp<ISensorServer> mSensorServer; + mutable Sensor const** mSensorList; + mutable Vector<Sensor> mSensors; + mutable sp<IBinder::DeathRecipient> mDeathObserver; const String16 mOpPackageName; - bool mBodyPermission; }; // ---------------------------------------------------------------------------- diff --git a/libs/gui/SensorManager.cpp b/libs/gui/SensorManager.cpp index 4277032fa7..33608b5bd2 100644 --- a/libs/gui/SensorManager.cpp +++ b/libs/gui/SensorManager.cpp @@ -89,8 +89,7 @@ SensorManager& SensorManager::getInstanceForPackage(const String16& packageName) } SensorManager::SensorManager(const String16& opPackageName) - : mSensorList(NULL), mAvailableSensorList(NULL), mNumAvailableSensor(0), - mOpPackageName(opPackageName), mBodyPermission(false) + : mSensorList(0), mOpPackageName(opPackageName) { // okay we're not locked here, but it's not needed during construction assertStateLocked(); @@ -99,9 +98,6 @@ SensorManager::SensorManager(const String16& opPackageName) SensorManager::~SensorManager() { free(mSensorList); - if (mAvailableSensorList) { - free(mAvailableSensorList); - } } void SensorManager::sensorManagerDied() @@ -110,14 +106,10 @@ void SensorManager::sensorManagerDied() mSensorServer.clear(); free(mSensorList); mSensorList = NULL; - if (mAvailableSensorList) { - free(mAvailableSensorList); - mAvailableSensorList = NULL; - } mSensors.clear(); } -status_t SensorManager::assertStateLocked() { +status_t SensorManager::assertStateLocked() const { bool initSensorManager = false; if (mSensorServer == NULL) { initSensorManager = true; @@ -167,14 +159,13 @@ status_t SensorManager::assertStateLocked() { for (size_t i=0 ; i<count ; i++) { mSensorList[i] = mSensors.array() + i; } - - updateAvailableSensorList(); } return NO_ERROR; } -ssize_t SensorManager::getSensorList(Sensor const* const** list) { +ssize_t SensorManager::getSensorList(Sensor const* const** list) const +{ Mutex::Autolock _l(mLock); status_t err = assertStateLocked(); if (err < 0) { @@ -184,76 +175,10 @@ ssize_t SensorManager::getSensorList(Sensor const* const** list) { return static_cast<ssize_t>(mSensors.size()); } -void SensorManager::updateAvailableSensorList() { - const int uid = static_cast<int>(IPCThreadState::self()->getCallingUid()); - const int pid = static_cast<int>(IPCThreadState::self()->getCallingPid()); - const String16 BODY_SENSOR_PERMISSION("android.permission.BODY_SENSORS"); - const String8 BODY_SENSOR_PERMISSION8("android.permission.BODY_SENSORS"); - - bool bodySensorPermission = false; - - sp<IBinder> binder = defaultServiceManager()->getService(String16("permission")); - if (binder != NULL) { - bodySensorPermission = interface_cast<IPermissionController>(binder)-> - checkPermission(BODY_SENSOR_PERMISSION, pid, uid); - } - - // only update if app got BODY_SENSORS permission after last call or the sensor list has not - // been populated. - // - // it is not possible for the reverse transition, as the app will be killed when permission is - // revoked. - if ( (bodySensorPermission && !mBodyPermission) || mAvailableSensorList == NULL) { - - // allocate only when necessary - if (mAvailableSensorList == NULL) { - // allocate a list big enough to fit all sensors (including those requires permission - // that the app do not have; - mAvailableSensorList = - static_cast<Sensor const**>(malloc(mSensors.size() * sizeof(Sensor*))); - - // first populate all sensors that do not need body sensor permission - ssize_t& n = mNumAvailableSensor; - for (size_t i = 0; i < mSensors.size() ; i++) { - if (mSensors[i].getRequiredPermission() != BODY_SENSOR_PERMISSION8) { - mAvailableSensorList[n++] = mSensors.array() + i; - } - } - } - - if (bodySensorPermission) { - // if the app just got the sensor permission back, fill the sensor at the end of list - ssize_t& n = mNumAvailableSensor; - for (size_t i = 0; i < mSensors.size() ; i++) { - if (mSensors[i].getRequiredPermission() == BODY_SENSOR_PERMISSION8) { - mAvailableSensorList[n++] = mSensors.array() + i; - } - } - } - - mBodyPermission = bodySensorPermission; - } -} - -ssize_t SensorManager::getAvailableSensorList(Sensor const* const** list) { - Mutex::Autolock _l(mLock); - status_t err = assertStateLocked(); - if (err < 0) { - return static_cast<ssize_t>(err); - } - - updateAvailableSensorList(); - - *list = mAvailableSensorList; - return mNumAvailableSensor; -} - -Sensor const* SensorManager::getDefaultSensor(int type) { +Sensor const* SensorManager::getDefaultSensor(int type) +{ Mutex::Autolock _l(mLock); if (assertStateLocked() == NO_ERROR) { - - updateAvailableSensorList(); - bool wakeUpSensor = false; // For the following sensor types, return a wake-up sensor. These types are by default // defined as wake-up sensors. For the rest of the sensor types defined in sensors.h return @@ -267,9 +192,9 @@ Sensor const* SensorManager::getDefaultSensor(int type) { // in the future it will make sense to let the SensorService make // that decision. for (size_t i=0 ; i<mSensors.size() ; i++) { - if (mAvailableSensorList[i]->getType() == type && - mAvailableSensorList[i]->isWakeUpSensor() == wakeUpSensor) { - return mAvailableSensorList[i]; + if (mSensorList[i]->getType() == type && + mSensorList[i]->isWakeUpSensor() == wakeUpSensor) { + return mSensorList[i]; } } } diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 956d8e8653..fd72b2312f 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -723,7 +723,14 @@ Vector<Sensor> SensorService::getSensorList(const String16& opPackageName) Vector<Sensor> accessibleSensorList; for (size_t i = 0; i < initialSensorList.size(); i++) { Sensor sensor = initialSensorList[i]; - accessibleSensorList.add(sensor); + if (canAccessSensor(sensor, "getSensorList", opPackageName)) { + accessibleSensorList.add(sensor); + } else { + ALOGI("Skipped sensor %s because it requires permission %s and app op %d", + sensor.getName().string(), + sensor.getRequiredPermission().string(), + sensor.getRequiredAppOp()); + } } return accessibleSensorList; } diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk index 1eb23616c3..1901ef982c 100644 --- a/services/surfaceflinger/Android.mk +++ b/services/surfaceflinger/Android.mk @@ -122,6 +122,10 @@ LOCAL_LDFLAGS := -Wl,--version-script,art/sigchainlib/version-script.txt -Wl,--e LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\" LOCAL_CPPFLAGS := -std=c++11 +ifneq ($(ENABLE_CPUSETS),) + LOCAL_CFLAGS += -DENABLE_CPUSETS +endif + LOCAL_SRC_FILES := \ main_surfaceflinger.cpp diff --git a/services/surfaceflinger/main_surfaceflinger.cpp b/services/surfaceflinger/main_surfaceflinger.cpp index a74bc4cd91..6fa8b5317b 100644 --- a/services/surfaceflinger/main_surfaceflinger.cpp +++ b/services/surfaceflinger/main_surfaceflinger.cpp @@ -41,6 +41,13 @@ int main(int, char**) { set_sched_policy(0, SP_FOREGROUND); +#ifdef ENABLE_CPUSETS + // Put most SurfaceFlinger threads in the system-background cpuset + // Keeps us from unnecessarily using big cores + // Do this after the binder thread pool init + set_cpuset_policy(0, SP_SYSTEM); +#endif + // initialize before clients can connect flinger->init(); |