From 63df436e5f165605a5aebcace9012551470da5d0 Mon Sep 17 00:00:00 2001 From: Alexander Afanasyev Date: Sun, 15 Feb 2015 11:57:51 -0800 Subject: [PATCH] core: Make global random generator thread-local Change-Id: Ib17ea05592445cf99af9726ef7799ead813ca0fe Refs: #2489 --- core/random.cpp | 28 ++++++++++++++------- tests/core/random.t.cpp | 55 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 tests/core/random.t.cpp diff --git a/core/random.cpp b/core/random.cpp index 51b137e5..c398f8df 100644 --- a/core/random.cpp +++ b/core/random.cpp @@ -1,12 +1,12 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /** - * Copyright (c) 2014, Regents of the University of California, - * Arizona Board of Regents, - * Colorado State University, - * University Pierre & Marie Curie, Sorbonne University, - * Washington University in St. Louis, - * Beijing Institute of Technology, - * The University of Memphis + * Copyright (c) 2014-2015, Regents of the University of California, + * Arizona Board of Regents, + * Colorado State University, + * University Pierre & Marie Curie, Sorbonne University, + * Washington University in St. Louis, + * Beijing Institute of Technology, + * The University of Memphis. * * This file is part of NFD (Named Data Networking Forwarding Daemon). * See AUTHORS.md for complete list of NFD authors and contributors. @@ -24,15 +24,25 @@ */ #include "random.hpp" +#include namespace nfd { -static boost::random::mt19937 g_rng; +static boost::thread_specific_ptr g_rng; boost::random::mt19937& getGlobalRng() { - return g_rng; + if (g_rng.get() == nullptr) { + g_rng.reset(new boost::random::mt19937()); + } + return *g_rng; +} + +void +resetGlobalRng() +{ + g_rng.reset(); } } // namespace nfd diff --git a/tests/core/random.t.cpp b/tests/core/random.t.cpp new file mode 100644 index 00000000..279424e7 --- /dev/null +++ b/tests/core/random.t.cpp @@ -0,0 +1,55 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/** + * Copyright (c) 2014-2015, Regents of the University of California, + * Arizona Board of Regents, + * Colorado State University, + * University Pierre & Marie Curie, Sorbonne University, + * Washington University in St. Louis, + * Beijing Institute of Technology, + * The University of Memphis. + * + * This file is part of NFD (Named Data Networking Forwarding Daemon). + * See AUTHORS.md for complete list of NFD authors and contributors. + * + * NFD is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * NFD, e.g., in COPYING.md file. If not, see . + */ + +#include "core/random.hpp" + +#include "tests/test-common.hpp" + +#include + +namespace nfd { +namespace tests { + +BOOST_FIXTURE_TEST_SUITE(CoreRandom, BaseFixture) + +BOOST_AUTO_TEST_CASE(ThreadLocalRandon) +{ + boost::random::mt19937* s1 = &getGlobalRng(); + boost::random::mt19937* s2 = nullptr; + boost::thread t([&s2] { + s2 = &getGlobalRng(); + }); + + t.join(); + + BOOST_CHECK(s1 != nullptr); + BOOST_CHECK(s2 != nullptr); + BOOST_CHECK(s1 != s2); +} + +BOOST_AUTO_TEST_SUITE_END() + +} // namespace tests +} // namespace nfd