/* * Copyright (C) 2016 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 HW_EMULATOR_CAMERA_WORKER_THREAD_H #define HW_EMULATOR_CAMERA_WORKER_THREAD_H #include namespace android { class EmulatedCamera; class EmulatedCameraDevice; class WorkerThread : public Thread { public: WorkerThread(const char* threadName, EmulatedCameraDevice* camera_dev, EmulatedCamera* cameraHAL); virtual ~WorkerThread() {} /* Starts the thread * Param: * oneBurst - Controls how many times thread loop should run. If * this parameter is 'true', thread routine will run only once * If this parameter is 'false', thread routine will run until * stopThread method is called. See startWorkerThread for more * info. * Return: * NO_ERROR on success, or an appropriate error status. */ status_t startThread(bool oneBurst); /* Stops the thread, this only requests that the thread exits. The method * will return right after the request has been made. Use joinThread to * wait for the thread to exit. */ status_t stopThread(); /* Wake a thread that's currently waiting to timeout or to be awoken */ status_t wakeThread(); /* Join the thread, waits until the thread exits before returning. */ status_t joinThread(); protected: /* Perform whatever work should be done in the worker thread. A subclass * needs to implement this. * Return: * true To continue thread loop, or false to exit the thread loop and * terminate the thread. */ virtual bool inWorkerThread() = 0; /* This provides an opportunity for a subclass to perform some operation * when the thread starts. This is run on the newly started thread. If this * returns an error the thread will exit and inWorkerThread will never be * called. */ virtual status_t onThreadStart() { return NO_ERROR; } /* This provides an opportunity for a subclass to perform some operation * when the thread exits. This is run on the worker thread. By default this * does nothing. */ virtual void onThreadExit() { } /* Containing camera device object. */ EmulatedCameraDevice* mCameraDevice; /* The camera HAL from the camera device object */ EmulatedCamera* mCameraHAL; /* Controls number of times the thread loop runs. * See startThread for more information. */ bool mOneBurst; /* Running Condition and mutex, use these to sleep the thread, the * supporting functions will use these to signal wakes and exits. */ Condition mRunningCondition; Mutex mRunningMutex; bool mRunning; private: /* Overriden base class method. * It is overriden in order to provide one-time initialization just * prior to starting the thread routine. */ status_t readyToRun() final; /* Implements abstract method of the base Thread class. */ bool threadLoop() final; const char* mThreadName; }; } // namespace android #endif // HW_EMULATOR_CAMERA_WORKER_THREAD_H