util: rename Scheduler::scheduleEvent to schedule

Deprecate Scheduler::scheduleEvent and Scheduler::cancelEvent

refs #4883

Change-Id: I2bb16922aff04300d92dfd276dd436958a96929a
This commit is contained in:
Junxiao Shi committed 2019-03-18 09:39:22 -06:00
1 parent fd6123173d
commit a5f233e103
18 files changed
+139 -185

No files matched your search

+2 -2
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2013-2018 Regents of the University of California.
* Copyright (c) 2013-2019 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -56,7 +56,7 @@ public:
std::cout << "Sending " << interest << std::endl;
// Schedule a new event
m_scheduler.scheduleEvent(3_s, [this] { delayedInterest(); });
m_scheduler.schedule(3_s, [this] { delayedInterest(); });
// m_ioService.run() will block until all events finished or m_ioService.stop() is called
m_ioService.run();
+1 -1
View File
@@ -318,7 +318,7 @@ Face::doProcessEvents(time::milliseconds timeout, bool keepThread)
}
if (timeout > time::milliseconds::zero()) {
m_impl->m_processEventsTimeoutEvent = m_impl->m_scheduler.scheduleEvent(timeout,
m_impl->m_processEventsTimeoutEvent = m_impl->m_scheduler.schedule(timeout,
[&io = m_ioService, &work = m_impl->m_ioServiceWork] {
io.stop();
work.reset();
+2 -2
View File
@@ -185,8 +185,8 @@ private:
void
scheduleTimeoutEvent(Scheduler& scheduler)
{
m_timeoutEvent = scheduler.scheduleEvent(m_interest->getInterestLifetime(),
[=] { this->invokeTimeoutCallback(); });
m_timeoutEvent = scheduler.schedule(m_interest->getInterestLifetime(),
[=] { this->invokeTimeoutCallback(); });
}
/**
+1 -1
View File
@@ -45,7 +45,7 @@ InMemoryStorageEntry::setData(const Data& data)
void
InMemoryStorageEntry::scheduleMarkStale(Scheduler& sched, time::nanoseconds after)
{
m_markStaleEventId = sched.scheduleEvent(after, [this] { m_isFresh = false; });
m_markStaleEventId = sched.schedule(after, [this] { m_isFresh = false; });
}
} // namespace ndn
+2 -2
View File
@@ -57,7 +57,7 @@ public:
m_resolver.async_resolve(q, bind(&Resolver::onResolveResult, this, _1, _2, self));
m_resolveTimeout = m_scheduler.scheduleEvent(timeout, [=] { onResolveTimeout(self); });
m_resolveTimeout = m_scheduler.schedule(timeout, [=] { onResolveTimeout(self); });
}
iterator
@@ -71,7 +71,7 @@ private:
onResolveResult(const boost::system::error_code& error,
iterator it, const shared_ptr<Resolver>& self)
{
m_scheduler.cancelEvent(m_resolveTimeout);
m_resolveTimeout.cancel();
// ensure the Resolver isn't destructed while callbacks are still pending, see #2653
m_resolver.get_io_service().post([self] {});
@@ -184,7 +184,7 @@ void
NetworkMonitorImplOsx::scheduleCfLoop()
{
// poll each second for new events
m_cfLoopEvent = m_scheduler.scheduleEvent(1_s, [this] {
m_cfLoopEvent = m_scheduler.schedule(1_s, [this] {
// this should dispatch ready events and exit
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true);
scheduleCfLoop();
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2013-2018 Regents of the University of California.
* Copyright (c) 2013-2019 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -85,8 +85,8 @@ CertificateFetcherFromNetwork::nackCallback(const lp::Nack& nack,
--certRequest->nRetriesLeft;
if (certRequest->nRetriesLeft >= 0) {
m_scheduler.scheduleEvent(certRequest->waitAfterNack,
[=] { fetch(certRequest, state, continueValidation); });
m_scheduler.schedule(certRequest->waitAfterNack,
[=] { fetch(certRequest, state, continueValidation); });
certRequest->waitAfterNack *= 2;
}
else {
+1 -1
View File
@@ -151,7 +151,7 @@ NotificationSubscriberBase::afterReceiveNack(const lp::Nack& nack)
onNack(nack);
time::milliseconds delay = exponentialBackoff(nack);
m_nackEvent = m_scheduler.scheduleEvent(delay, [this] { sendInitialInterest(); });
m_nackEvent = m_scheduler.schedule(delay, [this] { sendInitialInterest(); });
}
void
+1 -1
View File
@@ -98,7 +98,7 @@ Scheduler::Scheduler(boost::asio::io_service& ioService)
Scheduler::~Scheduler() = default;
EventId
Scheduler::scheduleEvent(time::nanoseconds after, EventCallback callback)
Scheduler::schedule(time::nanoseconds after, EventCallback callback)
{
BOOST_ASSERT(callback != nullptr);
+14 -6
View File
@@ -48,7 +48,7 @@ using EventCallback = std::function<void()>;
/** \brief A handle of scheduled event.
*
* \code
* EventId eid = scheduler.scheduleEvent(10_ms, [] { doSomething(); });
* EventId eid = scheduler.schedule(10_ms, [] { doSomething(); });
* eid.cancel(); // cancel the event
* \endcode
*
@@ -116,7 +116,7 @@ operator<<(std::ostream& os, const EventId& eventId);
*
* \code
* {
* ScopedEventId eid = scheduler.scheduleEvent(10_ms, [] { doSomething(); });
* ScopedEventId eid = scheduler.schedule(10_ms, [] { doSomething(); });
* } // eid goes out of scope, canceling the event
* \endcode
*
@@ -154,12 +154,20 @@ public:
* \return EventId that can be used to cancel the scheduled event
*/
EventId
scheduleEvent(time::nanoseconds after, EventCallback callback);
schedule(time::nanoseconds after, EventCallback callback);
/** \brief Cancel a scheduled event
*
* You may also invoke `eid.cancel()`
/** \deprecated use schedule(after, callback)
*/
[[deprecated("use schedule(after, callback)")]]
EventId
scheduleEvent(time::nanoseconds after, EventCallback callback)
{
return schedule(after, std::move(callback));
}
/** \deprecated use EventId::cancel()
*/
[[deprecated("use EventId::cancel()")]]
void
cancelEvent(const EventId& eid)
{
+34 -45
View File
@@ -126,34 +126,12 @@ SegmentFetcher::fetchFirstSegment(const Interest& baseInterest, bool isRetransmi
interest.refreshNonce();
}
weak_ptr<SegmentFetcher> weakSelf = m_this;
m_nSegmentsInFlight++;
auto pendingInterest = m_face.expressInterest(interest,
bind(&SegmentFetcher::afterSegmentReceivedCb,
this, _1, _2, weakSelf),
bind(&SegmentFetcher::afterNackReceivedCb,
this, _1, _2, weakSelf),
nullptr);
auto timeoutEvent =
m_scheduler.scheduleEvent(m_options.useConstantInterestTimeout ? m_options.maxTimeout : getEstimatedRto(),
bind(&SegmentFetcher::afterTimeoutCb, this, interest, weakSelf));
if (isRetransmission) {
updateRetransmittedSegment(0, pendingInterest, timeoutEvent);
}
else {
BOOST_ASSERT(m_pendingSegments.count(0) == 0);
m_pendingSegments.emplace(0, PendingSegment{SegmentState::FirstInterest, time::steady_clock::now(),
pendingInterest, timeoutEvent});
}
sendInterest(0, interest, isRetransmission);
}
void
SegmentFetcher::fetchSegmentsInWindow(const Interest& origInterest)
{
weak_ptr<SegmentFetcher> weakSelf = m_this;
if (checkAllSegmentsReceived()) {
// All segments have been retrieved
return finalizeFetch();
@@ -194,31 +172,42 @@ SegmentFetcher::fetchSegmentsInWindow(const Interest& origInterest)
interest.setMustBeFresh(false);
interest.setInterestLifetime(m_options.interestLifetime);
interest.refreshNonce();
m_nSegmentsInFlight++;
auto pendingInterest = m_face.expressInterest(interest,
bind(&SegmentFetcher::afterSegmentReceivedCb,
this, _1, _2, weakSelf),
bind(&SegmentFetcher::afterNackReceivedCb,
this, _1, _2, weakSelf),
nullptr);
auto timeoutEvent =
m_scheduler.scheduleEvent(m_options.useConstantInterestTimeout ? m_options.maxTimeout : getEstimatedRto(),
bind(&SegmentFetcher::afterTimeoutCb, this, interest, weakSelf));
if (segment.second) { // Retransmission
updateRetransmittedSegment(segment.first, pendingInterest, timeoutEvent);
}
else { // First request for segment
BOOST_ASSERT(m_pendingSegments.count(segment.first) == 0);
m_pendingSegments.emplace(segment.first, PendingSegment{SegmentState::FirstInterest,
time::steady_clock::now(),
pendingInterest, timeoutEvent});
m_highInterest = segment.first;
}
sendInterest(segment.first, interest, segment.second);
}
}
void
SegmentFetcher::sendInterest(uint64_t segNum, const Interest& interest, bool isRetransmission)
{
weak_ptr<SegmentFetcher> weakSelf = m_this;
++m_nSegmentsInFlight;
auto pendingInterest = m_face.expressInterest(interest,
[this, weakSelf] (const Interest& interest, const Data& data) {
afterSegmentReceivedCb(interest, data, weakSelf);
},
[this, weakSelf] (const Interest& interest, const lp::Nack& nack) {
afterNackReceivedCb(interest, nack, weakSelf);
},
nullptr);
auto timeout = m_options.useConstantInterestTimeout ? m_options.maxTimeout : getEstimatedRto();
auto timeoutEvent = m_scheduler.schedule(timeout, [this, interest, weakSelf] {
afterTimeoutCb(interest, weakSelf);
});
if (isRetransmission) {
updateRetransmittedSegment(segNum, pendingInterest, timeoutEvent);
return;
}
PendingSegment pendingSegment{SegmentState::FirstInterest, time::steady_clock::now(),
pendingInterest, timeoutEvent};
bool isNew = m_pendingSegments.emplace(segNum, std::move(pendingSegment)).second;
BOOST_VERIFY(isNew);
m_highInterest = segNum;
}
void
SegmentFetcher::afterSegmentReceivedCb(const Interest& origInterest, const Data& data,
const weak_ptr<SegmentFetcher>& weakSelf)
+3
View File
@@ -188,6 +188,9 @@ private:
void
fetchSegmentsInWindow(const Interest& origInterest);
void
sendInterest(uint64_t segNum, const Interest& interest, bool isRetransmission);
void
afterSegmentReceivedCb(const Interest& origInterest, const Data& data,
const weak_ptr<SegmentFetcher>& weakSelf);
+8 -8
View File
@@ -87,7 +87,7 @@ protected:
}
outcome = '?';
return sched.scheduleEvent(delay, [this, interest, &outcome] {
return sched.schedule(delay, [this, interest, &outcome] {
face2->expressInterest(interest,
[&] (const Interest&, const Data&) { outcome = 'D'; },
[&] (const Interest&, const lp::Nack&) { outcome = 'N'; },
@@ -108,7 +108,7 @@ protected:
scheduler::EventId
terminateAfter(time::nanoseconds delay)
{
return sched.scheduleEvent(delay, [this] { face.getIoService().stop(); });
return sched.schedule(delay, [this] { face.getIoService().stop(); });
}
protected:
@@ -184,19 +184,19 @@ BOOST_FIXTURE_TEST_CASE_TEMPLATE(RegisterUnregisterPrefix, TransportType, Transp
[&] (const Name&) { ++nRegSuccess; },
[] (const Name&, const std::string& msg) { BOOST_ERROR("unexpected register prefix failure: " << msg); });
this->sched.scheduleEvent(1_s, [&nRegSuccess] {
this->sched.schedule(1_s, [&nRegSuccess] {
BOOST_CHECK_EQUAL(nRegSuccess, 1);
std::string output = executeCommand("nfdc route list | grep /Hello/World");
BOOST_CHECK(!output.empty());
});
this->sched.scheduleEvent(2_s, [this, id, &nUnregSuccess] {
this->sched.schedule(2_s, [this, id, &nUnregSuccess] {
this->face.unregisterPrefix(id,
[&] { ++nUnregSuccess; },
[] (const std::string& msg) { BOOST_ERROR("unexpected unregister prefix failure: " << msg); });
});
this->sched.scheduleEvent(3_s, [&nUnregSuccess] {
this->sched.schedule(3_s, [&nUnregSuccess] {
BOOST_CHECK_EQUAL(nUnregSuccess, 1);
// Boost.Test would fail if a child process exits with non-zero. http://stackoverflow.com/q/5325202
@@ -221,7 +221,7 @@ BOOST_FIXTURE_TEST_CASE_TEMPLATE(RegularFilter, TransportType, Transports, FaceF
[&] (const Name&) { ++nRegSuccess2; },
[] (const Name&, const std::string& msg) { BOOST_ERROR("unexpected register prefix failure: " << msg); });
this->sched.scheduleEvent(500_ms, [] {
this->sched.schedule(500_ms, [] {
std::string output = executeCommand("nfdc route list | grep /Hello/World");
BOOST_CHECK(!output.empty());
});
@@ -247,7 +247,7 @@ BOOST_FIXTURE_TEST_CASE_TEMPLATE(RegexFilter, TransportType, Transports, FaceFix
[&] (const Name&) { ++nRegSuccess; },
[] (const Name&, const std::string& msg) { BOOST_ERROR("unexpected register prefix failure: " << msg); });
this->sched.scheduleEvent(700_ms, [] {
this->sched.schedule(700_ms, [] {
std::string output = executeCommand("nfdc route list | grep /Hello/World");
BOOST_CHECK(!output.empty());
});
@@ -272,7 +272,7 @@ BOOST_FIXTURE_TEST_CASE_TEMPLATE(RegexFilterNoRegister, TransportType, Transport
this->face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
[&] (const InterestFilter&, const Interest& interest) { BOOST_ERROR("unexpected Interest"); });
this->sched.scheduleEvent(700_ms, [] {
this->sched.schedule(700_ms, [] {
// Boost.Test would fail if a child process exits with non-zero. http://stackoverflow.com/q/5325202
std::string output = executeCommand("nfdc route list | grep /Hello/World || true");
BOOST_CHECK(output.empty());
+5 -5
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2013-2018 Regents of the University of California.
* Copyright (c) 2013-2019 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -45,13 +45,13 @@ BOOST_AUTO_TEST_CASE(ScheduleCancel)
auto d1 = timedExecute([&] {
for (size_t i = 0; i < nEvents; ++i) {
eventIds[i] = sched.scheduleEvent(1_s, []{});
eventIds[i] = sched.schedule(1_s, []{});
}
});
auto d2 = timedExecute([&] {
for (size_t i = 0; i < nEvents; ++i) {
sched.cancelEvent(eventIds[i]);
eventIds[i].cancel();
}
});
@@ -72,13 +72,13 @@ BOOST_AUTO_TEST_CASE(Execute)
time::steady_clock::TimePoint t2;
// +1ms ensures this extra event is executed last. In case the overhead is less than 1ms,
// it will be reported as 1ms.
sched.scheduleEvent(t1 - time::steady_clock::now() + 1_ms, [&] {
sched.schedule(t1 - time::steady_clock::now() + 1_ms, [&] {
t2 = time::steady_clock::now();
BOOST_REQUIRE_EQUAL(nExpired, nEvents);
});
for (size_t i = 0; i < nEvents; ++i) {
sched.scheduleEvent(t1 - time::steady_clock::now(), [&] { ++nExpired; });
sched.schedule(t1 - time::steady_clock::now(), [&] { ++nExpired; });
}
io.run();
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2013-2018 Regents of the University of California.
* Copyright (c) 2013-2019 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -128,15 +128,9 @@ BOOST_AUTO_TEST_CASE(InterestSignature)
auto interest = makeInterest("/SecurityTestSignatureSha256WithEcdsa/InterestSignature/Interest1");
auto interest11 = makeInterest("/SecurityTestSignatureSha256WithEcdsa/InterestSignature/Interest1");
scheduler.scheduleEvent(100_ms, [&] {
m_keyChain.sign(*interest, security::SigningInfo(identity));
});
scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest, security::SigningInfo(identity)); });
advanceClocks(100_ms);
scheduler.scheduleEvent(100_ms, [&] {
m_keyChain.sign(*interest11, security::SigningInfo(identity));
});
scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest11, security::SigningInfo(identity)); });
advanceClocks(100_ms);
Block interestBlock(interest->wireEncode().wire(), interest->wireEncode().size());
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2013-2018 Regents of the University of California.
* Copyright (c) 2013-2019 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -133,15 +133,9 @@ BOOST_AUTO_TEST_CASE(InterestSignature)
auto interest = makeInterest("/SecurityTestSignatureSha256WithRsa/InterestSignature/Interest1");
auto interest11 = makeInterest("/SecurityTestSignatureSha256WithRsa/InterestSignature/Interest1");
scheduler.scheduleEvent(100_ms, [&] {
m_keyChain.sign(*interest, security::SigningInfo(identity));
});
scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest, security::SigningInfo(identity)); });
advanceClocks(100_ms);
scheduler.scheduleEvent(100_ms, [&] {
m_keyChain.sign(*interest11, security::SigningInfo(identity));
});
scheduler.schedule(100_ms, [&] { m_keyChain.sign(*interest11, security::SigningInfo(identity)); });
advanceClocks(100_ms);
Block interestBlock(interest->wireEncode().wire(), interest->wireEncode().size());
+53 -87
View File
@@ -53,25 +53,21 @@ BOOST_AUTO_TEST_CASE(Events)
size_t count1 = 0;
size_t count2 = 0;
scheduler.scheduleEvent(500_ms, [&] {
++count1;
BOOST_CHECK_EQUAL(count2, 1);
});
scheduler.schedule(500_ms, [&] {
++count1;
BOOST_CHECK_EQUAL(count2, 1);
});
EventId i = scheduler.scheduleEvent(1_s, [&] {
BOOST_ERROR("This event should not have been fired");
});
scheduler.cancelEvent(i);
EventId i = scheduler.schedule(1_s, [] { BOOST_ERROR("This event should not have been fired"); });
i.cancel();
scheduler.scheduleEvent(250_ms, [&] {
BOOST_CHECK_EQUAL(count1, 0);
++count2;
});
scheduler.schedule(250_ms, [&] {
BOOST_CHECK_EQUAL(count1, 0);
++count2;
});
i = scheduler.scheduleEvent(50_ms, [&] {
BOOST_ERROR("This event should not have been fired");
});
scheduler.cancelEvent(i);
i = scheduler.schedule(50_ms, [&] { BOOST_ERROR("This event should not have been fired"); });
i.cancel();
advanceClocks(25_ms, 1000_ms);
BOOST_CHECK_EQUAL(count1, 1);
@@ -83,7 +79,7 @@ BOOST_AUTO_TEST_CASE(CallbackException)
class MyException : public std::exception
{
};
scheduler.scheduleEvent(10_ms, [] {
scheduler.schedule(10_ms, [] {
// use plain 'throw' to ensure that Scheduler does not depend on the
// internal machinery of NDN_THROW and that it can catch all exceptions
// regardless of how they are thrown by the application
@@ -91,7 +87,7 @@ BOOST_AUTO_TEST_CASE(CallbackException)
});
bool isCallbackInvoked = false;
scheduler.scheduleEvent(20_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
scheduler.schedule(20_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
BOOST_CHECK_THROW(this->advanceClocks(6_ms, 2), MyException);
this->advanceClocks(6_ms, 2);
@@ -101,7 +97,7 @@ BOOST_AUTO_TEST_CASE(CallbackException)
BOOST_AUTO_TEST_CASE(CancelEmptyEvent)
{
EventId i;
scheduler.cancelEvent(i);
i.cancel();
// avoid "test case [...] did not check any assertions" message from Boost.Test
BOOST_CHECK(true);
@@ -110,43 +106,33 @@ BOOST_AUTO_TEST_CASE(CancelEmptyEvent)
BOOST_AUTO_TEST_CASE(SelfCancel)
{
EventId selfEventId;
selfEventId = scheduler.scheduleEvent(100_ms, [&] {
scheduler.cancelEvent(selfEventId);
});
selfEventId = scheduler.schedule(100_ms, [&] { selfEventId.cancel(); });
BOOST_REQUIRE_NO_THROW(advanceClocks(100_ms, 10));
}
class SelfRescheduleFixture : public SchedulerFixture
{
public:
SelfRescheduleFixture()
: count(0)
{
}
void
reschedule()
{
EventId eventId = scheduler.scheduleEvent(100_ms,
bind(&SelfRescheduleFixture::reschedule, this));
scheduler.cancelEvent(selfEventId);
EventId eventId = scheduler.schedule(100_ms, bind(&SelfRescheduleFixture::reschedule, this));
selfEventId.cancel();
selfEventId = eventId;
if (count < 5)
count++;
else
scheduler.cancelEvent(selfEventId);
selfEventId.cancel();
}
void
reschedule2()
{
scheduler.cancelEvent(selfEventId);
selfEventId.cancel();
if (count < 5) {
selfEventId = scheduler.scheduleEvent(100_ms,
bind(&SelfRescheduleFixture::reschedule2, this));
selfEventId = scheduler.schedule(100_ms, bind(&SelfRescheduleFixture::reschedule2, this));
count++;
}
}
@@ -154,90 +140,70 @@ public:
void
reschedule3()
{
scheduler.cancelEvent(selfEventId);
selfEventId.cancel();
scheduler.scheduleEvent(100_ms, [&] { ++count; });
scheduler.scheduleEvent(100_ms, [&] { ++count; });
scheduler.scheduleEvent(100_ms, [&] { ++count; });
scheduler.scheduleEvent(100_ms, [&] { ++count; });
scheduler.scheduleEvent(100_ms, [&] { ++count; });
scheduler.scheduleEvent(100_ms, [&] { ++count; });
scheduler.schedule(100_ms, [&] { ++count; });
scheduler.schedule(100_ms, [&] { ++count; });
scheduler.schedule(100_ms, [&] { ++count; });
scheduler.schedule(100_ms, [&] { ++count; });
scheduler.schedule(100_ms, [&] { ++count; });
scheduler.schedule(100_ms, [&] { ++count; });
}
public:
EventId selfEventId;
size_t count;
size_t count = 0;
};
BOOST_FIXTURE_TEST_CASE(Reschedule, SelfRescheduleFixture)
{
selfEventId = scheduler.scheduleEvent(0_s,
bind(&SelfRescheduleFixture::reschedule, this));
selfEventId = scheduler.schedule(0_s, bind(&SelfRescheduleFixture::reschedule, this));
BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
BOOST_CHECK_EQUAL(count, 5);
}
BOOST_FIXTURE_TEST_CASE(Reschedule2, SelfRescheduleFixture)
{
selfEventId = scheduler.scheduleEvent(0_s,
bind(&SelfRescheduleFixture::reschedule2, this));
selfEventId = scheduler.schedule(0_s, bind(&SelfRescheduleFixture::reschedule2, this));
BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
BOOST_CHECK_EQUAL(count, 5);
}
BOOST_FIXTURE_TEST_CASE(Reschedule3, SelfRescheduleFixture)
{
selfEventId = scheduler.scheduleEvent(0_s,
bind(&SelfRescheduleFixture::reschedule3, this));
selfEventId = scheduler.schedule(0_s, bind(&SelfRescheduleFixture::reschedule3, this));
BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
BOOST_CHECK_EQUAL(count, 6);
}
class CancelAllFixture : public SchedulerFixture
{
public:
CancelAllFixture()
: count(0)
{
}
void
event()
{
++count;
scheduler.scheduleEvent(1_s, [&] { event(); });
scheduler.schedule(1_s, [&] { event(); });
}
public:
uint32_t count;
uint32_t count = 0;
};
BOOST_FIXTURE_TEST_CASE(CancelAll, CancelAllFixture)
{
scheduler.scheduleEvent(500_ms, [&] { scheduler.cancelAllEvents(); });
scheduler.scheduleEvent(1_s, [&] { event(); });
scheduler.scheduleEvent(3_s, [] {
BOOST_ERROR("This event should have been cancelled" );
});
scheduler.schedule(500_ms, [&] { scheduler.cancelAllEvents(); });
scheduler.schedule(1_s, [&] { event(); });
scheduler.schedule(3_s, [] { BOOST_ERROR("This event should have been cancelled" ); });
advanceClocks(100_ms, 100);
BOOST_CHECK_EQUAL(count, 0);
}
BOOST_AUTO_TEST_CASE(CancelAllWithScopedEventId) // Bug 3691
{
Scheduler sched(io);
ScopedEventId eid = sched.scheduleEvent(10_ms, []{});
ScopedEventId eid = sched.schedule(10_ms, []{});
sched.cancelAllEvents();
eid.cancel(); // should not crash
@@ -263,7 +229,7 @@ BOOST_AUTO_TEST_CASE(Compare)
BOOST_CHECK_EQUAL(eid == eid2, true);
BOOST_CHECK_EQUAL(eid != eid2, false);
eid = scheduler.scheduleEvent(10_ms, []{});
eid = scheduler.schedule(10_ms, []{});
BOOST_CHECK_EQUAL(eid == eid2, false);
BOOST_CHECK_EQUAL(eid != eid2, true);
@@ -271,7 +237,7 @@ BOOST_AUTO_TEST_CASE(Compare)
BOOST_CHECK_EQUAL(eid, eid2);
BOOST_CHECK_EQUAL(eid != eid2, false);
eid2 = scheduler.scheduleEvent(10_ms, []{});
eid2 = scheduler.schedule(10_ms, []{});
BOOST_CHECK_EQUAL(eid == eid2, false);
BOOST_CHECK_NE(eid, eid2);
}
@@ -282,12 +248,12 @@ BOOST_AUTO_TEST_CASE(Valid)
BOOST_CHECK_EQUAL(static_cast<bool>(eid), false);
BOOST_CHECK_EQUAL(!eid, true);
eid = scheduler.scheduleEvent(10_ms, []{});
eid = scheduler.schedule(10_ms, []{});
BOOST_CHECK_EQUAL(static_cast<bool>(eid), true);
BOOST_CHECK_EQUAL(!eid, false);
EventId eid2 = eid;
scheduler.cancelEvent(eid2);
eid2.cancel();
BOOST_CHECK(!eid);
BOOST_CHECK(!eid2);
}
@@ -295,17 +261,17 @@ BOOST_AUTO_TEST_CASE(Valid)
BOOST_AUTO_TEST_CASE(DuringCallback)
{
EventId eid;
EventId eid2 = scheduler.scheduleEvent(20_ms, []{});
EventId eid2 = scheduler.schedule(20_ms, []{});
bool isCallbackInvoked = false;
eid = scheduler.scheduleEvent(10_ms, [this, &eid, &eid2, &isCallbackInvoked] {
eid = scheduler.schedule(10_ms, [&eid, &eid2, &isCallbackInvoked] {
isCallbackInvoked = true;
// eid is "expired" during callback execution
BOOST_CHECK(!eid);
BOOST_CHECK_NE(eid, eid2);
scheduler.cancelEvent(eid2);
eid2.cancel();
BOOST_CHECK_EQUAL(eid, eid2);
});
@@ -316,7 +282,7 @@ BOOST_AUTO_TEST_CASE(DuringCallback)
BOOST_AUTO_TEST_CASE(Reset)
{
bool isCallbackInvoked = false;
EventId eid = scheduler.scheduleEvent(10_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
EventId eid = scheduler.schedule(10_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
eid.reset();
BOOST_CHECK(!eid);
@@ -331,7 +297,7 @@ BOOST_AUTO_TEST_CASE(ToString)
EventId eid;
BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(eid), nullString);
eid = scheduler.scheduleEvent(10_ms, []{});
eid = scheduler.schedule(10_ms, []{});
BOOST_TEST_MESSAGE("eid=" << eid);
BOOST_CHECK_NE(boost::lexical_cast<std::string>(eid), nullString);
}
@@ -346,7 +312,7 @@ BOOST_AUTO_TEST_CASE(Destruct)
{
int hit = 0;
{
ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
ScopedEventId se = scheduler.schedule(10_ms, [&] { ++hit; });
} // se goes out of scope
this->advanceClocks(1_ms, 15);
BOOST_CHECK_EQUAL(hit, 0);
@@ -355,8 +321,8 @@ BOOST_AUTO_TEST_CASE(Destruct)
BOOST_AUTO_TEST_CASE(Assign)
{
int hit1 = 0, hit2 = 0;
ScopedEventId se1 = scheduler.scheduleEvent(10_ms, [&] { ++hit1; });
se1 = scheduler.scheduleEvent(10_ms, [&] { ++hit2; });
ScopedEventId se1 = scheduler.schedule(10_ms, [&] { ++hit1; });
se1 = scheduler.schedule(10_ms, [&] { ++hit2; });
this->advanceClocks(1_ms, 15);
BOOST_CHECK_EQUAL(hit1, 0);
BOOST_CHECK_EQUAL(hit2, 1);
@@ -366,7 +332,7 @@ BOOST_AUTO_TEST_CASE(Release)
{
int hit = 0;
{
ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
ScopedEventId se = scheduler.schedule(10_ms, [&] { ++hit; });
se.release();
} // se goes out of scope
this->advanceClocks(1_ms, 15);
@@ -378,7 +344,7 @@ BOOST_AUTO_TEST_CASE(Move)
int hit = 0;
unique_ptr<ScopedEventId> se2;
{
ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
ScopedEventId se = scheduler.schedule(10_ms, [&] { ++hit; });
se2 = make_unique<ScopedEventId>(std::move(se)); // move constructor
} // se goes out of scope
this->advanceClocks(1_ms, 15);
@@ -386,7 +352,7 @@ BOOST_AUTO_TEST_CASE(Move)
ScopedEventId se3;
{
ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
ScopedEventId se = scheduler.schedule(10_ms, [&] { ++hit; });
se3 = std::move(se); // move assignment
} // se goes out of scope
this->advanceClocks(1_ms, 15);
+2 -2
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2013-2018 Regents of the University of California.
* Copyright (c) 2013-2019 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -120,7 +120,7 @@ BOOST_AUTO_TEST_CASE(Scheduler)
ndn::Scheduler scheduler(io);
bool hasFired = false;
scheduler.scheduleEvent(100_s, [&] { hasFired = true; });
scheduler.schedule(100_s, [&] { hasFired = true; });
io.poll();
BOOST_CHECK_EQUAL(hasFired, false);