Camera: remove stream_configuration_counter from camera3.h

Handle the race issue in the wrapper HAL instead of letting HAL
implementation handing it.

Test: Pixel 3 + camera CTS + GCA
Bug: 120986771
Change-Id: Iff97fcaa969bea6668679c57642e4322c4ca5c19
This commit is contained in:
Yin-Chia Yeh 2019-02-13 15:18:16 -08:00
parent 71e6298ea6
commit 9e3079b0de
3 changed files with 25 additions and 5 deletions

View file

@ -128,7 +128,9 @@ void CameraDeviceSession::configureStreams_3_4_Impl(
}
camera3_stream_configuration_t stream_list{};
stream_list.stream_configuration_counter = streamConfigCounter;
// Block reading mStreamConfigCounter until configureStream returns
Mutex::Autolock _sccl(mStreamConfigCounterLock);
mStreamConfigCounter = streamConfigCounter;
hidl_vec<camera3_stream_t*> streams;
stream_list.session_parameters = paramBuffer;
if (!preProcessConfigurationLocked_3_4(requestedConfiguration, &stream_list, &streams)) {

View file

@ -123,6 +123,10 @@ protected:
// Physical camera ids for the logical multi-camera. Empty if this
// is not a logical multi-camera.
std::unordered_set<std::string> mPhysicalCameraIds;
Mutex mStreamConfigCounterLock;
uint32_t mStreamConfigCounter = 1;
private:
struct TrampolineSessionInterface_3_4 : public ICameraDeviceSession {

View file

@ -72,6 +72,22 @@ Return<void> CameraDeviceSession::configureStreams_3_5(
Return<void> CameraDeviceSession::signalStreamFlush(
const hidl_vec<int32_t>& streamIds, uint32_t streamConfigCounter) {
if (mDevice->ops->signal_stream_flush == nullptr) {
return Void();
}
uint32_t currentCounter = 0;
{
Mutex::Autolock _l(mStreamConfigCounterLock);
currentCounter = mStreamConfigCounter;
}
if (streamConfigCounter < currentCounter) {
ALOGV("%s: streamConfigCounter %d is stale (current %d), skipping signal_stream_flush call",
__FUNCTION__, streamConfigCounter, mStreamConfigCounter);
return Void();
}
std::vector<camera3_stream_t*> streams(streamIds.size());
{
Mutex::Autolock _l(mInflightLock);
@ -84,10 +100,8 @@ Return<void> CameraDeviceSession::signalStreamFlush(
streams[i] = &mStreamMap[id];
}
}
if (mDevice->ops->signal_stream_flush != nullptr) {
mDevice->ops->signal_stream_flush(mDevice,
streamConfigCounter, streams.size(), streams.data());
}
mDevice->ops->signal_stream_flush(mDevice, streams.size(), streams.data());
return Void();
}