1*c120c564SAndrew Turner /*
2*c120c564SAndrew Turner * \file ocsd_lib_dcd_register.h
3*c120c564SAndrew Turner * \brief OpenCSD : Library decoder registration and management.
4*c120c564SAndrew Turner *
5*c120c564SAndrew Turner * \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
6*c120c564SAndrew Turner */
7*c120c564SAndrew Turner
8*c120c564SAndrew Turner #ifndef ARM_OCSD_LIB_DCD_REGISTER_H_INCLUDED
9*c120c564SAndrew Turner #define ARM_OCSD_LIB_DCD_REGISTER_H_INCLUDED
10*c120c564SAndrew Turner
11*c120c564SAndrew Turner
12*c120c564SAndrew Turner /*
13*c120c564SAndrew Turner * Redistribution and use in source and binary forms, with or without modification,
14*c120c564SAndrew Turner * are permitted provided that the following conditions are met:
15*c120c564SAndrew Turner *
16*c120c564SAndrew Turner * 1. Redistributions of source code must retain the above copyright notice,
17*c120c564SAndrew Turner * this list of conditions and the following disclaimer.
18*c120c564SAndrew Turner *
19*c120c564SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright notice,
20*c120c564SAndrew Turner * this list of conditions and the following disclaimer in the documentation
21*c120c564SAndrew Turner * and/or other materials provided with the distribution.
22*c120c564SAndrew Turner *
23*c120c564SAndrew Turner * 3. Neither the name of the copyright holder nor the names of its contributors
24*c120c564SAndrew Turner * may be used to endorse or promote products derived from this software without
25*c120c564SAndrew Turner * specific prior written permission.
26*c120c564SAndrew Turner *
27*c120c564SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
28*c120c564SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
29*c120c564SAndrew Turner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
30*c120c564SAndrew Turner * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
31*c120c564SAndrew Turner * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
32*c120c564SAndrew Turner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
33*c120c564SAndrew Turner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
34*c120c564SAndrew Turner * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35*c120c564SAndrew Turner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36*c120c564SAndrew Turner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37*c120c564SAndrew Turner */
38*c120c564SAndrew Turner
39*c120c564SAndrew Turner #include <map>
40*c120c564SAndrew Turner
41*c120c564SAndrew Turner #include "opencsd/ocsd_if_types.h"
42*c120c564SAndrew Turner #include "common/ocsd_dcd_mngr_i.h"
43*c120c564SAndrew Turner
44*c120c564SAndrew Turner /*!
45*c120c564SAndrew Turner * @class OcsdLibDcdRegister : Registers decoders with the library
46*c120c564SAndrew Turner *
47*c120c564SAndrew Turner * library decoder register class allows decoders to be registered by name, and the register allows clients to access
48*c120c564SAndrew Turner * the list of names of registerd decoders.
49*c120c564SAndrew Turner *
50*c120c564SAndrew Turner * The decoders in the library are accessed through the decoder manager interface. This provides a set of functions to allow
51*c120c564SAndrew Turner * the creation, manipulation and destruction of registered decoders
52*c120c564SAndrew Turner *
53*c120c564SAndrew Turner */
54*c120c564SAndrew Turner class OcsdLibDcdRegister
55*c120c564SAndrew Turner {
56*c120c564SAndrew Turner public:
57*c120c564SAndrew Turner static OcsdLibDcdRegister *getDecoderRegister();
58*c120c564SAndrew Turner
59*c120c564SAndrew Turner static void deregisterAllDecoders(); //!< library cleanup - deregisters decoder managers and destroys the register object.
60*c120c564SAndrew Turner static const ocsd_trace_protocol_t getNextCustomProtocolID();
61*c120c564SAndrew Turner static void releaseLastCustomProtocolID();
62*c120c564SAndrew Turner
63*c120c564SAndrew Turner const ocsd_err_t registerDecoderTypeByName(const std::string &name, IDecoderMngr *p_decoder_fact); //!< register a decoder manager interface
64*c120c564SAndrew Turner const ocsd_err_t getDecoderMngrByName(const std::string &name, IDecoderMngr **p_decoder_mngr);
65*c120c564SAndrew Turner const ocsd_err_t getDecoderMngrByType(const ocsd_trace_protocol_t decoderType, IDecoderMngr **p_decoder_mngr);
66*c120c564SAndrew Turner
67*c120c564SAndrew Turner const bool isRegisteredDecoder(const std::string &name);
68*c120c564SAndrew Turner const bool getFirstNamedDecoder(std::string &name);
69*c120c564SAndrew Turner const bool getNextNamedDecoder(std::string &name);
70*c120c564SAndrew Turner
71*c120c564SAndrew Turner const bool isRegisteredDecoderType(const ocsd_trace_protocol_t decoderType);
72*c120c564SAndrew Turner
73*c120c564SAndrew Turner private:
74*c120c564SAndrew Turner void registerBuiltInDecoders(); //!< register the list of build in decoder managers on first access of getDecoderMngrByName.
75*c120c564SAndrew Turner void deRegisterCustomDecoders(); //!< delete all custom decoders registered with the library.
76*c120c564SAndrew Turner
77*c120c564SAndrew Turner std::map<const std::string, IDecoderMngr *> m_decoder_mngrs; //!< map linking names to decoder manager interfaces.
78*c120c564SAndrew Turner std::map<const std::string, IDecoderMngr *>::const_iterator m_iter; //!< iterator for name search.
79*c120c564SAndrew Turner
80*c120c564SAndrew Turner std::map<const ocsd_trace_protocol_t, IDecoderMngr *> m_typed_decoder_mngrs; //!< map linking decoder managers to protocol type ID
81*c120c564SAndrew Turner
82*c120c564SAndrew Turner // cache last found by type to speed up repeated quries on same object.
83*c120c564SAndrew Turner IDecoderMngr *m_pLastTypedDecoderMngr; //!< last manager we found by type
84*c120c564SAndrew Turner
85*c120c564SAndrew Turner
86*c120c564SAndrew Turner
87*c120c564SAndrew Turner // singleton pattern - need just one of these in the library - ensure all default constructors are private.
88*c120c564SAndrew Turner OcsdLibDcdRegister();
OcsdLibDcdRegister(OcsdLibDcdRegister const &)89*c120c564SAndrew Turner OcsdLibDcdRegister(OcsdLibDcdRegister const &) {};
90*c120c564SAndrew Turner OcsdLibDcdRegister& operator=(OcsdLibDcdRegister const &){ return *this; };
91*c120c564SAndrew Turner ~OcsdLibDcdRegister();
92*c120c564SAndrew Turner
93*c120c564SAndrew Turner static OcsdLibDcdRegister *m_p_libMngr;
94*c120c564SAndrew Turner static bool m_b_registeredBuiltins;
95*c120c564SAndrew Turner static ocsd_trace_protocol_t m_nextCustomProtocolID;
96*c120c564SAndrew Turner };
97*c120c564SAndrew Turner
98*c120c564SAndrew Turner /*!
99*c120c564SAndrew Turner * Typedef of function signature to create a decoder manager.
100*c120c564SAndrew Turner *
101*c120c564SAndrew Turner * @param *name : Registered name of the decoder.
102*c120c564SAndrew Turner */
103*c120c564SAndrew Turner typedef IDecoderMngr *(*CreateMngr)(const std::string &name);
104*c120c564SAndrew Turner
105*c120c564SAndrew Turner /*!
106*c120c564SAndrew Turner * Template function to create a specific decoder manager class object.
107*c120c564SAndrew Turner *
108*c120c564SAndrew Turner * @param &name : Registered name of the decoder.
109*c120c564SAndrew Turner *
110*c120c564SAndrew Turner * @return IDecoderMngr * : pointer to the decoder manager base class interface.
111*c120c564SAndrew Turner */
createManagerInst(const std::string & name)112*c120c564SAndrew Turner template <typename T> IDecoderMngr *createManagerInst(const std::string &name)
113*c120c564SAndrew Turner {
114*c120c564SAndrew Turner return new (std::nothrow)T(name);
115*c120c564SAndrew Turner }
116*c120c564SAndrew Turner
117*c120c564SAndrew Turner /*! Structure to contain the information needed to create and register a builtin decoder
118*c120c564SAndrew Turner * manager with the library
119*c120c564SAndrew Turner */
120*c120c564SAndrew Turner typedef struct built_in_decoder_info {
121*c120c564SAndrew Turner IDecoderMngr *pMngr; //!< pointer to created decoder manager
122*c120c564SAndrew Turner CreateMngr PFn; //!< function to create the decoder manager.
123*c120c564SAndrew Turner const char *name; //!< registered name of the decoder.
124*c120c564SAndrew Turner } built_in_decoder_info_t;
125*c120c564SAndrew Turner
126*c120c564SAndrew Turner //! Define to use to fill in an array of built_in_decoder_info_t structures.
127*c120c564SAndrew Turner #define CREATE_BUILTIN_ENTRY(C,N) { 0, createManagerInst<C>, N }
128*c120c564SAndrew Turner
129*c120c564SAndrew Turner #endif // ARM_OCSD_LIB_DCD_REGISTER_H_INCLUDED
130*c120c564SAndrew Turner
131*c120c564SAndrew Turner /* End of File ocsd_lib_dcd_register.h */
132