summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/sys
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/qpid/sys')
-rw-r--r--cpp/src/qpid/sys/Serializer.cpp71
-rw-r--r--cpp/src/qpid/sys/Serializer.h181
2 files changed, 0 insertions, 252 deletions
diff --git a/cpp/src/qpid/sys/Serializer.cpp b/cpp/src/qpid/sys/Serializer.cpp
deleted file mode 100644
index 86f901aa78..0000000000
--- a/cpp/src/qpid/sys/Serializer.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/sys/Serializer.h"
-#include "qpid/log/Statement.h"
-
-#include <boost/bind.hpp>
-
-#include <assert.h>
-
-namespace qpid {
-namespace sys {
-
-SerializerBase::SerializerBase(bool allowImmediate)
- : state(IDLE), immediate(allowImmediate) {}
-
-void SerializerBase::shutdown() {
- {
- Mutex::ScopedLock l(lock);
- if (state == SHUTDOWN) return;
- state = SHUTDOWN;
- lock.notify();
- }
- if (worker.id() != 0)
- worker.join();
-}
-
-void SerializerBase::notifyWorker() {
- // Call with lock held.
- if (!worker.id())
- worker = Thread(*this);
- else
- lock.notify();
-}
-
-bool SerializerBase::running() {
- Mutex::ScopedLock l(lock);
- return state != SHUTDOWN;
-}
-
-void SerializerBase::wait() {
- Mutex::ScopedLock l(lock);
- if (state == IDLE) lock.wait();
-}
-
-void SerializerBase::run() {
- while (running()) {
- dispatch();
- wait();
- }
-}
-
-}} // namespace qpid::sys
diff --git a/cpp/src/qpid/sys/Serializer.h b/cpp/src/qpid/sys/Serializer.h
deleted file mode 100644
index fe4afc85cb..0000000000
--- a/cpp/src/qpid/sys/Serializer.h
+++ /dev/null
@@ -1,181 +0,0 @@
-#ifndef SERIALIZER_H
-#define SERIALIZER_H
-
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-#include "qpid/Exception.h"
-#include "qpid/sys/Runnable.h"
-#include "qpid/sys/Monitor.h"
-#include "qpid/sys/Thread.h"
-
-#include <boost/function.hpp>
-#include <boost/noncopyable.hpp>
-
-#include <deque>
-
-namespace qpid {
-namespace sys {
-
-/** Abstract base class for Serializer below. */
-class SerializerBase : private boost::noncopyable, private Runnable
-{
- public:
- typedef boost::function<void()> VoidFn0;
- struct ShutdownException : public Exception {};
-
- /** @see Serializer::Serializer */
- SerializerBase(bool immediate=true);
-
- virtual ~SerializerBase() { shutdown(); }
-
- virtual void dispatch() = 0;
- protected:
- enum State {
- IDLE, ///< No threads are active.
- EXECUTING, ///< execute() is executing a single task.
- DISPATCHING, ///< dispatch() is draining the queue.
- SHUTDOWN ///< SerailizerBase is being destroyed.
- };
-
- void shutdown();
- void notifyWorker();
- void run();
- virtual bool empty() = 0;
- bool running();
- void wait();
-
- Monitor lock;
- State state;
- bool immediate;
- Thread worker;
-};
-
-
-/**
- * Execute tasks sequentially, queuing tasks when necessary to
- * ensure only one thread at a time executes a task and tasks
- * are executed in order.
- *
- * Task is a void returning 0-arg functor. It must not throw exceptions.
- *
- * Note we deliberately do not use boost::function as the task type
- * because copying a boost::functor allocates the target object on the
- * heap.
- */
-template <class Task>
-class Serializer : public SerializerBase {
-
- std::deque<Task> queue;
-
- bool empty() { return queue.empty(); }
- void dispatch(Task& task);
-
- public:
- /** Start a serializer.
- *
- * @param immediate Allow execute() to execute a task immediatly
- * in the current thread.
- */
- Serializer(bool immediate=true)
- : SerializerBase(immediate) {}
-
- ~Serializer() { shutdown(); }
- /**
- * Task may be executed immediately in the calling thread if there
- * are no other tasks pending or executing and the "immediate"
- * paramater to the constructor was true. Otherwise task will be
- * enqueued for execution by a dispatch thread.
- */
- void execute(Task& task);
-
-
- /** Execute pending tasks sequentially in calling thread.
- * Drains the task queue and returns, does not block for more tasks.
- *
- * @exception ShutdownException if the serializer is being destroyed.
- */
- void dispatch();
- };
-
-
-template <class Task>
-void Serializer<Task>::execute(Task& task) {
- 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;
- notifyWorker();
- }
-}
-
-template <class Task>
-void Serializer<Task>::dispatch() {
- Mutex::ScopedLock l(lock);
- // TODO aconway 2007-07-16: This loop could be unbounded
- // if other threads add work while we're in dispatch(Task&).
- // If we need to bound it we could dispatch just the elements
- // that were enqueued when dispatch() was first called - save
- // begin() iterator and pop only up to that.
- while (!queue.empty() && state != SHUTDOWN) {
- assert(state == DISPATCHING);
- dispatch(queue.front());
- queue.pop_front();
- }
- if (state != SHUTDOWN) {
- assert(state == DISPATCHING);
- state = IDLE;
- }
-}
-
-template <class Task>
-void Serializer<Task>::dispatch(Task& task) {
- // Preconditions: lock is held, state is EXECUTING or DISPATCHING
- assert(state != IDLE);
- assert(state != SHUTDOWN);
- assert(state == EXECUTING || state == DISPATCHING);
- Mutex::ScopedUnlock u(lock);
- // No exceptions allowed in task.
- notifyWorker();
- try { task(); } catch (...) { assert(0); }
-}
-
-
-
-
-}} // namespace qpid::sys
-
-
-
-
-
-#endif /*!SERIALIZER_H*/