xref: /freebsd-src/contrib/opencsd/decoder/include/common/ocsd_lib_dcd_register.h (revision c120c5646da1a1d2c4d90fd069a7e2a8d559eb46)
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