merge in nyc-bugfix-release history after reset to nyc-dev
diff --git a/include/gui/BufferQueueConsumer.h b/include/gui/BufferQueueConsumer.h
index 3b681ee..b2daae4 100644
--- a/include/gui/BufferQueueConsumer.h
+++ b/include/gui/BufferQueueConsumer.h
@@ -136,9 +136,6 @@
     // Retrieve the sideband buffer stream, if any.
     virtual sp<NativeHandle> getSidebandStream() const;
 
-    // See IGraphicBufferConsumer::discardFreeBuffers
-    virtual status_t discardFreeBuffers() override;
-
     // dump our state in a String
     virtual void dump(String8& result, const char* prefix) const;
 
diff --git a/include/gui/BufferQueueCore.h b/include/gui/BufferQueueCore.h
index 35c9170..0371db7 100644
--- a/include/gui/BufferQueueCore.h
+++ b/include/gui/BufferQueueCore.h
@@ -124,11 +124,6 @@
     // all slots, even if they're currently dequeued, queued, or acquired.
     void freeAllBuffersLocked();
 
-    // discardFreeBuffersLocked releases all currently-free buffers held by the
-    // queue, in order to reduce the memory consumption of the queue to the
-    // minimum possible without discarding data.
-    void discardFreeBuffersLocked();
-
     // If delta is positive, makes more slots available. If negative, takes
     // away slots. Returns false if the request can't be met.
     bool adjustAvailableSlotsLocked(int delta);
diff --git a/include/gui/ConsumerBase.h b/include/gui/ConsumerBase.h
index ba86478..9307a26 100644
--- a/include/gui/ConsumerBase.h
+++ b/include/gui/ConsumerBase.h
@@ -85,9 +85,6 @@
     // See IGraphicBufferConsumer::setDefaultBufferDataSpace
     status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace);
 
-    // See IGraphicBufferConsumer::discardFreeBuffers
-    status_t discardFreeBuffers();
-
 private:
     ConsumerBase(const ConsumerBase&);
     void operator=(const ConsumerBase&);
diff --git a/include/gui/IGraphicBufferConsumer.h b/include/gui/IGraphicBufferConsumer.h
index f03d1ce..e983c16 100644
--- a/include/gui/IGraphicBufferConsumer.h
+++ b/include/gui/IGraphicBufferConsumer.h
@@ -265,11 +265,6 @@
     // Retrieve the sideband buffer stream, if any.
     virtual sp<NativeHandle> getSidebandStream() const = 0;
 
-    // discardFreeBuffers releases all currently-free buffers held by the queue,
-    // in order to reduce the memory consumption of the queue to the minimum
-    // possible without discarding data.
-    virtual status_t discardFreeBuffers() = 0;
-
     // dump state into a string
     virtual void dump(String8& result, const char* prefix) const = 0;
 
diff --git a/libs/gui/BufferQueueConsumer.cpp b/libs/gui/BufferQueueConsumer.cpp
index 525938e..cbc8893 100644
--- a/libs/gui/BufferQueueConsumer.cpp
+++ b/libs/gui/BufferQueueConsumer.cpp
@@ -717,12 +717,6 @@
     return mCore->mSidebandStream;
 }
 
-status_t BufferQueueConsumer::discardFreeBuffers() {
-    Mutex::Autolock lock(mCore->mMutex);
-    mCore->discardFreeBuffersLocked();
-    return NO_ERROR;
-}
-
 void BufferQueueConsumer::dump(String8& result, const char* prefix) const {
     const IPCThreadState* ipc = IPCThreadState::self();
     const pid_t pid = ipc->getCallingPid();
diff --git a/libs/gui/BufferQueueCore.cpp b/libs/gui/BufferQueueCore.cpp
index 9cb9c62..569b8f9 100644
--- a/libs/gui/BufferQueueCore.cpp
+++ b/libs/gui/BufferQueueCore.cpp
@@ -244,16 +244,6 @@
     VALIDATE_CONSISTENCY();
 }
 
-void BufferQueueCore::discardFreeBuffersLocked() {
-    for (int s : mFreeBuffers) {
-        mFreeSlots.insert(s);
-        clearBufferSlotLocked(s);
-    }
-    mFreeBuffers.clear();
-
-    VALIDATE_CONSISTENCY();
-}
-
 bool BufferQueueCore::adjustAvailableSlotsLocked(int delta) {
     if (delta >= 0) {
         // If we're going to fail, do so before modifying anything
diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp
index c00526d..a6a9712 100644
--- a/libs/gui/ConsumerBase.cpp
+++ b/libs/gui/ConsumerBase.cpp
@@ -235,15 +235,6 @@
     return mConsumer->setDefaultBufferDataSpace(defaultDataSpace);
 }
 
-status_t ConsumerBase::discardFreeBuffers() {
-    Mutex::Autolock _l(mMutex);
-    if (mAbandoned) {
-        CB_LOGE("discardFreeBuffers: ConsumerBase is abandoned!");
-        return NO_INIT;
-    }
-    return mConsumer->discardFreeBuffers();
-}
-
 void ConsumerBase::dump(String8& result) const {
     dump(result, "");
 }
diff --git a/libs/gui/IGraphicBufferConsumer.cpp b/libs/gui/IGraphicBufferConsumer.cpp
index af6800b..cb1ad35 100644
--- a/libs/gui/IGraphicBufferConsumer.cpp
+++ b/libs/gui/IGraphicBufferConsumer.cpp
@@ -51,7 +51,6 @@
     SET_CONSUMER_USAGE_BITS,
     SET_TRANSFORM_HINT,
     GET_SIDEBAND_STREAM,
-    DISCARD_FREE_BUFFERS,
     DUMP,
 };
 
