Files
aliyun-openapi-cpp-sdk/core/src/Executor.cc
haowei.yao f6db1a27e4 Init commit
Signed-off-by: haowei.yao <haowei.yao@alibaba-inc.com>
2017-12-27 10:03:32 +08:00

124 lines
2.1 KiB
C++

/*
* Copyright 2009-2017 Alibaba Cloud All rights reserved.
*
* 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.
*/
#include "Executor.h"
#include <alibabacloud/core/Runnable.h>
using namespace AlibabaCloud;
Executor *Executor::self_ = nullptr;
Executor::Executor() :
cvMutex_(),
shutdown_(true),
tasksQueue_(),
tasksQueueMutex_(),
thread_()
{
self_ = this;
}
Executor::~Executor()
{
self_ = nullptr;
shutdown();
}
Executor * Executor::instance()
{
return self_;
}
bool Executor::start()
{
if (!isShutdown())
return true;
auto threadMain = [this]()
{
while (!shutdown_)
{
while (!tasksQueue_.empty())
{
Runnable *task = nullptr;
{
std::lock_guard<std::mutex> lock(tasksQueueMutex_);
if (!tasksQueue_.empty())
{
task = tasksQueue_.front();
tasksQueue_.pop();
}
}
if (task) {
task->run();
delete task;
}
}
if (!shutdown_) {
std::unique_lock<std::mutex> lk(cvMutex_);
cv_.wait(lk);
}
}
};
shutdown_ = false;
thread_ = std::thread(threadMain);
return true;
}
bool Executor::isShutdown()const
{
return shutdown_;
}
void Executor::execute(Runnable* task)
{
if (isShutdown())
return;
std::lock_guard<std::mutex> locker(tasksQueueMutex_);
tasksQueue_.push(task);
wakeUp();
}
void Executor::wakeUp()
{
std::unique_lock<std::mutex> lk(cvMutex_);
cv_.notify_one();
}
void Executor::shutdown()
{
if (isShutdown())
return;
{
std::lock_guard<std::mutex> locker(tasksQueueMutex_);
while (tasksQueue_.size() > 0) {
auto task = tasksQueue_.front();
delete task;
tasksQueue_.pop();
}
}
shutdown_ = true;
wakeUp();
if (thread_.joinable())
thread_.join();
}