cameraserver: Wrap calls to IPCThreadState functions to factor in different transports.
Add a wrapper around calls to IPCThreadState to
account for the fact that remote HIDL calls may use binder function
implementations internally.Therefore, we need to know whether we are on
a binder / hwbinder thread and call the appropriate IPCThreadState /
hardware::IPCThreadState function internally.
Bug: 110364143
Test: GCA
Test: Third party app
Test: camera CTS (no new failures).
Change-Id: Ibad03fafd2ccc53a5352a6df45cf8f641bc7a3bf
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/services/camera/libcameraservice/api1/CameraClient.cpp b/services/camera/libcameraservice/api1/CameraClient.cpp
index ce44efe..d65ac7b 100644
--- a/services/camera/libcameraservice/api1/CameraClient.cpp
+++ b/services/camera/libcameraservice/api1/CameraClient.cpp
@@ -25,16 +25,13 @@
#include "api1/CameraClient.h"
#include "device1/CameraHardwareInterface.h"
#include "CameraService.h"
+#include "utils/CameraThreadState.h"
namespace android {
#define LOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
#define LOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
-static int getCallingPid() {
- return IPCThreadState::self()->getCallingPid();
-}
-
CameraClient::CameraClient(const sp<CameraService>& cameraService,
const sp<hardware::ICameraClient>& cameraClient,
const String16& clientPackageName,
@@ -45,7 +42,7 @@
String8::format("%d", cameraId), cameraId, cameraFacing, clientPid,
clientUid, servicePid)
{
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("CameraClient::CameraClient E (pid %d, id %d)", callingPid, cameraId);
mHardware = NULL;
@@ -63,7 +60,7 @@
status_t CameraClient::initialize(sp<CameraProviderManager> manager,
const String8& /*monitorTags*/) {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
status_t res;
LOG1("CameraClient::initialize E (pid %d, id %d)", callingPid, mCameraId);
@@ -104,7 +101,7 @@
// tear down the client
CameraClient::~CameraClient() {
mDestructionStarted = true;
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("CameraClient::~CameraClient E (pid %d, this %p)", callingPid, this);
disconnect();
@@ -147,7 +144,7 @@
// ----------------------------------------------------------------------------
status_t CameraClient::checkPid() const {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
if (callingPid == mClientPid) return NO_ERROR;
ALOGW("attempt to use a locked camera from a different process"
@@ -157,7 +154,8 @@
status_t CameraClient::checkPidAndHardware() const {
if (mHardware == 0) {
- ALOGE("attempt to use a camera after disconnect() (pid %d)", getCallingPid());
+ ALOGE("attempt to use a camera after disconnect() (pid %d)",
+ CameraThreadState::getCallingPid());
return INVALID_OPERATION;
}
status_t result = checkPid();
@@ -166,7 +164,7 @@
}
status_t CameraClient::lock() {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("lock (pid %d)", callingPid);
Mutex::Autolock lock(mLock);
@@ -181,7 +179,7 @@
}
status_t CameraClient::unlock() {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("unlock (pid %d)", callingPid);
Mutex::Autolock lock(mLock);
@@ -203,7 +201,7 @@
// connect a new client to the camera
status_t CameraClient::connect(const sp<hardware::ICameraClient>& client) {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("connect E (pid %d)", callingPid);
Mutex::Autolock lock(mLock);
@@ -239,7 +237,7 @@
}
binder::Status CameraClient::disconnect() {
- int callingPid = getCallingPid();
+ int callingPid = CameraThreadState::getCallingPid();
LOG1("disconnect E (pid %d)", callingPid);
Mutex::Autolock lock(mLock);
@@ -333,7 +331,7 @@
status_t CameraClient::setPreviewTarget(
const sp<IGraphicBufferProducer>& bufferProducer) {
LOG1("setPreviewTarget(%p) (pid %d)", bufferProducer.get(),
- getCallingPid());
+ CameraThreadState::getCallingPid());
sp<IBinder> binder;
sp<ANativeWindow> window;
@@ -350,7 +348,7 @@
// set the preview callback flag to affect how the received frames from
// preview are handled.
void CameraClient::setPreviewCallbackFlag(int callback_flag) {
- LOG1("setPreviewCallbackFlag(%d) (pid %d)", callback_flag, getCallingPid());
+ LOG1("setPreviewCallbackFlag(%d) (pid %d)", callback_flag, CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return;
@@ -371,13 +369,13 @@
// start preview mode
status_t CameraClient::startPreview() {
- LOG1("startPreview (pid %d)", getCallingPid());
+ LOG1("startPreview (pid %d)", CameraThreadState::getCallingPid());
return startCameraMode(CAMERA_PREVIEW_MODE);
}
// start recording mode
status_t CameraClient::startRecording() {
- LOG1("startRecording (pid %d)", getCallingPid());
+ LOG1("startRecording (pid %d)", CameraThreadState::getCallingPid());
return startCameraMode(CAMERA_RECORDING_MODE);
}
@@ -460,7 +458,7 @@
// stop preview mode
void CameraClient::stopPreview() {
- LOG1("stopPreview (pid %d)", getCallingPid());
+ LOG1("stopPreview (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return;
@@ -476,7 +474,7 @@
// stop recording mode
void CameraClient::stopRecording() {
- LOG1("stopRecording (pid %d)", getCallingPid());
+ LOG1("stopRecording (pid %d)", CameraThreadState::getCallingPid());
{
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return;
@@ -502,7 +500,7 @@
if (checkPidAndHardware() != NO_ERROR) return;
if (mem == nullptr) {
android_errorWriteWithInfoLog(CameraService::SN_EVENT_LOG_ID, "26164272",
- IPCThreadState::self()->getCallingUid(), nullptr, 0);
+ CameraThreadState::getCallingUid(), nullptr, 0);
return;
}
@@ -614,7 +612,7 @@
}
bool CameraClient::previewEnabled() {
- LOG1("previewEnabled (pid %d)", getCallingPid());
+ LOG1("previewEnabled (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return false;
@@ -622,7 +620,7 @@
}
bool CameraClient::recordingEnabled() {
- LOG1("recordingEnabled (pid %d)", getCallingPid());
+ LOG1("recordingEnabled (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
if (checkPidAndHardware() != NO_ERROR) return false;
@@ -630,7 +628,7 @@
}
status_t CameraClient::autoFocus() {
- LOG1("autoFocus (pid %d)", getCallingPid());
+ LOG1("autoFocus (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
@@ -640,7 +638,7 @@
}
status_t CameraClient::cancelAutoFocus() {
- LOG1("cancelAutoFocus (pid %d)", getCallingPid());
+ LOG1("cancelAutoFocus (pid %d)", CameraThreadState::getCallingPid());
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
@@ -651,7 +649,7 @@
// take a picture - image is returned in callback
status_t CameraClient::takePicture(int msgType) {
- LOG1("takePicture (pid %d): 0x%x", getCallingPid(), msgType);
+ LOG1("takePicture (pid %d): 0x%x", CameraThreadState::getCallingPid(), msgType);
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
@@ -680,7 +678,7 @@
// set preview/capture parameters - key/value pairs
status_t CameraClient::setParameters(const String8& params) {
- LOG1("setParameters (pid %d) (%s)", getCallingPid(), params.string());
+ LOG1("setParameters (pid %d) (%s)", CameraThreadState::getCallingPid(), params.string());
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();
@@ -695,16 +693,18 @@
String8 CameraClient::getParameters() const {
Mutex::Autolock lock(mLock);
// The camera service can unconditionally get the parameters at all times
- if (getCallingPid() != mServicePid && checkPidAndHardware() != NO_ERROR) return String8();
+ if (CameraThreadState::getCallingPid() != mServicePid && checkPidAndHardware() != NO_ERROR) {
+ return String8();
+ }
String8 params(mHardware->getParameters().flatten());
- LOG1("getParameters (pid %d) (%s)", getCallingPid(), params.string());
+ LOG1("getParameters (pid %d) (%s)", CameraThreadState::getCallingPid(), params.string());
return params;
}
// enable shutter sound
status_t CameraClient::enableShutterSound(bool enable) {
- LOG1("enableShutterSound (pid %d)", getCallingPid());
+ LOG1("enableShutterSound (pid %d)", CameraThreadState::getCallingPid());
status_t result = checkPidAndHardware();
if (result != NO_ERROR) return result;
@@ -719,7 +719,7 @@
}
status_t CameraClient::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
- LOG1("sendCommand (pid %d)", getCallingPid());
+ LOG1("sendCommand (pid %d)", CameraThreadState::getCallingPid());
int orientation;
Mutex::Autolock lock(mLock);
status_t result = checkPidAndHardware();