core: use C++11 <random> instead of Boost.Random
Change-Id: I8f22965b86c681581762a47995f29f888421a558 Refs: #3599
This commit is contained in:
+7
-13
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/**
|
||||
* Copyright (c) 2014-2015, Regents of the University of California,
|
||||
* Copyright (c) 2014-2016, Regents of the University of California,
|
||||
* Arizona Board of Regents,
|
||||
* Colorado State University,
|
||||
* University Pierre & Marie Curie, Sorbonne University,
|
||||
@@ -28,21 +28,15 @@
|
||||
|
||||
namespace nfd {
|
||||
|
||||
static boost::thread_specific_ptr<boost::random::mt19937> g_rng;
|
||||
|
||||
boost::random::mt19937&
|
||||
std::mt19937&
|
||||
getGlobalRng()
|
||||
{
|
||||
if (g_rng.get() == nullptr) {
|
||||
g_rng.reset(new boost::random::mt19937());
|
||||
static boost::thread_specific_ptr<std::mt19937> rng;
|
||||
if (rng.get() == nullptr) {
|
||||
std::random_device rd;
|
||||
rng.reset(new std::mt19937(rd()));
|
||||
}
|
||||
return *g_rng;
|
||||
}
|
||||
|
||||
void
|
||||
resetGlobalRng()
|
||||
{
|
||||
g_rng.reset();
|
||||
return *rng;
|
||||
}
|
||||
|
||||
} // namespace nfd
|
||||
|
||||
+16
-14
@@ -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-2016, 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,24 +24,26 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* This file declares the global random number generator
|
||||
* All random numbers in NFD should use this global random number generator,
|
||||
* so that the generator can be properly seeded when necessary.
|
||||
* This file declares the global pseudorandom number generator (PRNG).
|
||||
*
|
||||
* This random number generator is not suitable for security purposes;
|
||||
* security-critical code should use CryptoPP random number generator instead.
|
||||
* All random numbers generated by NFD should use this global generator,
|
||||
* so that it can be properly seeded when necessary.
|
||||
*
|
||||
* This PRNG is not suitable for security purposes; security-critical
|
||||
* code must use a cryptographically secure PRNG, such as those provided
|
||||
* by OpenSSL and Crypto++.
|
||||
*/
|
||||
|
||||
#ifndef NFD_CORE_RANDOM_HPP
|
||||
#define NFD_CORE_RANDOM_HPP
|
||||
|
||||
#include <boost/random/mersenne_twister.hpp>
|
||||
#include <random>
|
||||
|
||||
namespace nfd {
|
||||
|
||||
/** \return the global random number generator instance
|
||||
*/
|
||||
boost::random::mt19937&
|
||||
std::mt19937&
|
||||
getGlobalRng();
|
||||
|
||||
} // namespace nfd
|
||||
|
||||
@@ -24,11 +24,8 @@
|
||||
*/
|
||||
|
||||
#include "asf-probing-module.hpp"
|
||||
|
||||
#include "core/random.hpp"
|
||||
|
||||
#include <boost/random/uniform_real_distribution.hpp>
|
||||
|
||||
namespace nfd {
|
||||
namespace fw {
|
||||
namespace asf {
|
||||
@@ -186,8 +183,8 @@ ProbingModule::getProbingProbability(uint64_t rank, uint64_t rankSum, uint64_t n
|
||||
double
|
||||
ProbingModule::getRandomNumber(double start, double end)
|
||||
{
|
||||
boost::random::uniform_real_distribution<double> distribution(start, end);
|
||||
return distribution(getGlobalRng());
|
||||
std::uniform_real_distribution<double> dist(start, end);
|
||||
return dist(getGlobalRng());
|
||||
}
|
||||
|
||||
} // namespace asf
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
#include "strategy.hpp"
|
||||
#include "table/cleanup.hpp"
|
||||
#include <ndn-cxx/lp/tags.hpp>
|
||||
#include <boost/random/uniform_int_distribution.hpp>
|
||||
|
||||
namespace nfd {
|
||||
|
||||
@@ -270,7 +269,7 @@ Forwarder::onOutgoingInterest(const shared_ptr<pit::Entry>& pitEntry, Face& outF
|
||||
|
||||
if (wantNewNonce) {
|
||||
interest = make_shared<Interest>(*interest);
|
||||
static boost::random::uniform_int_distribution<uint32_t> dist;
|
||||
static std::uniform_int_distribution<uint32_t> dist;
|
||||
interest->setNonce(dist(getGlobalRng()));
|
||||
}
|
||||
|
||||
|
||||
+14
-15
@@ -26,7 +26,6 @@
|
||||
#include "ncc-strategy.hpp"
|
||||
#include "pit-algorithm.hpp"
|
||||
#include "core/random.hpp"
|
||||
#include <boost/random/uniform_int_distribution.hpp>
|
||||
|
||||
namespace nfd {
|
||||
namespace fw {
|
||||
@@ -143,8 +142,7 @@ NccStrategy::doPropagate(weak_ptr<pit::Entry> pitEntryWeak)
|
||||
}
|
||||
|
||||
if (isForwarded) {
|
||||
boost::random::uniform_int_distribution<time::nanoseconds::rep> dist(0,
|
||||
pitEntryInfo->maxInterval.count() - 1);
|
||||
std::uniform_int_distribution<time::nanoseconds::rep> dist(0, pitEntryInfo->maxInterval.count() - 1);
|
||||
time::nanoseconds deferNext = time::nanoseconds(dist(getGlobalRng()));
|
||||
pitEntryInfo->propagateTimer = scheduler::schedule(deferNext,
|
||||
bind(&NccStrategy::doPropagate, this, weak_ptr<pit::Entry>(pitEntry)));
|
||||
@@ -239,13 +237,9 @@ NccStrategy::getMeasurementsEntryInfo(measurements::Entry* entry)
|
||||
return *info;
|
||||
}
|
||||
|
||||
|
||||
const time::microseconds NccStrategy::MeasurementsEntryInfo::INITIAL_PREDICTION =
|
||||
time::microseconds(8192);
|
||||
const time::microseconds NccStrategy::MeasurementsEntryInfo::MIN_PREDICTION =
|
||||
time::microseconds(127);
|
||||
const time::microseconds NccStrategy::MeasurementsEntryInfo::MAX_PREDICTION =
|
||||
time::microseconds(160000);
|
||||
const time::microseconds NccStrategy::MeasurementsEntryInfo::INITIAL_PREDICTION = time::microseconds(8192);
|
||||
const time::microseconds NccStrategy::MeasurementsEntryInfo::MIN_PREDICTION = time::microseconds(127);
|
||||
const time::microseconds NccStrategy::MeasurementsEntryInfo::MAX_PREDICTION = time::milliseconds(160);
|
||||
|
||||
NccStrategy::MeasurementsEntryInfo::MeasurementsEntryInfo()
|
||||
: prediction(INITIAL_PREDICTION)
|
||||
@@ -259,7 +253,8 @@ NccStrategy::MeasurementsEntryInfo::inheritFrom(const MeasurementsEntryInfo& oth
|
||||
}
|
||||
|
||||
shared_ptr<Face>
|
||||
NccStrategy::MeasurementsEntryInfo::getBestFace(void) {
|
||||
NccStrategy::MeasurementsEntryInfo::getBestFace()
|
||||
{
|
||||
shared_ptr<Face> best = this->bestFace.lock();
|
||||
if (best != nullptr) {
|
||||
return best;
|
||||
@@ -269,7 +264,8 @@ NccStrategy::MeasurementsEntryInfo::getBestFace(void) {
|
||||
}
|
||||
|
||||
void
|
||||
NccStrategy::MeasurementsEntryInfo::updateBestFace(const Face& face) {
|
||||
NccStrategy::MeasurementsEntryInfo::updateBestFace(const Face& face)
|
||||
{
|
||||
if (this->bestFace.expired()) {
|
||||
this->bestFace = const_cast<Face&>(face).shared_from_this();
|
||||
return;
|
||||
@@ -285,19 +281,22 @@ NccStrategy::MeasurementsEntryInfo::updateBestFace(const Face& face) {
|
||||
}
|
||||
|
||||
void
|
||||
NccStrategy::MeasurementsEntryInfo::adjustPredictDown() {
|
||||
NccStrategy::MeasurementsEntryInfo::adjustPredictDown()
|
||||
{
|
||||
prediction = std::max(MIN_PREDICTION,
|
||||
time::microseconds(prediction.count() - (prediction.count() >> ADJUST_PREDICT_DOWN_SHIFT)));
|
||||
}
|
||||
|
||||
void
|
||||
NccStrategy::MeasurementsEntryInfo::adjustPredictUp() {
|
||||
NccStrategy::MeasurementsEntryInfo::adjustPredictUp()
|
||||
{
|
||||
prediction = std::min(MAX_PREDICTION,
|
||||
time::microseconds(prediction.count() + (prediction.count() >> ADJUST_PREDICT_UP_SHIFT)));
|
||||
}
|
||||
|
||||
void
|
||||
NccStrategy::MeasurementsEntryInfo::ageBestFace() {
|
||||
NccStrategy::MeasurementsEntryInfo::ageBestFace()
|
||||
{
|
||||
this->previousFace = this->bestFace;
|
||||
this->bestFace.reset();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/**
|
||||
* Copyright (c) 2014-2015, Regents of the University of California,
|
||||
* Copyright (c) 2014-2016, Regents of the University of California,
|
||||
* Arizona Board of Regents,
|
||||
* Colorado State University,
|
||||
* University Pierre & Marie Curie, Sorbonne University,
|
||||
@@ -32,15 +32,15 @@
|
||||
namespace nfd {
|
||||
namespace tests {
|
||||
|
||||
BOOST_FIXTURE_TEST_SUITE(TestRandom, BaseFixture)
|
||||
BOOST_AUTO_TEST_SUITE(TestRandom)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(ThreadLocalRandon)
|
||||
BOOST_AUTO_TEST_CASE(ThreadLocalRng)
|
||||
{
|
||||
boost::random::mt19937* s1 = &getGlobalRng();
|
||||
boost::random::mt19937* s2 = nullptr;
|
||||
std::mt19937* s1 = &getGlobalRng();
|
||||
std::mt19937* s2 = nullptr;
|
||||
boost::thread t([&s2] {
|
||||
s2 = &getGlobalRng();
|
||||
});
|
||||
s2 = &getGlobalRng();
|
||||
});
|
||||
|
||||
t.join();
|
||||
|
||||
@@ -49,7 +49,7 @@ BOOST_AUTO_TEST_CASE(ThreadLocalRandon)
|
||||
BOOST_CHECK(s1 != s2);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
BOOST_AUTO_TEST_SUITE_END() // TestRandom
|
||||
|
||||
} // namespace tests
|
||||
} // namespace nfd
|
||||
|
||||
@@ -158,8 +158,8 @@ BOOST_FIXTURE_TEST_CASE(Basic, AsfGridFixture)
|
||||
runConsumer();
|
||||
|
||||
BOOST_CHECK_EQUAL(consumer->getForwarderFace().getCounters().nOutData, 89);
|
||||
BOOST_CHECK_LE(linkAB->getFace(nodeA).getCounters().nOutInterests, 60);
|
||||
BOOST_CHECK_GE(linkAD->getFace(nodeA).getCounters().nOutInterests, 60);
|
||||
BOOST_CHECK_LE(linkAB->getFace(nodeA).getCounters().nOutInterests, 61); // FIXME #3830
|
||||
BOOST_CHECK_GE(linkAD->getFace(nodeA).getCounters().nOutInterests, 59); // FIXME #3830
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(Nack, AsfGridFixture)
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
*/
|
||||
|
||||
#include "mgmt/face-manager.hpp"
|
||||
#include "core/random.hpp"
|
||||
#include "face/tcp-factory.hpp"
|
||||
#include "face/udp-factory.hpp"
|
||||
|
||||
#include "nfd-manager-common-fixture.hpp"
|
||||
#include "../face/dummy-face.hpp"
|
||||
|
||||
#include <ndn-cxx/util/random.hpp>
|
||||
#include <ndn-cxx/encoding/tlv.hpp>
|
||||
#include <ndn-cxx/mgmt/nfd/channel-status.hpp>
|
||||
#include <ndn-cxx/mgmt/nfd/face-event-notification.hpp>
|
||||
@@ -103,7 +103,8 @@ private:
|
||||
static typename std::enable_if<std::is_base_of<SimpleCounter, T>::value>::type
|
||||
randomizeCounter(const T& counter)
|
||||
{
|
||||
const_cast<T&>(counter).set(ndn::random::generateWord64());
|
||||
static std::uniform_int_distribution<typename T::rep> dist;
|
||||
const_cast<T&>(counter).set(dist(getGlobalRng()));
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "mgmt/strategy-choice-manager.hpp"
|
||||
|
||||
#include "core/random.hpp"
|
||||
#include "face/face.hpp"
|
||||
#include "face/internal-face.hpp"
|
||||
#include "fw/strategy.hpp"
|
||||
@@ -36,7 +37,6 @@
|
||||
#include "tests/daemon/fw/dummy-strategy.hpp"
|
||||
#include "tests/daemon/fw/install-strategy.hpp"
|
||||
|
||||
#include <ndn-cxx/util/random.hpp>
|
||||
#include <ndn-cxx/mgmt/nfd/strategy-choice.hpp>
|
||||
|
||||
namespace nfd {
|
||||
@@ -200,10 +200,11 @@ BOOST_AUTO_TEST_CASE(StrategyChoiceDataset)
|
||||
actualStrategies.insert(entry.getStrategyName());
|
||||
}
|
||||
|
||||
std::uniform_int_distribution<uint64_t> dist;
|
||||
size_t nEntries = 1024;
|
||||
for (size_t i = 0 ; i < nEntries ; i++) {
|
||||
auto name = Name("test-name").appendSegment(i);
|
||||
auto strategy = Name("test-strategy").appendSegment(ndn::random::generateWord64());
|
||||
auto strategy = Name("test-strategy").appendSegment(dist(getGlobalRng()));
|
||||
auto entry = ndn::nfd::StrategyChoice().setName(name).setStrategy(strategy);
|
||||
actualNames.insert(name);
|
||||
actualStrategies.insert(strategy);
|
||||
|
||||
@@ -25,12 +25,12 @@
|
||||
|
||||
#include "rib/rib-manager.hpp"
|
||||
#include "manager-common-fixture.hpp"
|
||||
#include "core/random.hpp"
|
||||
|
||||
#include <ndn-cxx/lp/tags.hpp>
|
||||
#include <ndn-cxx/mgmt/nfd/rib-entry.hpp>
|
||||
#include <ndn-cxx/mgmt/nfd/face-status.hpp>
|
||||
#include <ndn-cxx/mgmt/nfd/face-event-notification.hpp>
|
||||
#include <ndn-cxx/util/random.hpp>
|
||||
|
||||
namespace nfd {
|
||||
namespace rib {
|
||||
@@ -482,11 +482,12 @@ operator!=(const RibEntry& left, const RibEntry& right)
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(RibDataset, UnauthorizedRibManagerFixture)
|
||||
{
|
||||
std::uniform_int_distribution<uint64_t> dist;
|
||||
uint64_t faceId = 0;
|
||||
auto generateRoute = [&faceId] () -> Route {
|
||||
auto generateRoute = [&dist, &faceId] () -> Route {
|
||||
Route route;
|
||||
route.faceId = ++faceId;
|
||||
route.cost = ndn::random::generateWord64();
|
||||
route.cost = dist(getGlobalRng());
|
||||
route.expires = time::steady_clock::TimePoint::max();
|
||||
return route;
|
||||
};
|
||||
|
||||
@@ -110,7 +110,7 @@ main(int, char**)
|
||||
conf.check_cxx(header_name='ifaddrs.h', mandatory=False)
|
||||
conf.check_cxx(header_name='valgrind/valgrind.h', define_name='HAVE_VALGRIND', mandatory=False)
|
||||
|
||||
boost_libs = 'system chrono program_options random thread log log_setup'
|
||||
boost_libs = 'system chrono program_options thread log log_setup'
|
||||
if conf.options.with_tests:
|
||||
conf.env['WITH_TESTS'] = 1
|
||||
conf.define('WITH_TESTS', 1)
|
||||
|
||||
Reference in New Issue
Block a user