OSDN Git Service

Merge "Return error when trying to disconnect twice" into oc-dev
authorWonsik Kim <wonsik@google.com>
Wed, 19 Apr 2017 19:07:39 +0000 (19:07 +0000)
committerandroid-build-merger <android-build-merger@google.com>
Wed, 19 Apr 2017 19:07:39 +0000 (19:07 +0000)
am: fc333972e9

Change-Id: Ief6294b415385e1cf584f1d54cf605c78717c43d

include/gui/IGraphicBufferProducer.h
libs/gui/BufferQueueProducer.cpp
libs/gui/tests/BufferQueue_test.cpp
libs/vr/libbufferhubqueue/buffer_hub_queue_producer.cpp

index 5810335..9250806 100644 (file)
@@ -487,6 +487,7 @@ public:
     // is considered a no-op.
     //
     // Return of a value other than NO_ERROR means an error has occurred:
+    // * NO_INIT - the producer is not connected
     // * BAD_VALUE - one of the following has occurred:
     //             * the api specified does not match the one that was connected
     //             * api was out of range (see above).
index 9415b33..f3e4381 100644 (file)
@@ -1268,7 +1268,10 @@ status_t BufferQueueProducer::disconnect(int api, DisconnectMode mode) {
                     mCore->mSidebandStream.clear();
                     mCore->mDequeueCondition.broadcast();
                     listener = mCore->mConsumerListener;
-                } else if (mCore->mConnectedApi != BufferQueueCore::NO_CONNECTED_API) {
+                } else if (mCore->mConnectedApi == BufferQueueCore::NO_CONNECTED_API) {
+                    BQ_LOGE("disconnect: not connected (req=%d)", api);
+                    status = NO_INIT;
+                } else {
                     BQ_LOGE("disconnect: still connected to another API "
                             "(cur=%d req=%d)", mCore->mConnectedApi, api);
                     status = BAD_VALUE;
index 893c0a6..60c1277 100644 (file)
@@ -1181,4 +1181,21 @@ TEST_F(BufferQueueTest, TestStaleBufferHandleSentAfterDisconnect) {
     ASSERT_NE(nullptr, item.mGraphicBuffer.get());
 }
 
+TEST_F(BufferQueueTest, TestProducerConnectDisconnect) {
+    createBufferQueue();
+    sp<DummyConsumer> dc(new DummyConsumer);
+    ASSERT_EQ(OK, mConsumer->consumerConnect(dc, true));
+    IGraphicBufferProducer::QueueBufferOutput output;
+    sp<IProducerListener> dummyListener(new DummyProducerListener);
+    ASSERT_EQ(NO_INIT, mProducer->disconnect(NATIVE_WINDOW_API_CPU));
+    ASSERT_EQ(OK, mProducer->connect(
+            dummyListener, NATIVE_WINDOW_API_CPU, true, &output));
+    ASSERT_EQ(BAD_VALUE, mProducer->connect(
+            dummyListener, NATIVE_WINDOW_API_MEDIA, true, &output));
+
+    ASSERT_EQ(BAD_VALUE, mProducer->disconnect(NATIVE_WINDOW_API_MEDIA));
+    ASSERT_EQ(OK, mProducer->disconnect(NATIVE_WINDOW_API_CPU));
+    ASSERT_EQ(NO_INIT, mProducer->disconnect(NATIVE_WINDOW_API_CPU));
+}
+
 } // namespace android
index ebd7da0..e236c31 100644 (file)
@@ -450,7 +450,9 @@ status_t BufferHubQueueProducer::disconnect(int api, DisconnectMode /*mode*/) {
 
   std::unique_lock<std::mutex> lock(core_->mutex_);
 
-  if (api != core_->connected_api_) {
+  if (BufferHubQueueCore::kNoConnectedApi == core_->connected_api_) {
+    return NO_INIT;
+  } else if (api != core_->connected_api_) {
     return BAD_VALUE;
   }