blob: ce24fe7380cee978f07c20e6dd567e2c266cf0ed [file] [log] [blame]
// Copyright 2011 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: jmarantz@google.com (Joshua Marantz)
#include "net/instaweb/rewriter/public/process_context.h"
#include "base/logging.h"
#include "pagespeed/kernel/http/google_url.h"
#include "pagespeed/kernel/html/html_keywords.h"
#include "pagespeed/kernel/http/domain_registry.h"
#include "pagespeed/kernel/js/js_tokenizer.h"
#include "pagespeed/kernel/util/gflags.h"
#include "google/protobuf/stubs/common.h"
using namespace google; // NOLINT
namespace {
int construction_count = 0;
}
// Clean up valgrind-based memory-leak checks by deleting statically allocated
// data from various libraries. This must be called both from unit-tests
// and from the Apache module, so that valgrind can be run on both of them.
namespace net_instaweb {
ProcessContext::ProcessContext()
: js_tokenizer_patterns_(new pagespeed::js::JsTokenizerPatterns) {
++construction_count;
CHECK_EQ(1, construction_count)
<< "ProcessContext must only be constructed once.";
domain_registry::Init();
HtmlKeywords::Init();
// url/url_util.cc lazily initializes its "standard_schemes" table in a
// thread-unsafe way and so it must be explicitly initialized prior to thread
// creation, and explicitly terminated after thread quiescence.
url::Initialize();
}
ProcessContext::~ProcessContext() {
// Clean up statics from third_party code first.
// The command-line flags structures are lazily initialized, but
// they are done so in static constructors resulting from DEFINE_int32
// and other similar macros. So they must happen prior to threads
// starting up.
ShutDownCommandLineFlags();
// The protobuf shutdown infrastructure is lazily initialized in a threadsafe
// manner. See third_party/protobuf/src/google/protobuf/stubs/common.cc,
// function InitShutdownFunctionsOnce.
google::protobuf::ShutdownProtobufLibrary();
url::Shutdown();
HtmlKeywords::ShutDown();
}
} // namespace net_instaweb