From 0b19752d58ea90089468c9674bfe61ce71b9ccfb Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Tue, 13 Nov 2007 13:53:01 +0000 Subject: Moved Serializer notifyWorker inside the mutex. Removed user-definable notify function, we want to get rid of Serializer, not reuse it. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@594537 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/sys/Serializer.h | 45 ++++++++++++++++--------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) (limited to 'cpp/src/qpid/sys/Serializer.h') diff --git a/cpp/src/qpid/sys/Serializer.h b/cpp/src/qpid/sys/Serializer.h index 9d4f13eb9b..d0d34c26eb 100644 --- a/cpp/src/qpid/sys/Serializer.h +++ b/cpp/src/qpid/sys/Serializer.h @@ -44,7 +44,7 @@ class SerializerBase : private boost::noncopyable, private Runnable struct ShutdownException : public Exception {}; /** @see Serializer::Serializer */ - SerializerBase(bool immediate=true, VoidFn0 notifyDispatch=VoidFn0()); + SerializerBase(bool immediate=true); virtual ~SerializerBase() { shutdown(); } @@ -66,7 +66,6 @@ class SerializerBase : private boost::noncopyable, private Runnable State state; bool immediate; Thread worker; - boost::function notifyDispatch; }; @@ -91,17 +90,12 @@ class Serializer : public SerializerBase { public: /** Start a serializer. - * - * @param notifyDispatch Called when work is pending and there is no - * active dispatch thread. Must arrange for dispatch() to be called - * in some thread other than the calling thread and return. - * By default the Serailizer supplies its own dispatch thread. * * @param immediate Allow execute() to execute a task immediatly * in the current thread. */ - Serializer(bool immediate=true, VoidFn0 notifyDispatch=VoidFn0()) - : SerializerBase(immediate, notifyDispatch) {} + Serializer(bool immediate=true) + : SerializerBase(immediate) {} ~Serializer() { shutdown(); } /** @@ -124,27 +118,22 @@ class Serializer : public SerializerBase { template void Serializer::execute(Task& task) { - bool needNotify = false; - { - Mutex::ScopedLock l(lock); - assert(state != SHUTDOWN); - if (immediate && state == IDLE) { - state = EXECUTING; - dispatch(task); - if (state != SHUTDOWN) { - assert(state == EXECUTING); - state = IDLE; - } - } - else - queue.push_back(task); - if (!queue.empty() && state == IDLE) { - state = DISPATCHING; - needNotify = true; + Mutex::ScopedLock l(lock); + assert(state != SHUTDOWN); + if (immediate && state == IDLE) { + state = EXECUTING; + dispatch(task); + if (state != SHUTDOWN) { + assert(state == EXECUTING); + state = IDLE; } } - if (needNotify) - notifyDispatch(); // Not my function, call outside lock. + else + queue.push_back(task); + if (!queue.empty() && state == IDLE) { + state = DISPATCHING; + notifyWorker(); + } } template -- cgit v1.2.1