1eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* Copyright (c) 2015, The Linux Foundation. All rights reserved. 2eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 3eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Redistribution and use in source and binary forms, with or without 4eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * modification, are permitted provided that the following conditions are 5eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * met: 6eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * * Redistributions of source code must retain the above copyright 7eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * notice, this list of conditions and the following disclaimer. 8eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * * Redistributions in binary form must reproduce the above 9eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * copyright notice, this list of conditions and the following 10eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * disclaimer in the documentation and/or other materials provided 11eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * with the distribution. 12eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * * Neither the name of The Linux Foundation, nor the names of its 13eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * contributors may be used to endorse or promote products derived 14eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * from this software without specific prior written permission. 15eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 16eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 28eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh */ 29eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#ifndef __LOC_THREAD__ 30eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define __LOC_THREAD__ 31eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 32eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <stddef.h> 33eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <pthread.h> 34eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 35eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh// abstract class to be implemented by client to provide a runnable class 36eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh// which gets scheduled by LocThread 37eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhclass LocRunnable { 38eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhpublic: 39eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline LocRunnable() {} 40eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual ~LocRunnable() {} 41eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 42eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // The method to be implemented by thread clients 43eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // and be scheduled by LocThread 44eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // This method will be repeated called until it returns false; or 45eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // until thread is stopped. 46eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh virtual bool run() = 0; 47eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 48eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // The method to be run before thread loop (conditionally repeatedly) 49eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // calls run() 50eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void prerun() {} 51eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 52eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // The method to be run after thread loop (conditionally repeatedly) 53eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // calls run() 54eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void postrun() {} 55eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}; 56eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 57eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh// opaque class to provide service implementation. 58eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhclass LocThreadDelegate; 59eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 60eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh// A utility class to create a thread and run LocRunnable 61eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh// caller passes in. 62eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhclass LocThread { 63eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocThreadDelegate* mThread; 64eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhpublic: 65eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline LocThread() : mThread(NULL) {} 66eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh virtual ~LocThread(); 67eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 68eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh typedef pthread_t (*tCreate)(const char* name, void* (*start)(void*), void* arg); 69eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // client starts thread with a runnable, which implements 70eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // the logics to fun in the created thread context. 71eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // The thread could be either joinable or detached. 72eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // runnable is an obj managed by client. Client creates and 73eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // frees it (but must be after stop() is called, or 74eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // this LocThread obj is deleted). 75eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // The obj will be deleted by LocThread if start() 76eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // returns true. Else it is client's responsibility 77eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // to delete the object 78eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // Returns 0 if success; false if failure. 79eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh bool start(tCreate creator, const char* threadName, LocRunnable* runnable, bool joinable = true); 80eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline bool start(const char* threadName, LocRunnable* runnable, bool joinable = true) { 81eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return start(NULL, threadName, runnable, joinable); 82eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 83eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 84eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // NOTE: if this is a joinable thread, this stop may block 85eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // for a while until the thread is joined. 86eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh void stop(); 87eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 88eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // thread status check 89eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline bool isRunning() { return NULL != mThread; } 90eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}; 91eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 92eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#endif //__LOC_THREAD__ 93