diff --git a/Foundation/include/Poco/Activity.h b/Foundation/include/Poco/Activity.h index 9f50816250..9da1d8a8d4 100644 --- a/Foundation/include/Poco/Activity.h +++ b/Foundation/include/Poco/Activity.h @@ -180,9 +180,11 @@ class Activity: public Runnable } catch (...) { + _running = false; _done.set(); throw; } + _running = false; _done.set(); } diff --git a/Foundation/testsuite/src/ActivityTest.cpp b/Foundation/testsuite/src/ActivityTest.cpp index 11607f3e15..bd87893f8f 100644 --- a/Foundation/testsuite/src/ActivityTest.cpp +++ b/Foundation/testsuite/src/ActivityTest.cpp @@ -55,6 +55,44 @@ namespace Activity _activity; Poco::UInt64 _count; }; + + class BriefActiveObject + { + public: + BriefActiveObject(): + _activity(this, &BriefActiveObject::run), + _count(0) + { + } + + ~BriefActiveObject() + { + } + + Activity& activity() + { + return _activity; + } + + Poco::UInt64 count() const + { + return _count; + } + protected: + void run() + { + while (!_activity.isStopped()) + { + ++_count; + if(_count > 2) + break; + + } + } + private: + Activity _activity; + Poco::UInt64 _count; + }; } @@ -81,6 +119,17 @@ void ActivityTest::testActivity() assertTrue (activeObj.count() > 0); } +void ActivityTest::testActivityFinishes() +{ + BriefActiveObject briefActiveObj; + assertTrue (briefActiveObj.activity().isStopped()); + briefActiveObj.activity().start(); + assertTrue (!briefActiveObj.activity().isStopped()); + Thread::sleep(100); + assertTrue (!briefActiveObj.activity().isRunning()); + assertTrue (briefActiveObj.count() == 3); +} + void ActivityTest::setUp() { @@ -97,6 +146,7 @@ CppUnit::Test* ActivityTest::suite() CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("ActivityTest"); CppUnit_addTest(pSuite, ActivityTest, testActivity); + CppUnit_addTest(pSuite, ActivityTest, testActivityFinishes); return pSuite; } diff --git a/Foundation/testsuite/src/ActivityTest.h b/Foundation/testsuite/src/ActivityTest.h index da8bbdb572..7f0779a44d 100644 --- a/Foundation/testsuite/src/ActivityTest.h +++ b/Foundation/testsuite/src/ActivityTest.h @@ -25,6 +25,7 @@ class ActivityTest: public CppUnit::TestCase ~ActivityTest(); void testActivity(); + void testActivityFinishes(); void setUp(); void tearDown();