summaryrefslogtreecommitdiff
path: root/ACE/tests/Bug_2820_Regression_Test.cpp
diff options
context:
space:
mode:
authorcoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2007-02-20 03:10:41 +0000
committercoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2007-02-20 03:10:41 +0000
commit5b8de769a715226654dc2f51cd48400bcd55a6bb (patch)
tree50b705744a3e238241d34d3c83e08d02c78be4f6 /ACE/tests/Bug_2820_Regression_Test.cpp
parentf92985f1ec20b251eeea62aca6eab6b7d9167469 (diff)
downloadATCD-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.cpp125
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;
+}