servlib/conv_layers/NORMSessionManager.h
changeset 0 2b3e5ec03512
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servlib/conv_layers/NORMSessionManager.h	Thu Apr 21 14:57:45 2011 +0100
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2008 The MITRE Corporation
+ *
+ * Licensed 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.
+ *
+ * The US Government will not be charged any license fee and/or royalties
+ * related to this software. Neither name of The MITRE Corporation; nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ */
+
+/*
+ * This product includes software written and developed 
+ * by Brian Adamson and Joe Macker of the Naval Research 
+ * Laboratory (NRL).
+ */
+
+#ifndef _NORM_SESSION_MANAGER_H_
+#define _NORM_SESSION_MANAGER_H_
+
+#if defined(NORM_ENABLED)
+
+#include <list>
+
+#include <oasys/thread/Thread.h>
+#include <oasys/thread/MsgQueue.h>
+#include <oasys/util/Singleton.h>
+
+#include "NORMConvergenceLayer.h"
+#include "NORMReceiver.h"
+
+namespace dtn {
+
+/**
+ * Class (and thread) to manage interactions with Norm instance.
+ */
+class NORMSessionManager : public oasys::Thread,
+                           public oasys::Logger,
+                           public oasys::Singleton<NORMSessionManager> {
+public:
+    /**
+     * Destructor.
+     */
+    virtual ~NORMSessionManager();
+
+    /**
+     * Initialize Norm engine.
+     */
+    void init();
+
+    /**
+     * Register a Norm session with the manager.
+     */
+    void register_receiver(const NORMReceiver *receiver);
+
+    /**
+     * Unregister a Norm session.
+     */
+    //void remove_receiver(const NORMReceiverRef &receiver);
+    void remove_receiver(const NORMReceiver *receiver);
+
+    /**
+     * Norm instance handle accessor.
+     */
+    NormInstanceHandle norm_instance() {return norm_instance_;}
+
+protected:
+    /**
+     * Struct to store info on registered Norm sessions.
+     */
+    struct NORMNode {
+        NORMNode(NormSessionHandle session,
+                 oasys::MsgQueue<NormEvent> *queue)
+            : session_(session), queue_(queue) {}
+
+        bool operator==(const NormSessionHandle &session) const
+        {
+            return (session_ == session);
+        }
+
+        NormSessionHandle session_;
+        oasys::MsgQueue<NormEvent> *queue_;
+    };
+    typedef std::list<NORMNode> receiver_list_t;
+
+    /**
+     * Type for an iterator.
+     */
+    typedef receiver_list_t::iterator iterator;
+
+    iterator begin() {return receivers_.begin();}
+
+    iterator end() {return receivers_.end();}
+
+    /**
+     * Loop on NormGetNextEvent.
+     */
+    virtual void run();
+
+    /**
+     * Orderly shutdown of Norm instance.
+     */
+    void destroy_instance(bool stop_first = true);
+
+    NormInstanceHandle norm_instance_; ///< Norm istance handle
+    mutable oasys::SpinLock lock_;     ///< Lock to protect internal data structures.
+    receiver_list_t receivers_;        ///< registered Norm sessions
+
+private:
+    friend class oasys::Singleton<NORMSessionManager, true>;
+    NORMSessionManager();
+};
+
+} // namespace dtn
+#endif // NORM_ENABLED
+#endif // _NORM_SESSION_MANAGER_H_