Add thread safety annotation in oboeservice.
Bug: 314835808
Test: make
Change-Id: I6daecc226fb5f333799a457e952fb8d0ebad2469
diff --git a/services/oboeservice/AAudioClientTracker.h b/services/oboeservice/AAudioClientTracker.h
index cd3b75a..3d4ab34 100644
--- a/services/oboeservice/AAudioClientTracker.h
+++ b/services/oboeservice/AAudioClientTracker.h
@@ -110,7 +110,7 @@
private:
mutable std::mutex mLock;
const pid_t mProcessId;
- std::set<android::sp<AAudioServiceStreamBase>> mStreams;
+ std::set<android::sp<AAudioServiceStreamBase>> mStreams GUARDED_BY(mLock);
// hold onto binder to receive death notifications
android::sp<IBinder> mBinder;
bool mExclusiveEnabled = true;
diff --git a/services/oboeservice/AAudioEndpointManager.h b/services/oboeservice/AAudioEndpointManager.h
index 1d38d26..cddc261 100644
--- a/services/oboeservice/AAudioEndpointManager.h
+++ b/services/oboeservice/AAudioEndpointManager.h
@@ -58,18 +58,25 @@
* @param sharingMode
* @return endpoint or null
*/
- android::sp<AAudioServiceEndpoint> openEndpoint(android::AAudioService &audioService,
- const aaudio::AAudioStreamRequest &request);
+ android::sp<AAudioServiceEndpoint> openEndpoint(
+ android::AAudioService &audioService,
+ const aaudio::AAudioStreamRequest &request)
+ EXCLUDES(mExclusiveLock, mSharedLock);
- void closeEndpoint(const android::sp<AAudioServiceEndpoint>& serviceEndpoint);
+ void closeEndpoint(const android::sp<AAudioServiceEndpoint>& serviceEndpoint)
+ EXCLUDES(mExclusiveLock, mSharedLock);;
private:
- android::sp<AAudioServiceEndpoint> openExclusiveEndpoint(android::AAudioService &aaudioService,
- const aaudio::AAudioStreamRequest &request,
- sp<AAudioServiceEndpoint> &endpointToSteal);
+ android::sp<AAudioServiceEndpoint> openExclusiveEndpoint(
+ android::AAudioService &aaudioService,
+ const aaudio::AAudioStreamRequest &request,
+ sp<AAudioServiceEndpoint> &endpointToSteal)
+ EXCLUDES(mExclusiveLock);
- android::sp<AAudioServiceEndpoint> openSharedEndpoint(android::AAudioService &aaudioService,
- const aaudio::AAudioStreamRequest &request);
+ android::sp<AAudioServiceEndpoint> openSharedEndpoint(
+ android::AAudioService &aaudioService,
+ const aaudio::AAudioStreamRequest &request)
+ EXCLUDES(mSharedLock);
android::sp<AAudioServiceEndpoint> findExclusiveEndpoint_l(
const AAudioStreamConfiguration& configuration)
@@ -77,7 +84,8 @@
android::sp<AAudioServiceEndpointShared> findSharedEndpoint_l(
const AAudioStreamConfiguration& configuration)
- REQUIRES(mSharedLock);
+ REQUIRES(mSharedLock)
+ EXCLUDES(mExclusiveLock);
void closeExclusiveEndpoint(const android::sp<AAudioServiceEndpoint>& serviceEndpoint);
void closeSharedEndpoint(const android::sp<AAudioServiceEndpoint>& serviceEndpoint);
diff --git a/services/oboeservice/AAudioServiceEndpoint.h b/services/oboeservice/AAudioServiceEndpoint.h
index dff571b..6de95e0 100644
--- a/services/oboeservice/AAudioServiceEndpoint.h
+++ b/services/oboeservice/AAudioServiceEndpoint.h
@@ -55,9 +55,11 @@
*/
virtual void close() = 0;
- aaudio_result_t registerStream(const android::sp<AAudioServiceStreamBase>& stream);
+ aaudio_result_t registerStream(const android::sp<AAudioServiceStreamBase>& stream)
+ EXCLUDES(mLockStreams);
- aaudio_result_t unregisterStream(const android::sp<AAudioServiceStreamBase>& stream);
+ aaudio_result_t unregisterStream(const android::sp<AAudioServiceStreamBase>& stream)
+ EXCLUDES(mLockStreams);
virtual aaudio_result_t startStream(android::sp<AAudioServiceStreamBase> stream,
audio_port_handle_t *clientHandle) = 0;
@@ -148,9 +150,11 @@
* @param portHandle
* @return return true if a stream with the given portHandle is registered
*/
- bool isStreamRegistered(audio_port_handle_t portHandle);
+ bool isStreamRegistered(audio_port_handle_t portHandle)
+ EXCLUDES(mLockStreams);
- std::vector<android::sp<AAudioServiceStreamBase>> disconnectRegisteredStreams();
+ std::vector<android::sp<AAudioServiceStreamBase>> disconnectRegisteredStreams()
+ EXCLUDES(mLockStreams);
mutable std::mutex mLockStreams;
std::vector<android::sp<AAudioServiceStreamBase>> mRegisteredStreams
diff --git a/services/oboeservice/AAudioServiceEndpointMMAP.h b/services/oboeservice/AAudioServiceEndpointMMAP.h
index f19005c..eaa578c 100644
--- a/services/oboeservice/AAudioServiceEndpointMMAP.h
+++ b/services/oboeservice/AAudioServiceEndpointMMAP.h
@@ -19,7 +19,6 @@
#include <atomic>
#include <functional>
-#include <mutex>
#include <vector>
#include "client/AudioStreamInternal.h"
diff --git a/services/oboeservice/AAudioServiceEndpointPlay.h b/services/oboeservice/AAudioServiceEndpointPlay.h
index 160a1de..704502e 100644
--- a/services/oboeservice/AAudioServiceEndpointPlay.h
+++ b/services/oboeservice/AAudioServiceEndpointPlay.h
@@ -19,7 +19,6 @@
#include <atomic>
#include <functional>
-#include <mutex>
#include <vector>
#include "client/AudioStreamInternal.h"
diff --git a/services/oboeservice/AAudioServiceEndpointShared.h b/services/oboeservice/AAudioServiceEndpointShared.h
index 0efb227..2c73953 100644
--- a/services/oboeservice/AAudioServiceEndpointShared.h
+++ b/services/oboeservice/AAudioServiceEndpointShared.h
@@ -18,7 +18,6 @@
#define AAUDIO_SERVICE_ENDPOINT_SHARED_H
#include <atomic>
-#include <mutex>
#include <android-base/thread_annotations.h>
diff --git a/services/oboeservice/AAudioServiceStreamBase.h b/services/oboeservice/AAudioServiceStreamBase.h
index 8f51ce4..d5061b3 100644
--- a/services/oboeservice/AAudioServiceStreamBase.h
+++ b/services/oboeservice/AAudioServiceStreamBase.h
@@ -76,7 +76,8 @@
/**
* Open the device.
*/
- virtual aaudio_result_t open(const aaudio::AAudioStreamRequest &request) = 0;
+ virtual aaudio_result_t open(const aaudio::AAudioStreamRequest &request)
+ EXCLUDES(mUpMessageQueueLock);
// We log the CLOSE from the close() method. We needed this separate method to log the OPEN
// because we had to wait until we generated the handle.
@@ -269,7 +270,8 @@
AudioEndpointParcelable* mParcelable;
};
- aaudio_result_t getDescription_l(AudioEndpointParcelable* parcelable) REQUIRES(mLock);
+ aaudio_result_t getDescription_l(AudioEndpointParcelable* parcelable)
+ REQUIRES(mLock) EXCLUDES(mUpMessageQueueLock);
void setState(aaudio_stream_state_t state);
@@ -279,7 +281,8 @@
*/
virtual aaudio_result_t startDevice();
- aaudio_result_t writeUpMessageQueue(AAudioServiceMessage *command);
+ aaudio_result_t writeUpMessageQueue(AAudioServiceMessage *command)
+ EXCLUDES(mUpMessageQueueLock);
aaudio_result_t sendCurrentTimestamp_l() REQUIRES(mLock);
@@ -342,7 +345,7 @@
pid_t mRegisteredClientThread = ILLEGAL_THREAD_ID;
std::mutex mUpMessageQueueLock;
- std::shared_ptr<SharedRingBuffer> mUpMessageQueue;
+ std::shared_ptr<SharedRingBuffer> mUpMessageQueue PT_GUARDED_BY(mUpMessageQueueLock);
enum : int32_t {
START,
@@ -402,7 +405,7 @@
/**
* @return true if the queue is getting full.
*/
- bool isUpMessageQueueBusy();
+ bool isUpMessageQueueBusy() EXCLUDES(mUpMessageQueueLock);
aaudio_handle_t mHandle = -1;
bool mFlowing = false;
diff --git a/services/oboeservice/AAudioServiceStreamMMAP.h b/services/oboeservice/AAudioServiceStreamMMAP.h
index db3c8d0..42032d7 100644
--- a/services/oboeservice/AAudioServiceStreamMMAP.h
+++ b/services/oboeservice/AAudioServiceStreamMMAP.h
@@ -49,7 +49,8 @@
bool inService);
~AAudioServiceStreamMMAP() override = default;
- aaudio_result_t open(const aaudio::AAudioStreamRequest &request) override;
+ aaudio_result_t open(const aaudio::AAudioStreamRequest &request) override
+ EXCLUDES(mUpMessageQueueLock);
aaudio_result_t startClient(const android::AudioClient& client,
const audio_attributes_t *attr,
diff --git a/services/oboeservice/AAudioServiceStreamShared.h b/services/oboeservice/AAudioServiceStreamShared.h
index 0b2513a..c6b74e1 100644
--- a/services/oboeservice/AAudioServiceStreamShared.h
+++ b/services/oboeservice/AAudioServiceStreamShared.h
@@ -50,7 +50,8 @@
std::string dump() const override;
- aaudio_result_t open(const aaudio::AAudioStreamRequest &request) override;
+ aaudio_result_t open(const aaudio::AAudioStreamRequest &request) override
+ EXCLUDES(mUpMessageQueueLock);
void writeDataIfRoom(int64_t mmapFramesRead, const void *buffer, int32_t numFrames);
@@ -107,7 +108,7 @@
private:
- std::shared_ptr<SharedRingBuffer> mAudioDataQueue GUARDED_BY(audioDataQueueLock);
+ std::shared_ptr<SharedRingBuffer> mAudioDataQueue PT_GUARDED_BY(audioDataQueueLock);
std::atomic<int64_t> mTimestampPositionOffset;
std::atomic<int32_t> mXRunCount;
diff --git a/services/oboeservice/AAudioStreamTracker.h b/services/oboeservice/AAudioStreamTracker.h
index 99f4b6c..51a783d 100644
--- a/services/oboeservice/AAudioStreamTracker.h
+++ b/services/oboeservice/AAudioStreamTracker.h
@@ -37,7 +37,7 @@
* @param streamHandle
* @return number of streams removed
*/
- int32_t removeStreamByHandle(aaudio_handle_t streamHandle);
+ int32_t removeStreamByHandle(aaudio_handle_t streamHandle) EXCLUDES(mHandleLock);
/**
* Look up a stream based on the handle.
@@ -46,7 +46,7 @@
* @return strong pointer to the stream if found, or nullptr
*/
android::sp<aaudio::AAudioServiceStreamBase> getStreamByHandle(
- aaudio_handle_t streamHandle);
+ aaudio_handle_t streamHandle) EXCLUDES(mHandleLock);
/**
* Look up a stream based on the AudioPolicy portHandle.
@@ -56,7 +56,7 @@
* @return strong pointer to the stream if found, or nullptr
*/
android::sp<aaudio::AAudioServiceStreamBase> findStreamByPortHandle(
- audio_port_handle_t portHandle);
+ audio_port_handle_t portHandle) EXCLUDES(mHandleLock);
/**
* Store a strong pointer to the stream and return a unique handle for future reference.
@@ -64,7 +64,8 @@
* @param serviceStream
* @return handle for identifying the stream
*/
- aaudio_handle_t addStreamForHandle(const android::sp<AAudioServiceStreamBase>& serviceStream);
+ aaudio_handle_t addStreamForHandle(const android::sp<AAudioServiceStreamBase>& serviceStream)
+ EXCLUDES(mHandleLock);
/**
* @return string that can be added to dumpsys