Merge "BQ: get rid of async in producer interface"
diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c
index 713634c..59c1d12 100644
--- a/cmds/dumpstate/dumpstate.c
+++ b/cmds/dumpstate/dumpstate.c
@@ -351,7 +351,8 @@
run_command("LOG STATISTICS", 10, "logcat", "-b", "all", "-S", NULL);
- run_command("RAFT LOGS", 300, SU_PATH, "root", "logcompressor", "-r", RAFT_DIR, NULL);
+ // raft disabled as per http://b/24159112
+ // run_command("RAFT LOGS", 300, SU_PATH, "root", "logcompressor", "-r", RAFT_DIR, NULL);
/* show the traces we collected in main(), if that was done */
if (dump_traces_path != NULL) {
diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp
index d4aa7d3..46d72fd 100644
--- a/cmds/installd/commands.cpp
+++ b/cmds/installd/commands.cpp
@@ -746,7 +746,7 @@
static void run_dex2oat(int zip_fd, int oat_fd, const char* input_file_name,
const char* output_file_name, int swap_fd, const char *pkgname, const char *instruction_set,
- bool vm_safe_mode, bool debuggable, bool post_bootcomplete)
+ bool vm_safe_mode, bool debuggable, bool post_bootcomplete, bool use_jit)
{
static const unsigned int MAX_INSTRUCTION_SET_LEN = 7;
@@ -770,24 +770,11 @@
dex2oat_compiler_filter_flag, NULL) > 0;
char dex2oat_threads_buf[PROPERTY_VALUE_MAX];
- bool have_dex2oat_threads_flag = false;
- if (!post_bootcomplete) {
- have_dex2oat_threads_flag = property_get("dalvik.vm.boot-dex2oat-threads",
- dex2oat_threads_buf,
- NULL) > 0;
- // If there's no boot property, fall back to the image property.
- if (!have_dex2oat_threads_flag) {
- have_dex2oat_threads_flag = property_get("dalvik.vm.image-dex2oat-threads",
- dex2oat_threads_buf,
- NULL) > 0;
- }
- // If there's neither, fall back to the default property.
- }
- if (!have_dex2oat_threads_flag) {
- have_dex2oat_threads_flag = property_get("dalvik.vm.dex2oat-threads",
- dex2oat_threads_buf,
- NULL) > 0;
- }
+ bool have_dex2oat_threads_flag = property_get(post_bootcomplete
+ ? "dalvik.vm.dex2oat-threads"
+ : "dalvik.vm.boot-dex2oat-threads",
+ dex2oat_threads_buf,
+ NULL) > 0;
char dex2oat_threads_arg[PROPERTY_VALUE_MAX + 2];
if (have_dex2oat_threads_flag) {
sprintf(dex2oat_threads_arg, "-j%s", dex2oat_threads_buf);
@@ -820,7 +807,6 @@
(strcmp(vold_decrypt, "trigger_restart_min_framework") == 0 ||
(strcmp(vold_decrypt, "1") == 0)));
- bool use_jit = check_boolean_property("debug.usejit");
bool generate_debug_info = check_boolean_property("debug.generate-debug-info");
static const char* DEX2OAT_BIN = "/system/bin/dex2oat";
@@ -874,6 +860,8 @@
}
}
+ // use the JIT if either it's specified as a dexopt flag or if the property is set
+ use_jit = use_jit || check_boolean_property("debug.usejit");
if (have_dex2oat_Xms_flag) {
sprintf(dex2oat_Xms_arg, "-Xms%s", dex2oat_Xms_flag);
}
@@ -1094,9 +1082,8 @@
}
}
-int dexopt(const char *apk_path, uid_t uid, bool is_public,
- const char *pkgname, const char *instruction_set, int dexopt_needed,
- bool vm_safe_mode, bool debuggable, const char* oat_dir, bool boot_complete)
+int dexopt(const char *apk_path, uid_t uid, const char *pkgname, const char *instruction_set,
+ int dexopt_needed, const char* oat_dir, int dexopt_flags)
{
struct utimbuf ut;
struct stat input_stat;
@@ -1105,6 +1092,15 @@
const char *input_file;
char in_odex_path[PKG_PATH_MAX];
int res, input_fd=-1, out_fd=-1, swap_fd=-1;
+ bool is_public = (dexopt_flags & DEXOPT_PUBLIC) != 0;
+ bool vm_safe_mode = (dexopt_flags & DEXOPT_SAFEMODE) != 0;
+ bool debuggable = (dexopt_flags & DEXOPT_DEBUGGABLE) != 0;
+ bool boot_complete = (dexopt_flags & DEXOPT_BOOTCOMPLETE) != 0;
+ bool use_jit = (dexopt_flags & DEXOPT_USEJIT) != 0;
+
+ if ((dexopt_flags & DEXOPT_MASK) != 0) {
+ LOG_FATAL("dexopt flags contains unknown fields\n");
+ }
// Early best-effort check whether we can fit the the path into our buffers.
// Note: the cache path will require an additional 5 bytes for ".swap", but we'll try to run
@@ -1244,7 +1240,7 @@
input_file_name++;
}
run_dex2oat(input_fd, out_fd, input_file_name, out_path, swap_fd, pkgname,
- instruction_set, vm_safe_mode, debuggable, boot_complete);
+ instruction_set, vm_safe_mode, debuggable, boot_complete, use_jit);
} else {
ALOGE("Invalid dexopt needed: %d\n", dexopt_needed);
exit(73);
diff --git a/cmds/installd/installd.cpp b/cmds/installd/installd.cpp
index f67e838..7a16150 100644
--- a/cmds/installd/installd.cpp
+++ b/cmds/installd/installd.cpp
@@ -47,10 +47,9 @@
static int do_dexopt(char **arg, char reply[REPLY_MAX] __unused)
{
- /* apk_path, uid, is_public, pkgname, instruction_set,
- * dexopt_needed, vm_safe_mode, debuggable, oat_dir, boot_complete */
- return dexopt(arg[0], atoi(arg[1]), atoi(arg[2]), arg[3], arg[4], atoi(arg[5]),
- atoi(arg[6]), atoi(arg[7]), arg[8], atoi(arg[9]));
+ /* apk_path, uid, pkgname, instruction_set, dexopt_needed, oat_dir, dexopt_flags */
+ return dexopt(arg[0], atoi(arg[1]), arg[2], arg[3], atoi(arg[4]),
+ arg[5], atoi(arg[6]));
}
static int do_mark_boot_complete(char **arg, char reply[REPLY_MAX] __unused)
@@ -194,7 +193,7 @@
struct cmdinfo cmds[] = {
{ "ping", 0, do_ping },
{ "install", 5, do_install },
- { "dexopt", 10, do_dexopt },
+ { "dexopt", 7, do_dexopt },
{ "markbootcomplete", 1, do_mark_boot_complete },
{ "movedex", 3, do_move_dex },
{ "rmdex", 2, do_rm_dex },
diff --git a/cmds/installd/installd.h b/cmds/installd/installd.h
index 24b9084..df13fe4 100644
--- a/cmds/installd/installd.h
+++ b/cmds/installd/installd.h
@@ -90,6 +90,24 @@
#define DEXOPT_PATCHOAT_NEEDED 2
#define DEXOPT_SELF_PATCHOAT_NEEDED 3
+/****************************************************************************
+ * IMPORTANT: These values are passed from Java code. Keep them in sync with
+ * frameworks/base/services/core/java/com/android/server/pm/Installer.java
+ ***************************************************************************/
+constexpr int DEXOPT_PUBLIC = 1 << 1;
+constexpr int DEXOPT_SAFEMODE = 1 << 2;
+constexpr int DEXOPT_DEBUGGABLE = 1 << 3;
+constexpr int DEXOPT_BOOTCOMPLETE = 1 << 4;
+constexpr int DEXOPT_USEJIT = 1 << 5;
+
+/* all known values for dexopt flags */
+constexpr int DEXOPT_MASK =
+ DEXOPT_PUBLIC
+ | DEXOPT_SAFEMODE
+ | DEXOPT_DEBUGGABLE
+ | DEXOPT_BOOTCOMPLETE
+ | DEXOPT_USEJIT;
+
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
/* data structures */
@@ -241,9 +259,8 @@
const char *instruction_set, int64_t *codesize, int64_t *datasize,
int64_t *cachesize, int64_t *asecsize);
int free_cache(const char *uuid, int64_t free_size);
-int dexopt(const char *apk_path, uid_t uid, bool is_public, const char *pkgName,
- const char *instruction_set, int dexopt_needed, bool vm_safe_mode,
- bool debuggable, const char* oat_dir, bool boot_complete);
+int dexopt(const char *apk_path, uid_t uid, const char *pkgName, const char *instruction_set,
+ int dexopt_needed, const char* oat_dir, int dexopt_flags);
int mark_boot_complete(const char *instruction_set);
int movefiles();
int linklib(const char* uuid, const char* pkgname, const char* asecLibDir, int userId);
diff --git a/include/powermanager/IPowerManager.h b/include/powermanager/IPowerManager.h
index 49ff637..461fad7 100644
--- a/include/powermanager/IPowerManager.h
+++ b/include/powermanager/IPowerManager.h
@@ -31,11 +31,23 @@
// These transaction IDs must be kept in sync with the method order from
// IPowerManager.aidl.
enum {
- ACQUIRE_WAKE_LOCK = IBinder::FIRST_CALL_TRANSACTION,
- ACQUIRE_WAKE_LOCK_UID = IBinder::FIRST_CALL_TRANSACTION + 1,
- RELEASE_WAKE_LOCK = IBinder::FIRST_CALL_TRANSACTION + 2,
- UPDATE_WAKE_LOCK_UIDS = IBinder::FIRST_CALL_TRANSACTION + 3,
- POWER_HINT = IBinder::FIRST_CALL_TRANSACTION + 4,
+ ACQUIRE_WAKE_LOCK = IBinder::FIRST_CALL_TRANSACTION,
+ ACQUIRE_WAKE_LOCK_UID = IBinder::FIRST_CALL_TRANSACTION + 1,
+ RELEASE_WAKE_LOCK = IBinder::FIRST_CALL_TRANSACTION + 2,
+ UPDATE_WAKE_LOCK_UIDS = IBinder::FIRST_CALL_TRANSACTION + 3,
+ POWER_HINT = IBinder::FIRST_CALL_TRANSACTION + 4,
+ UPDATE_WAKE_LOCK_SOURCE = IBinder::FIRST_CALL_TRANSACTION + 5,
+ IS_WAKE_LOCK_LEVEL_SUPPORTED = IBinder::FIRST_CALL_TRANSACTION + 6,
+ USER_ACTIVITY = IBinder::FIRST_CALL_TRANSACTION + 7,
+ WAKE_UP = IBinder::FIRST_CALL_TRANSACTION + 8,
+ GO_TO_SLEEP = IBinder::FIRST_CALL_TRANSACTION + 9,
+ NAP = IBinder::FIRST_CALL_TRANSACTION + 10,
+ IS_INTERACTIVE = IBinder::FIRST_CALL_TRANSACTION + 11,
+ IS_POWER_SAVE_MODE = IBinder::FIRST_CALL_TRANSACTION + 12,
+ SET_POWER_SAVE_MODE = IBinder::FIRST_CALL_TRANSACTION + 13,
+ REBOOT = IBinder::FIRST_CALL_TRANSACTION + 14,
+ SHUTDOWN = IBinder::FIRST_CALL_TRANSACTION + 15,
+ CRASH = IBinder::FIRST_CALL_TRANSACTION + 16,
};
DECLARE_META_INTERFACE(PowerManager);
@@ -50,8 +62,11 @@
virtual status_t releaseWakeLock(const sp<IBinder>& lock, int flags, bool isOneWay = false) = 0;
virtual status_t updateWakeLockUids(const sp<IBinder>& lock, int len, const int *uids,
bool isOneWay = false) = 0;
- // oneway in the .aidl
virtual status_t powerHint(int hintId, int data) = 0;
+ virtual status_t goToSleep(int64_t event_time_ms, int reason, int flags) = 0;
+ virtual status_t reboot(bool confirm, const String16& reason, bool wait) = 0;
+ virtual status_t shutdown(bool confirm, const String16& reason, bool wait) = 0;
+ virtual status_t crash(const String16& message) = 0;
};
// ----------------------------------------------------------------------------
diff --git a/include/ui/Region.h b/include/ui/Region.h
index e9b3a0b..810f098 100644
--- a/include/ui/Region.h
+++ b/include/ui/Region.h
@@ -28,7 +28,6 @@
namespace android {
// ---------------------------------------------------------------------------
-class SharedBuffer;
class String8;
// ---------------------------------------------------------------------------
diff --git a/libs/input/Android.mk b/libs/input/Android.mk
index 944ac7f..746de66 100644
--- a/libs/input/Android.mk
+++ b/libs/input/Android.mk
@@ -56,6 +56,9 @@
LOCAL_SRC_FILES:= $(deviceSources)
+LOCAL_CLANG := true
+LOCAL_SANITIZE := integer
+
LOCAL_SHARED_LIBRARIES := \
liblog \
libcutils \
diff --git a/libs/input/InputTransport.cpp b/libs/input/InputTransport.cpp
index 0382f57..2dff4e0 100644
--- a/libs/input/InputTransport.cpp
+++ b/libs/input/InputTransport.cpp
@@ -51,6 +51,10 @@
// Minimum time difference between consecutive samples before attempting to resample.
static const nsecs_t RESAMPLE_MIN_DELTA = 2 * NANOS_PER_MS;
+// Maximum time difference between consecutive samples before attempting to resample
+// by extrapolation.
+static const nsecs_t RESAMPLE_MAX_DELTA = 20 * NANOS_PER_MS;
+
// Maximum time to predict forward from the last known state, to avoid predicting too
// far into the future. This time is further bounded by 50% of the last time delta.
static const nsecs_t RESAMPLE_MAX_PREDICTION = 8 * NANOS_PER_MS;
@@ -512,7 +516,8 @@
status_t InputConsumer::consumeBatch(InputEventFactoryInterface* factory,
nsecs_t frameTime, uint32_t* outSeq, InputEvent** outEvent) {
status_t result;
- for (size_t i = mBatches.size(); i-- > 0; ) {
+ for (size_t i = mBatches.size(); i > 0; ) {
+ i--;
Batch& batch = mBatches.editItemAt(i);
if (frameTime < 0) {
result = consumeSamples(factory, batch, batch.samples.size(),
@@ -724,7 +729,7 @@
nsecs_t delta = future.eventTime - current->eventTime;
if (delta < RESAMPLE_MIN_DELTA) {
#if DEBUG_RESAMPLING
- ALOGD("Not resampled, delta time is %lld ns.", delta);
+ ALOGD("Not resampled, delta time is too small: %lld ns.", delta);
#endif
return;
}
@@ -736,7 +741,12 @@
nsecs_t delta = current->eventTime - other->eventTime;
if (delta < RESAMPLE_MIN_DELTA) {
#if DEBUG_RESAMPLING
- ALOGD("Not resampled, delta time is %lld ns.", delta);
+ ALOGD("Not resampled, delta time is too small: %lld ns.", delta);
+#endif
+ return;
+ } else if (delta > RESAMPLE_MAX_DELTA) {
+#if DEBUG_RESAMPLING
+ ALOGD("Not resampled, delta time is too large: %lld ns.", delta);
#endif
return;
}
@@ -817,7 +827,8 @@
uint32_t currentSeq = seq;
uint32_t chainSeqs[seqChainCount];
size_t chainIndex = 0;
- for (size_t i = seqChainCount; i-- > 0; ) {
+ for (size_t i = seqChainCount; i > 0; ) {
+ i--;
const SeqChain& seqChain = mSeqChains.itemAt(i);
if (seqChain.seq == currentSeq) {
currentSeq = seqChain.chain;
@@ -826,7 +837,8 @@
}
}
status_t status = OK;
- while (!status && chainIndex-- > 0) {
+ while (!status && chainIndex > 0) {
+ chainIndex--;
status = sendUnchainedFinishedSignal(chainSeqs[chainIndex], handled);
}
if (status) {
@@ -836,7 +848,10 @@
seqChain.seq = chainIndex != 0 ? chainSeqs[chainIndex - 1] : seq;
seqChain.chain = chainSeqs[chainIndex];
mSeqChains.push(seqChain);
- } while (chainIndex-- > 0);
+ if (chainIndex != 0) {
+ chainIndex--;
+ }
+ } while (chainIndex > 0);
return status;
}
}
diff --git a/services/powermanager/IPowerManager.cpp b/services/powermanager/IPowerManager.cpp
index 0a4244f..bff8719 100644
--- a/services/powermanager/IPowerManager.cpp
+++ b/services/powermanager/IPowerManager.cpp
@@ -95,6 +95,44 @@
// This FLAG_ONEWAY is in the .aidl, so there is no way to disable it
return remote()->transact(POWER_HINT, data, &reply, IBinder::FLAG_ONEWAY);
}
+
+ virtual status_t goToSleep(int64_t event_time_ms, int reason, int flags)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IPowerManager::getInterfaceDescriptor());
+ data.writeInt64(event_time_ms);
+ data.writeInt32(reason);
+ data.writeInt32(flags);
+ return remote()->transact(GO_TO_SLEEP, data, &reply, 0);
+ }
+
+ virtual status_t reboot(bool confirm, const String16& reason, bool wait)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IPowerManager::getInterfaceDescriptor());
+ data.writeInt32(confirm);
+ data.writeString16(reason);
+ data.writeInt32(wait);
+ return remote()->transact(REBOOT, data, &reply, 0);
+ }
+
+ virtual status_t shutdown(bool confirm, const String16& reason, bool wait)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IPowerManager::getInterfaceDescriptor());
+ data.writeInt32(confirm);
+ data.writeString16(reason);
+ data.writeInt32(wait);
+ return remote()->transact(SHUTDOWN, data, &reply, 0);
+ }
+
+ virtual status_t crash(const String16& message)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IPowerManager::getInterfaceDescriptor());
+ data.writeString16(message);
+ return remote()->transact(CRASH, data, &reply, 0);
+ }
};
IMPLEMENT_META_INTERFACE(PowerManager, "android.os.IPowerManager");