[svn] commit: r3715 - in /branches/trac408/src/lib/nsas: tests/zone_entry_unittest.cc zone_entry.cc zone_entry.h
BIND 10 source code commits
bind10-changes at lists.isc.org
Fri Dec 3 21:33:30 UTC 2010
Author: vorner
Date: Fri Dec 3 21:33:30 2010
New Revision: 3715
Log:
Don't forget to report failures
Modified:
branches/trac408/src/lib/nsas/tests/zone_entry_unittest.cc
branches/trac408/src/lib/nsas/zone_entry.cc
branches/trac408/src/lib/nsas/zone_entry.h
Modified: branches/trac408/src/lib/nsas/tests/zone_entry_unittest.cc
==============================================================================
--- branches/trac408/src/lib/nsas/tests/zone_entry_unittest.cc (original)
+++ branches/trac408/src/lib/nsas/tests/zone_entry_unittest.cc Fri Dec 3 21:33:30 2010
@@ -197,9 +197,9 @@
EXPECT_EQ(0, callback_->successes_.size());
EXPECT_EQ(1, callback_->unreachable_count_);
// Answer the A one and see it answers what can be answered
- ASSERT_EQ(2, callback_->successes_.size());
EXPECT_NO_THROW(resolver_->answer(1, ns_name_, RRType::A(),
rdata::in::A("192.0.2.1")));
+ ASSERT_EQ(2, callback_->successes_.size());
EXPECT_TRUE(IOAddress("192.0.2.1").equal(callback_->successes_[0]));
EXPECT_TRUE(IOAddress("192.0.2.1").equal(callback_->successes_[1]));
EXPECT_EQ(1, callback_->unreachable_count_);
Modified: branches/trac408/src/lib/nsas/zone_entry.cc
==============================================================================
--- branches/trac408/src/lib/nsas/zone_entry.cc (original)
+++ branches/trac408/src/lib/nsas/zone_entry.cc Fri Dec 3 21:33:30 2010
@@ -251,6 +251,24 @@
};
void
+ZoneEntry::dispatchFailures(AddressFamily family, shared_ptr<Lock> lock) {
+ // We extract all the callbacks
+ vector<CallbackPtr> callbacks;
+ if (family == ADDR_REQ_MAX) {
+ move(callbacks_[ANY_OK], callbacks_[V4_ONLY]);
+ move(callbacks_[ANY_OK], callbacks_[V6_ONLY]);
+ family = ANY_OK;
+ }
+ callbacks.swap(callbacks_[family]);
+ // We want to call them not locked, so we both do not block the
+ // lock and allow them to call our functions
+ lock->unlock();
+ BOOST_FOREACH(const CallbackPtr& callback, callbacks) {
+ callback->unreachable();
+ }
+}
+
+void
ZoneEntry::process(CallbackPtr callback, AddressFamily family,
shared_ptr<NameserverEntry> nameserver, shared_ptr<ZoneEntry> self,
shared_ptr<Lock> lock)
@@ -272,20 +290,7 @@
case EXPIRED:
return;
case UNREACHABLE: {
- // We extract all the callbacks
- vector<CallbackPtr> callbacks;
- if (family == ADDR_REQ_MAX) {
- move(callbacks_[ANY_OK], callbacks_[V4_ONLY]);
- move(callbacks_[ANY_OK], callbacks_[V6_ONLY]);
- family = ANY_OK;
- }
- callbacks.swap(callbacks_[family]);
- // We want to call them not locked, so we both do not block the
- // lock and allow them to call our functions
- lock->unlock();
- BOOST_FOREACH(const CallbackPtr& callback, callbacks) {
- callback->unreachable();
- }
+ dispatchFailures(family, lock);
// And we do nothing more now
return;
}
@@ -381,12 +386,21 @@
} else if (!addresses.empty()) {
// Extract the callbacks
vector<CallbackPtr> to_execute;
+ // FIXME: Think of a solution where we do not lose
+ // any callbacks upon exception
to_execute.swap(callbacks_[family]);
// Unlock, the callbacks might want to call us
+ lock->unlock();
+
+ // Run the callbacks
BOOST_FOREACH(const CallbackPtr& callback, to_execute) {
callback->success(chooseAddress(addresses));
}
+ return;
+ } else if (!pending) {
+ dispatchFailures(family, lock);
+ return;
}
}
return;
Modified: branches/trac408/src/lib/nsas/zone_entry.h
==============================================================================
--- branches/trac408/src/lib/nsas/zone_entry.h (original)
+++ branches/trac408/src/lib/nsas/zone_entry.h Fri Dec 3 21:33:30 2010
@@ -125,7 +125,7 @@
// If the familly is ADDR_REQ_MAX, then it means process all callbacks.
// However, you must not provide callback.
// If lock is provided, it is locked mutex_ and will be used. If not,
- // will use its own.
+ // will use its own. It might unlock the lock.
void process(boost::shared_ptr<AddressRequestCallback> callback,
AddressFamily family, boost::shared_ptr<NameserverEntry> nameserver,
boost::shared_ptr<ZoneEntry> self,
@@ -149,6 +149,11 @@
// Callback from nameserver entry
class NameserverCallback;
// And it can get into our internals as well (call process)
+ friend class NameserverCallback;
+ // This dispatches callbacks of given family with failures (and unlocks)
+ // The lock is mandatory
+ void dispatchFailures(AddressFamily family,
+ boost::shared_ptr<boost::mutex::scoped_lock> lock);
};
} // namespace nsas
More information about the bind10-changes
mailing list