merge in nyc-bugfix-release history after reset to nyc-dev
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index ec2d4bc..ea51d4c 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -520,6 +520,31 @@
}
}
+ /**
+ * Discard any free buffers owned by this ImageReader.
+ *
+ * <p>
+ * Generally, the ImageReader caches buffers for reuse once they have been
+ * allocated, for best performance. However, sometimes it may be important to
+ * release all the cached, unused buffers to save on memory.
+ * </p>
+ * <p>
+ * Calling this method will discard all free cached buffers. This does not include any buffers
+ * associated with Images acquired from the ImageReader, any filled buffers waiting to be
+ * acquired, and any buffers currently in use by the source rendering buffers into the
+ * ImageReader's Surface.
+ * <p>
+ * The ImageReader continues to be usable after this call, but may need to reallocate buffers
+ * when more buffers are needed for rendering.
+ * </p>
+ * @hide
+ */
+ public void discardFreeBuffers() {
+ synchronized (mCloseLock) {
+ nativeDiscardFreeBuffers();
+ }
+ }
+
@Override
protected void finalize() throws Throwable {
try {
@@ -872,6 +897,7 @@
private synchronized native void nativeReleaseImage(Image i);
private synchronized native Surface nativeGetSurface();
private synchronized native int nativeDetachImage(Image i);
+ private synchronized native void nativeDiscardFreeBuffers();
/**
* @return A return code {@code ACQUIRE_*}
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index c3993ae..724fc02 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -611,6 +611,23 @@
return OK;
}
+static void ImageReader_discardFreeBuffers(JNIEnv* env, jobject thiz) {
+ ALOGV("%s:", __FUNCTION__);
+ JNIImageReaderContext* ctx = ImageReader_getContext(env, thiz);
+ if (ctx == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", "ImageReader was already closed");
+ return;
+ }
+
+ BufferItemConsumer* bufferConsumer = ctx->getBufferConsumer();
+ status_t res = bufferConsumer->discardFreeBuffers();
+ if (res != OK) {
+ ALOGE("Buffer discard failed: %s (%d)", strerror(-res), res);
+ jniThrowRuntimeException(env,
+ "nativeDicardFreebuffers failed");
+ }
+}
+
static jobject ImageReader_getSurface(JNIEnv* env, jobject thiz)
{
ALOGV("%s: ", __FUNCTION__);
@@ -773,6 +790,7 @@
{"nativeImageSetup", "(Landroid/media/Image;)I", (void*)ImageReader_imageSetup },
{"nativeGetSurface", "()Landroid/view/Surface;", (void*)ImageReader_getSurface },
{"nativeDetachImage", "(Landroid/media/Image;)I", (void*)ImageReader_detachImage },
+ {"nativeDiscardFreeBuffers", "()V", (void*)ImageReader_discardFreeBuffers }
};
static const JNINativeMethod gImageMethods[] = {
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 36ec2eb..64ca2e3 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -150,7 +150,7 @@
// used internally for synchronization
private final Object mLock = new Object();
- // --- fields below are final after systemReady() ---
+ // --- fields below are final after systemRunning() ---
private LocationFudger mLocationFudger;
private GeofenceManager mGeofenceManager;
private PackageManager mPackageManager;
@@ -168,6 +168,7 @@
// --- fields below are protected by mLock ---
// Set of providers that are explicitly enabled
+ // Only used by passive, fused & test. Network & GPS are controlled separately, and not listed.
private final Set<String> mEnabledProviders = new HashSet<String>();
// Set of providers that are explicitly disabled
@@ -236,12 +237,12 @@
if (D) Log.d(TAG, "Constructed");
- // most startup is deferred until systemReady()
+ // most startup is deferred until systemRunning()
}
public void systemRunning() {
synchronized (mLock) {
- if (D) Log.d(TAG, "systemReady()");
+ if (D) Log.d(TAG, "systemRunning()");
// fetch package manager
mPackageManager = mContext.getPackageManager();
@@ -321,7 +322,11 @@
|| Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) {
updateUserProfiles(mCurrentUserId);
} else if (Intent.ACTION_SHUTDOWN.equals(action)) {
- shutdownComponents();
+ // shutdown only if UserId indicates whole system, not just one user
+ if(D) Log.d(TAG, "Shutdown received with UserId: " + getSendingUserId());
+ if (getSendingUserId() == UserHandle.USER_ALL) {
+ shutdownComponents();
+ }
}
}
}, UserHandle.ALL, intentFilter, null, mLocationHandler);