Stoppable, make stop() require call to start()

This commit is contained in:
Vinnie Falco
2013-11-01 13:31:38 -07:00
parent ef94f42b62
commit 00575cf847
2 changed files with 7 additions and 2 deletions

View File

@@ -265,6 +265,7 @@ protected:
char const* m_name;
RootStoppable& m_root;
Child m_child;
Atomic <int> m_started;
bool volatile m_stopped;
bool volatile m_childrenStopped;
Children m_children;
@@ -301,6 +302,8 @@ public:
/** Notify a root stoppable and children to stop, and block until stopped.
Has no effect if the stoppable was already notified.
This blocks until the stoppable and all of its children have stopped.
Undefined behavior results if stop() is called without a previous call
to start().
Thread safety:
Safe to call from any thread not associated with a Stoppable.
*/
@@ -316,7 +319,6 @@ public:
private:
Atomic <int> m_prepared;
Atomic <int> m_started;
Atomic <int> m_calledStop;
Atomic <int> m_calledStopAsync;
};

View File

@@ -46,7 +46,7 @@ Stoppable::Stoppable (char const* name, Stoppable& parent)
Stoppable::~Stoppable ()
{
// Children must be stopped.
bassert (m_childrenStopped);
bassert (m_started.get() == 0 || m_childrenStopped);
}
bool Stoppable::isStopping() const
@@ -177,6 +177,9 @@ void RootStoppable::start ()
void RootStoppable::stop (Journal journal)
{
// Must have a prior call to start()
bassert (m_started.get() != 0);
if (! m_calledStop.compareAndSetBool (1, 0))
{
journal.warning << "Stoppable::stop called again";