diff options
author | gspencer@chromium.org <gspencer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-01 19:28:34 +0000 |
---|---|---|
committer | gspencer@chromium.org <gspencer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-01 19:28:34 +0000 |
commit | 0fbd7033b5818725b4e956b93193f20f94fd698f (patch) | |
tree | b8f8b1bfda547db52d90b7afaa79eab3989a2ddd /base | |
parent | 68228cdf78bbc4abf2dbef712693ec8ee59d1f64 (diff) | |
download | chromium_src-0fbd7033b5818725b4e956b93193f20f94fd698f.zip chromium_src-0fbd7033b5818725b4e956b93193f20f94fd698f.tar.gz chromium_src-0fbd7033b5818725b4e956b93193f20f94fd698f.tar.bz2 |
Fixing AutoReset to be a template.
I've run into a couple of times this week when I needed one of these, for two different types besides bool. Time to fix the TODO.
TEST=trybots FTW, and built locally.
BUG=none
Review URL: http://codereview.chromium.org/2394001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48644 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r-- | base/auto_reset.h | 25 | ||||
-rw-r--r-- | base/message_pump_libevent.cc | 2 |
2 files changed, 15 insertions, 12 deletions
diff --git a/base/auto_reset.h b/base/auto_reset.h index dd968ef..3925abe 100644 --- a/base/auto_reset.h +++ b/base/auto_reset.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 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. @@ -7,27 +7,30 @@ #include "base/basictypes.h" -// AutoReset is useful for setting a variable to some value only during a -// particular scope. If you have code that has to add "var = false;" or -// "var = old_var;" at all the exit points of a block, for example, you would -// benefit from using this instead. +// AutoResetValue is useful for setting a variable to some value only +// during a particular scope. If you have code that has to add "var = +// false;" or "var = old_var;" at all the exit points of a block, for +// example, you would benefit from using this instead. // -// NOTE: Right now this is hardcoded to work on bools, since that covers all the -// cases where we've used it. It would be reasonable to turn it into a template -// class in the future. +// This should be obvious, but note that the AutoResetValue instance +// should have a shorter lifetime than the scoped_variable, to prevent +// writing to invalid memory when the AutoResetValue goes out of +// scope. +template<typename T> class AutoReset { public: - explicit AutoReset(bool* scoped_variable, bool new_value) + AutoReset(T* scoped_variable, T new_value) : scoped_variable_(scoped_variable), original_value_(*scoped_variable) { *scoped_variable_ = new_value; } + ~AutoReset() { *scoped_variable_ = original_value_; } private: - bool* scoped_variable_; - bool original_value_; + T* scoped_variable_; + T original_value_; DISALLOW_COPY_AND_ASSIGN(AutoReset); }; diff --git a/base/message_pump_libevent.cc b/base/message_pump_libevent.cc index 01ebee5..2ad1d97 100644 --- a/base/message_pump_libevent.cc +++ b/base/message_pump_libevent.cc @@ -229,7 +229,7 @@ static void timer_callback(int fd, short events, void *context) // Reentrant! void MessagePumpLibevent::Run(Delegate* delegate) { DCHECK(keep_running_) << "Quit must have been called outside of Run!"; - AutoReset auto_reset_in_run(&in_run_, true); + AutoReset<bool> auto_reset_in_run(&in_run_, true); // event_base_loopexit() + EVLOOP_ONCE is leaky, see http://crbug.com/25641. // Instead, make our own timer and reuse it on each call to event_base_loop(). |