diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2007-02-20 03:10:41 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2007-02-20 03:10:41 +0000 |
commit | 5b8de769a715226654dc2f51cd48400bcd55a6bb (patch) | |
tree | 50b705744a3e238241d34d3c83e08d02c78be4f6 /ACE/tests/Bug_2820_Regression_Test.cpp | |
parent | f92985f1ec20b251eeea62aca6eab6b7d9167469 (diff) | |
download | ATCD-5b8de769a715226654dc2f51cd48400bcd55a6bb.tar.gz |
Tue Feb 20 03:08:26 UTC 2007 Carlos O'Ryan <coryan@atdesk.com>
Diffstat (limited to 'ACE/tests/Bug_2820_Regression_Test.cpp')
-rw-r--r-- | ACE/tests/Bug_2820_Regression_Test.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/ACE/tests/Bug_2820_Regression_Test.cpp b/ACE/tests/Bug_2820_Regression_Test.cpp new file mode 100644 index 00000000000..ff780b6e093 --- /dev/null +++ b/ACE/tests/Bug_2820_Regression_Test.cpp @@ -0,0 +1,125 @@ +/** + * @file Bug_2820_Regression_Test.cpp + * + * $Id$ + * + * Verify that the event handler reference counting works correctly + * when the reactor is destroyed. + * + * Pushing a notification through the reactor increments the reference + * count on the target event handler. Both dispatching and purging + * the notification decrement the reference count. However, + * destroying the reactor used to not decrement the reference count. + * This test reproduces the problem and serves as a regression for it. + * + * @author Carlos O'Ryan <coryan@atdesk.com> + * + */ + +#include "test_config.h" +#include "ace/Reactor.h" +#include "ace/Select_Reactor.h" + +ACE_RCSID(tests, + Bug_2820_Regression_Test, "$Id$") + +/** + * @class Simple_Handler + * + * @brief A simple event handler for the test + * + */ +class Simple_Handler : public ACE_Event_Handler +{ +public: + /// Constructor + Simple_Handler(ACE_Reactor * reactor); + + /// Receive (and ignore) the notifications + virtual int handle_exception(ACE_HANDLE); +}; + +int +run_main (int, ACE_TCHAR *[]) +{ + ACE_START_TEST (ACE_TEXT ("Bug_2820_Regression_Test")); + + int result = 0; + + std::auto_ptr<ACE_Reactor> reactor( + new ACE_Reactor(new ACE_Select_Reactor, 1)); + + ACE_Event_Handler_var v( + new Simple_Handler(reactor.get())); + + ACE_Event_Handler::Reference_Count pre_notify_count = + v->add_reference(); + + int const notify_count = 4; + for(int i = 0; i != notify_count; ++i) + { + reactor->notify(v.handler()); + } + + ACE_Event_Handler::Reference_Count pos_notify_count = + v->add_reference(); + + if(pos_notify_count != pre_notify_count + notify_count + 1) + { + result = -1; + ACE_ERROR((LM_ERROR, + ACE_TEXT("Reference count should increase by %d.") + ACE_TEXT(" Initial count=%d, final count = %d\n"), + notify_count, pre_notify_count, pos_notify_count)); + } + + reactor.release(); + + ACE_Event_Handler::Reference_Count pos_release_count = + v->add_reference(); + + // Only our explicit calls to add_reference() should be reflected in + // the refence_count... + if (pos_release_count != pre_notify_count + 2) + { + result = -1; + ACE_ERROR((LM_ERROR, + ACE_TEXT("Reference count should have increased by 2.") + ACE_TEXT(" Initial count=%d, final count = %d\n"), + pre_notify_count, pos_release_count)); + } + + // Remove a reference for each time we explicitly increased it. + v->remove_reference(); + v->remove_reference(); + v->remove_reference(); + + if (result == 0) + { + ACE_DEBUG ((LM_INFO, + ACE_TEXT("Test passed. pre_notify refcount=%d,") + ACE_TEXT(" pos_notify=%d, pos_delete=%d\n"), + pre_notify_count, pos_notify_count, pos_release_count)); + } + + ACE_END_TEST; + + return result; +} + +// ============================================ + +Simple_Handler:: +Simple_Handler( + ACE_Reactor * r) + : ACE_Event_Handler(r) +{ + reference_counting_policy().value( + ACE_Event_Handler::Reference_Counting_Policy::ENABLED); +} + +int Simple_Handler:: +handle_exception(ACE_HANDLE) +{ + return 0; +} |