// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "extensions/common/features/feature_channel.h" #include "base/logging.h" #include "components/version_info/version_info.h" namespace { // The current channel to be reported, unless overridden by // |ScopedCurrentChannel|. version_info::Channel g_current_channel = version_info::Channel::STABLE; // The current channel overridden by |ScopedCurrentChannel|. The value is valid // only whenever |g_override_count| is non-zero. version_info::Channel g_overridden_channel = version_info::Channel::STABLE; // The number of currently existing instances of |ScopedCurrentChannel|. int g_override_count = 0; } // namespace namespace extensions { version_info::Channel GetCurrentChannel() { return g_override_count ? g_overridden_channel : g_current_channel; } void SetCurrentChannel(version_info::Channel channel) { // In certain unit tests, SetCurrentChannel can be called within the same // process (where e.g. utility processes run as a separate thread). Don't // write if the value is the same to avoid TSAN failures. if (channel != g_current_channel) g_current_channel = channel; } ScopedCurrentChannel::ScopedCurrentChannel(version_info::Channel channel) : channel_(channel), original_overridden_channel_(g_overridden_channel), original_override_count_(g_override_count) { g_overridden_channel = channel; ++g_override_count; } ScopedCurrentChannel::~ScopedCurrentChannel() { DCHECK_EQ(original_override_count_ + 1, g_override_count) << "Scoped channel setters are not nested properly"; DCHECK_EQ(g_overridden_channel, channel_) << "Scoped channel setters are not nested properly"; g_overridden_channel = original_overridden_channel_; --g_override_count; } } // namespace extensions