From 48dc9fcea5bfd2b89682e05f45cd94b98919df0b Mon Sep 17 00:00:00 2001 From: f Date: Wed, 10 Mar 2021 04:40:58 +0000 Subject: [PATCH] Make states atomic and update comments Bug: 166800618 Test: atest VtsHalBiometricsFingerprintTargetTest Change-Id: I52ee6e8b6ddefdc972e803bcd81819f04061a570 --- .../fingerprint/aidl/default/Session.cpp | 2 +- .../aidl/default/include/Session.h | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/biometrics/fingerprint/aidl/default/Session.cpp b/biometrics/fingerprint/aidl/default/Session.cpp index f6a03143a0..8db320569a 100644 --- a/biometrics/fingerprint/aidl/default/Session.cpp +++ b/biometrics/fingerprint/aidl/default/Session.cpp @@ -46,7 +46,7 @@ void Session::scheduleStateOrCrash(SessionState state) { void Session::enterStateOrCrash(int cookie, SessionState state) { CHECK(mScheduledState == state); - mCurrentState = mScheduledState; + mCurrentState = state; mScheduledState = SessionState::IDLING; mCb->onStateChanged(cookie, mCurrentState); } diff --git a/biometrics/fingerprint/aidl/default/include/Session.h b/biometrics/fingerprint/aidl/default/include/Session.h index adda8310f4..b5e55b3785 100644 --- a/biometrics/fingerprint/aidl/default/include/Session.h +++ b/biometrics/fingerprint/aidl/default/include/Session.h @@ -82,13 +82,28 @@ class Session : public BnSession { // by calling ISessionCallback#onStateChanged. void enterIdling(int cookie); + // The sensor and user IDs for which this session was created. int32_t mSensorId; int32_t mUserId; + + // Callback for talking to the framework. This callback must only be called from non-binder + // threads to prevent nested binder calls and consequently a binder thread exhaustion. + // Practically, it means that this callback should always be called from the worker thread. std::shared_ptr mCb; + + // Module that communicates to the actual fingerprint hardware, keystore, TEE, etc. In real + // life such modules typically consume a lot of memory and are slow to initialize. This is here + // to showcase how such a module can be used within a Session without incurring the high + // initialization costs every time a Session is constructed. FakeFingerprintEngine* mEngine; + + // Worker thread that allows to schedule tasks for asynchronous execution. WorkerThread* mWorker; - SessionState mScheduledState; - SessionState mCurrentState; + + // Simple representation of the session's state machine. These are atomic because they can be + // modified from both the main and the worker threads. + std::atomic mScheduledState; + std::atomic mCurrentState; }; } // namespace aidl::android::hardware::biometrics::fingerprint