blob: e76b638965ad27a70f8fb369b0d2d77455c1b02a [file] [log] [blame]
// Copyright 2015 Google Inc.
//
// 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.
//
// Author: cheesy@google.com (Steve Hill)
#include "pagespeed/controller/in_process_central_controller.h"
#include "pagespeed/controller/expensive_operation_callback.h"
#include "pagespeed/controller/named_lock_schedule_rewrite_controller.h"
#include "pagespeed/controller/popularity_contest_schedule_rewrite_controller.h"
#include "pagespeed/controller/queued_expensive_operation_controller.h"
#include "pagespeed/controller/schedule_rewrite_callback.h"
#include "pagespeed/controller/work_bound_expensive_operation_controller.h"
#include "pagespeed/kernel/base/function.h"
#include "pagespeed/kernel/base/string.h"
namespace net_instaweb {
namespace {
class ExpensiveOperationContextImpl : public ExpensiveOperationContext {
public:
ExpensiveOperationContextImpl(ExpensiveOperationController* controller,
ExpensiveOperationCallback* callback)
: controller_(controller), callback_(callback) {
// SetTransactionContext steals ownership, which means we will never outlive
// the callback.
callback_->SetTransactionContext(this);
controller_->ScheduleExpensiveOperation(
MakeFunction(this, &ExpensiveOperationContextImpl::CallRun,
&ExpensiveOperationContextImpl::CallCancel));
}
~ExpensiveOperationContextImpl() {
Done();
}
void Done() override {
if (controller_ != nullptr) {
controller_->NotifyExpensiveOperationComplete();
controller_ = nullptr;
}
}
private:
void CallRun() {
callback_->CallRun();
}
void CallCancel() {
controller_ = nullptr; // Controller denied us, so don't try to release.
callback_->CallCancel();
}
ExpensiveOperationController* controller_;
ExpensiveOperationCallback* callback_;
};
class ScheduleRewriteContextImpl : public ScheduleRewriteContext {
public:
ScheduleRewriteContextImpl(ScheduleRewriteController* controller,
ScheduleRewriteCallback* callback)
: controller_(controller), callback_(callback), key_(callback_->key()) {
// SetTransactionContext steals ownership, which means we will never outlive
// the callback.
callback_->SetTransactionContext(this);
controller_->ScheduleRewrite(
key_, MakeFunction(this, &ScheduleRewriteContextImpl::CallRun,
&ScheduleRewriteContextImpl::CallCancel));
}
~ScheduleRewriteContextImpl() {
MarkSucceeded();
}
void MarkSucceeded() override {
if (controller_ != nullptr) {
controller_->NotifyRewriteComplete(key_);
controller_ = nullptr;
}
}
void MarkFailed() override {
if (controller_ != nullptr) {
controller_->NotifyRewriteFailed(key_);
controller_ = nullptr;
}
}
private:
void CallRun() {
callback_->CallRun();
}
void CallCancel() {
controller_ = nullptr; // Controller denied us, so don't try to release.
callback_->CallCancel();
}
ScheduleRewriteController* controller_;
ScheduleRewriteCallback* callback_;
const GoogleString key_;
};
} // namespace
InProcessCentralController::InProcessCentralController(
ExpensiveOperationController* expensive_operation_controller,
ScheduleRewriteController* schedule_rewrite_controller)
: expensive_operation_controller_(expensive_operation_controller),
schedule_rewrite_controller_(schedule_rewrite_controller) {
}
InProcessCentralController::~InProcessCentralController() {
}
void InProcessCentralController::InitStats(Statistics* statistics) {
NamedLockScheduleRewriteController::InitStats(statistics);
PopularityContestScheduleRewriteController::InitStats(statistics);
QueuedExpensiveOperationController::InitStats(statistics);
WorkBoundExpensiveOperationController::InitStats(statistics);
}
void InProcessCentralController::ShutDown() {
schedule_rewrite_controller_->ShutDown();
}
void InProcessCentralController::ScheduleExpensiveOperation(
ExpensiveOperationCallback* callback) {
// Starts the transaction and deletes itself when done.
new ExpensiveOperationContextImpl(expensive_operation_controller_.get(),
callback);
}
void InProcessCentralController::ScheduleRewrite(
ScheduleRewriteCallback* callback) {
// Starts the transaction and deletes itself when done.
new ScheduleRewriteContextImpl(schedule_rewrite_controller_.get(), callback);
}
} // namespace net_instaweb