BQ: Fix deadlock introduced by onFrameDequeued

BufferQueueCore::mMutex should never be locked when calling
consumerListener's callbacks.

The reason is that the consumerListener callback could in turn
acquire BufferQueueCore::mMutex, resulting in deadlock.

The deadlock stack trace for onFrameDequeued is:

- BufferQueueProduer::dequeueBuffer acquires Core::mMutex
  - ProxyConsumerListener::onFrameDequeued::onFrameDequeued
    promotes a ConsumerListener wp to sp
  - The sp becomes the last reference to the ConsumerListener object,
    when onFrameDequeued() goes out of scope, ~ConsumerListener is
    called
    - BufferQueueConsumer::disconnect is called as part of
      ~ConsumerListener(), and disconnect needs to acquire Core::mMutex

The same issue applies to onFrameCancelled and onFrameDetached.

Test: atest BufferQueueThreading::TestProducerDequeueConsumerDestroy
Bug: 270004534
Change-Id: I22fdc637ccc937594656d6f5bc1ee9b7c506490a
Merged-In: I22fdc637ccc937594656d6f5bc1ee9b7c506490a
1 file changed