Note that this version does not have Widevine Provisioning 4.0 support. It is only suitable for device upgrades. A new patch with provisioning 4.0 support will be made later.
105 lines
2.2 KiB
C++
105 lines
2.2 KiB
C++
// Copyright 2018 Google LLC. All Rights Reserved. This file and proprietary
|
|
// source code may only be used and distributed under the Widevine Master
|
|
// License Agreement.
|
|
//
|
|
// Timer class - provides a simple Android specific timer implementation
|
|
|
|
#include "timer.h"
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <utils/Mutex.h>
|
|
#include <utils/RefBase.h>
|
|
#include <utils/StrongPointer.h>
|
|
#include <utils/Thread.h>
|
|
|
|
namespace wvutil {
|
|
|
|
class Timer::Impl : virtual public android::RefBase {
|
|
private:
|
|
class ImplThread : public android::Thread {
|
|
public:
|
|
ImplThread() : Thread(false), handler_(NULL), period_ns_(0) {}
|
|
virtual ~ImplThread() {};
|
|
|
|
bool Start(TimerHandler *handler, uint32_t time_in_secs) {
|
|
handler_ = handler;
|
|
period_ns_ = time_in_secs * 1000000000ll;
|
|
return run("wvutil::Timer::Impl") == android::NO_ERROR;
|
|
}
|
|
|
|
void Stop() {
|
|
{
|
|
android::Mutex::Autolock autoLock(lock_);
|
|
stop_condition_.signal();
|
|
}
|
|
requestExitAndWait();
|
|
}
|
|
|
|
private:
|
|
virtual bool threadLoop() {
|
|
android::Mutex::Autolock autoLock(lock_);
|
|
stop_condition_.waitRelative(lock_, period_ns_);
|
|
handler_->OnTimerEvent();
|
|
return true;
|
|
}
|
|
|
|
TimerHandler *handler_;
|
|
uint64_t period_ns_;
|
|
android::Mutex lock_;
|
|
android::Condition stop_condition_;
|
|
|
|
CORE_DISALLOW_COPY_AND_ASSIGN(ImplThread);
|
|
};
|
|
|
|
android::sp<ImplThread> impl_thread_;
|
|
|
|
public:
|
|
Impl() {}
|
|
virtual ~Impl() {};
|
|
|
|
bool Start(TimerHandler *handler, uint32_t time_in_secs) {
|
|
impl_thread_ = new ImplThread();
|
|
return impl_thread_->Start(handler, time_in_secs);
|
|
}
|
|
|
|
void Stop() {
|
|
impl_thread_->Stop();
|
|
impl_thread_.clear();
|
|
}
|
|
|
|
bool IsRunning() {
|
|
return (impl_thread_ != NULL) && (impl_thread_->isRunning());
|
|
}
|
|
|
|
CORE_DISALLOW_COPY_AND_ASSIGN(Impl);
|
|
};
|
|
|
|
Timer::Timer() : impl_(new Timer::Impl()) {
|
|
}
|
|
|
|
Timer::~Timer() {
|
|
if (IsRunning())
|
|
Stop();
|
|
|
|
delete impl_;
|
|
impl_ = NULL;
|
|
}
|
|
|
|
bool Timer::Start(TimerHandler *handler, uint32_t time_in_secs) {
|
|
if (!handler || time_in_secs == 0)
|
|
return false;
|
|
|
|
return impl_->Start(handler, time_in_secs);
|
|
}
|
|
|
|
void Timer::Stop() {
|
|
impl_->Stop();
|
|
}
|
|
|
|
bool Timer::IsRunning() {
|
|
return impl_->IsRunning();
|
|
}
|
|
|
|
} // namespace wvutil
|