summaryrefslogtreecommitdiffstats
path: root/base/synchronization/spin_wait.h
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-19 22:10:03 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-19 22:10:03 +0000
commita22230c4a7362d73f3e2c9be2d7e25d97245f253 (patch)
treeef378b20341cec29b7367497b920da85df7375e7 /base/synchronization/spin_wait.h
parent5b423bd7dd69b4c977fba2c5f828a7563b3bbb62 (diff)
downloadchromium_src-a22230c4a7362d73f3e2c9be2d7e25d97245f253.zip
chromium_src-a22230c4a7362d73f3e2c9be2d7e25d97245f253.tar.gz
chromium_src-a22230c4a7362d73f3e2c9be2d7e25d97245f253.tar.bz2
Move spin_wait to base/synchronization.
TEST=it compiles BUG=none Review URL: https://chromiumcodereview.appspot.com/6049006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@122723 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/synchronization/spin_wait.h')
-rw-r--r--base/synchronization/spin_wait.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/base/synchronization/spin_wait.h b/base/synchronization/spin_wait.h
new file mode 100644
index 0000000..884d0c4
--- /dev/null
+++ b/base/synchronization/spin_wait.h
@@ -0,0 +1,51 @@
+// Copyright (c) 2012 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.
+
+// This file provides a macro ONLY for use in testing.
+// DO NOT USE IN PRODUCTION CODE. There are much better ways to wait.
+
+// This code is very helpful in testing multi-threaded code, without depending
+// on almost any primitives. This is especially helpful if you are testing
+// those primitive multi-threaded constructs.
+
+// We provide a simple one argument spin wait (for 1 second), and a generic
+// spin wait (for longer periods of time).
+
+#ifndef BASE_SYNCHRONIZATION_SPIN_WAIT_H_
+#define BASE_SYNCHRONIZATION_SPIN_WAIT_H_
+#pragma once
+
+#include "base/threading/platform_thread.h"
+#include "base/time.h"
+
+// Provide a macro that will wait no longer than 1 second for an asynchronous
+// change is the value of an expression.
+// A typical use would be:
+//
+// SPIN_FOR_1_SECOND_OR_UNTIL_TRUE(0 == f(x));
+//
+// The expression will be evaluated repeatedly until it is true, or until
+// the time (1 second) expires.
+// Since tests generally have a 5 second watch dog timer, this spin loop is
+// typically used to get the padding needed on a given test platform to assure
+// that the test passes, even if load varies, and external events vary.
+
+#define SPIN_FOR_1_SECOND_OR_UNTIL_TRUE(expression) \
+ SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(base::TimeDelta::FromSeconds(1), \
+ (expression))
+
+#define SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(delta, expression) do { \
+ base::TimeTicks start = base::TimeTicks::Now(); \
+ const base::TimeDelta kTimeout = delta; \
+ while (!(expression)) { \
+ if (kTimeout < base::TimeTicks::Now() - start) { \
+ EXPECT_LE((base::TimeTicks::Now() - start).InMilliseconds(), \
+ kTimeout.InMilliseconds()) << "Timed out"; \
+ break; \
+ } \
+ base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(50)); \
+ } \
+ } while (0)
+
+#endif // BASE_SYNCHRONIZATION_SPIN_WAIT_H_