diff -r 000000000000 -r 2b3e5ec03512 servlib/conv_layers/NORMSessionManager.h --- /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 + +#include +#include +#include + +#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 { +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 *queue) + : session_(session), queue_(queue) {} + + bool operator==(const NormSessionHandle &session) const + { + return (session_ == session); + } + + NormSessionHandle session_; + oasys::MsgQueue *queue_; + }; + typedef std::list 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(); +}; + +} // namespace dtn +#endif // NORM_ENABLED +#endif // _NORM_SESSION_MANAGER_H_