@@ -261,21 +260,6 @@
         return stream;
     }
 
-    virtual status_t discardFreeBuffers() {
-        Parcel data, reply;
-        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
-        status_t error = remote()->transact(DISCARD_FREE_BUFFERS, data, &reply);
-        if (error != NO_ERROR) {
-            return error;
-        }
-        int32_t result = NO_ERROR;
-        error = reply.readInt32(&result);
-        if (error != NO_ERROR) {
-            return error;
-        }
-        return result;
-    }
-
     virtual void dump(String8& result, const char* prefix) const {
         Parcel data, reply;
         data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
@@ -425,12 +409,6 @@
             }
             return NO_ERROR;
         }
-        case DISCARD_FREE_BUFFERS: {
-            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
-            status_t result = discardFreeBuffers();
-            status_t error = reply->writeInt32(result);
-            return error;
-        }
         case DUMP: {
             CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
             String8 result = data.readString8();
diff --git a/libs/gui/tests/BufferQueue_test.cpp b/libs/gui/tests/BufferQueue_test.cpp
index 721667c..85d63b4 100644
--- a/libs/gui/tests/BufferQueue_test.cpp
+++ b/libs/gui/tests/BufferQueue_test.cpp
@@ -850,81 +850,4 @@
             returnedBuffer->getNativeBuffer()->handle);
 }
 
-TEST_F(BufferQueueTest, TestDiscardFreeBuffers) {
-    createBufferQueue();
-    sp<DummyConsumer> dc(new DummyConsumer);
-    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, false));
-    IGraphicBufferProducer::QueueBufferOutput output;
-    ASSERT_EQ(OK, mProducer->connect(new DummyProducerListener,
-            NATIVE_WINDOW_API_CPU, false, &output));
-
-    int slot = BufferQueue::INVALID_BUFFER_SLOT;
-    sp<Fence> fence = Fence::NO_FENCE;
-    sp<GraphicBuffer> buffer = nullptr;
-    IGraphicBufferProducer::QueueBufferInput input(0ull, true,
-        HAL_DATASPACE_UNKNOWN, Rect::INVALID_RECT,
-        NATIVE_WINDOW_SCALING_MODE_FREEZE, 0, Fence::NO_FENCE);
-    BufferItem item{};
-
-    // Preallocate, dequeue, request, and cancel 4 buffers so we don't get
-    // BUFFER_NEEDS_REALLOCATION below
-    int slots[4] = {};
-    mProducer->setMaxDequeuedBufferCount(4);
-    for (size_t i = 0; i < 4; ++i) {
-        status_t result = mProducer->dequeueBuffer(&slots[i], &fence,
-                0, 0, 0, 0);
-        ASSERT_EQ(IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION, result);
-        ASSERT_EQ(OK, mProducer->requestBuffer(slots[i], &buffer));
-    }
-    for (size_t i = 0; i < 4; ++i) {
-        ASSERT_EQ(OK, mProducer->cancelBuffer(slots[i], Fence::NO_FENCE));
-    }
-
-    // Get buffers in all states: dequeued, filled, acquired, free
-
-    // Fill 3 buffers
-    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
-    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
-    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
-    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
-    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
-    ASSERT_EQ(OK, mProducer->queueBuffer(slot, input, &output));
-    // Dequeue 1 buffer
-    ASSERT_EQ(OK, mProducer->dequeueBuffer(&slot, &fence, 0, 0, 0, 0));
-
-    // Acquire and free 1 buffer
-    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
-    ASSERT_EQ(OK, mConsumer->releaseBuffer(item.mSlot, item.mFrameNumber,
-                    EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, Fence::NO_FENCE));
-    // Acquire 1 buffer, leaving 1 filled buffer in queue
-    ASSERT_EQ(OK, mConsumer->acquireBuffer(&item, 0));
-
-    // Now discard the free buffers
-    ASSERT_EQ(OK, mConsumer->discardFreeBuffers());
-
-    // Check no free buffers in dump
-    String8 dumpString;
-    mConsumer->dump(dumpString, nullptr);
-
-    // Parse the dump to ensure that all buffer slots that are FREE also
-    // have a null GraphicBuffer
-    // Fragile - assumes the following format for the dump for a buffer entry:
-    // ":%p\][^:]*state=FREE" where %p is the buffer pointer in hex.
-    ssize_t idx = dumpString.find("state=FREE");
-    while (idx != -1) {
-        ssize_t bufferPtrIdx = idx - 1;
-        while (bufferPtrIdx > 0) {
-            if (dumpString[bufferPtrIdx] == ':') {
-                bufferPtrIdx++;
-                break;
-            }
-            bufferPtrIdx--;
-        }
-        ASSERT_GT(bufferPtrIdx, 0) << "Can't parse queue dump to validate";
-        ssize_t nullPtrIdx = dumpString.find("0x0]", bufferPtrIdx);
-        ASSERT_EQ(bufferPtrIdx, nullPtrIdx) << "Free buffer not discarded";
-        idx = dumpString.find("FREE", idx + 1);
-    }
-}
-
 } // namespace android