14035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
24035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
34035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * Redistribution and use in source and binary forms, with or without
44035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * modification, are permitted provided that the following conditions are
54035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * met:
64035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Redistributions of source code must retain the above copyright
74035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       notice, this list of conditions and the following disclaimer.
84035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Redistributions in binary form must reproduce the above
94035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       copyright notice, this list of conditions and the following
104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       disclaimer in the documentation and/or other materials provided
114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       with the distribution.
124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *     * Neither the name of The Linux Foundation, nor the names of its
134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       contributors may be used to endorse or promote products derived
144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *       from this software without specific prior written permission.
154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin *
284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin */
294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#ifndef __LOC_TIMER_CPP_H__
314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define __LOC_TIMER_CPP_H__
324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <stddef.h>
344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <log_util.h>
354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin// opaque class to provide service implementation.
374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinclass LocTimerDelegate;
384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinclass LocSharedLock;
394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin// LocTimer client must extend this class and implementthe callback.
414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin// start() / stop() methods are to arm / disarm timer.
424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinclass LocTimer
434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{
444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LocTimerDelegate* mTimer;
454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LocSharedLock* mLock;
464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // don't really want mLock to be manipulated by clients, yet LocTimer
474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // has to have a reference to the lock so that the delete of LocTimer
484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // and LocTimerDelegate can work together on their share resources.
494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    friend class LocTimerDelegate;
504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinpublic:
524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LocTimer();
534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    virtual ~LocTimer();
544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // timeOutInMs:  timeout delay in ms
564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // wakeOnExpire: true if to wake up CPU (if sleeping) upon timer
574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //                        expiration and notify the client.
584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //               false if to wait until next time CPU wakes up (if
594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //                        sleeping) and then notify the client.
604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // return:       true on success;
614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //               false on failure, e.g. timer is already running.
624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    bool start(uint32_t timeOutInMs, bool wakeOnExpire);
634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // return:       true on success;
654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //               false on failure, e.g. timer is not running.
664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    bool stop();
674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //  LocTimer client Should implement this method.
694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //  This method is used for timeout calling back to client. This method
704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    //  should be short enough (eg: send a message to your own thread).
714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    virtual void timeOutCallback() = 0;
724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin};
734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#endif //__LOC_DELAY_H__
75