/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef HARDWARE_INTERFACES_CAMERA_COMMON_SIMPLETHREAD_H_ #define HARDWARE_INTERFACES_CAMERA_COMMON_SIMPLETHREAD_H_ #include namespace android { namespace hardware { namespace camera { namespace common { namespace helper { // A simple looper based on std::thread. class SimpleThread { public: SimpleThread(); virtual ~SimpleThread(); // Explicit call to start execution of the thread. No thread is created before this function // is called. virtual void run() final; virtual void requestExitAndWait() final; protected: // Main logic of the thread. This function is called repeatedly until it returns false. // Thread execution stops if this function returns false. virtual bool threadLoop() = 0; // Returns true if the thread execution should stop. Should be used by threadLoop to check if // the thread has been requested to exit. virtual inline bool exitPending() final { return mDone.load(std::memory_order_acquire); } private: // Wraps threadLoop in a simple while loop that allows safe exit virtual void runLoop() final; // Flag to signal end of thread execution. This flag is checked before every iteration // of threadLoop. std::atomic_bool mDone; std::thread mThread; }; } // namespace helper } // namespace common } // namespace camera } // namespace hardware } // namespace android #endif // HARDWARE_INTERFACES_CAMERA_COMMON_SIMPLETHREAD_H_