class BufferQueueCore : public virtual RefBase {
friend class BufferQueueProducer;
friend class BufferQueueConsumer;
public:
// Used as a placeholder slot number when the value isn't pointing to an
// existing buffer.
enum { INVALID_BUFFER_SLOT = BufferItem::INVALID_BUFFER_SLOT };
// We reserve two slots in order to guarantee that the producer and
// consumer can run asynchronously.
enum { MAX_MAX_ACQUIRED_BUFFERS = BufferQueueDefs::NUM_BUFFER_SLOTS - 2 };
enum {
// The API number used to indicate the currently connected producer
CURRENTLY_CONNECTED_API = -1,
// The API number used to indicate that no producer is connected
NO_CONNECTED_API = 0,
};
typedef Vector<BufferItem> Fifo;
private:
...
// mMutex is the mutex used to prevent concurrent access to the member
// variables of BufferQueueCore objects. It must be locked whenever any
// member variable is accessed.
mutable std::mutex mMutex;
// mIsAbandoned indicates that the BufferQueue will no longer be used to
// consume image buffers pushed to it using the IGraphicBufferProducer
// interface. It is initialized to false, and set to true in the
// consumerDisconnect method. A BufferQueue that is abandoned will return
// the NO_INIT error from all IGraphicBufferProducer methods capable of
// returning an error.
bool mIsAbandoned;
// mConsumerControlledByApp indicates whether the connected consumer is
// controlled by the application.
bool mConsumerControlledByApp;
- 因为生产者和消费者是并发访问 BufferQueueCore,所以访问任何 BufferQueueCore 成员都需要用
mMutex
加锁。
mIsAbandoned
表示 BufferQueue 不再消费 buffer。它初始化值是 false,在 BufferQueueConsumer::disconnect() 中设置为 true。
mConsumerControlledByApp
表示消费者是否是应用,默认情况下 SurfaceFlinger 是消费者。
// mConsumerName is a string used to identify the BufferQueue in log
// messages. It is set by the IGraphicBufferConsumer::setConsumerName
// method.
String8 mConsumerName;
// mConsumerListener is used to notify the connected consumer of
// asynchronous events that it may wish to react to. It is initially
// set to NULL and is written by consumerConnect and consumerDisconnect.
sp<IConsumerListener> mConsumerListener;
// mConsumerUsageBits contains flags that the consumer wants for
// GraphicBuffers.
uint64_t mConsumerUsageBits;
// mConsumerIsProtected indicates the consumer is ready to handle protected
// buffer.
bool mConsumerIsProtected;
// mConnectedApi indicates the producer API that is currently connected
// to this BufferQueue. It defaults to NO_CONNECTED_API, and gets updated
// by the connect and disconnect methods.
int mConnectedApi;
// PID of the process which last successfully called connect(...)
pid_t mConnectedPid;