xref: /freebsd-src/contrib/opencsd/decoder/source/ocsd_gen_elem_stack.cpp (revision 46e6e290975f19ea62d03f90ac3e523af4dae557)
1b6aadd18SAndrew Turner /*
2b6aadd18SAndrew Turner * \file       ocsd_gen_elem_stack.cpp
3b6aadd18SAndrew Turner * \brief      OpenCSD : List of Generic trace elements for output.
4b6aadd18SAndrew Turner *
5b6aadd18SAndrew Turner * \copyright  Copyright (c) 2020, ARM Limited. All Rights Reserved.
6b6aadd18SAndrew Turner */
7b6aadd18SAndrew Turner 
8b6aadd18SAndrew Turner 
9b6aadd18SAndrew Turner /*
10b6aadd18SAndrew Turner * Redistribution and use in source and binary forms, with or without modification,
11b6aadd18SAndrew Turner * are permitted provided that the following conditions are met:
12b6aadd18SAndrew Turner *
13b6aadd18SAndrew Turner * 1. Redistributions of source code must retain the above copyright notice,
14b6aadd18SAndrew Turner * this list of conditions and the following disclaimer.
15b6aadd18SAndrew Turner *
16b6aadd18SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright notice,
17b6aadd18SAndrew Turner * this list of conditions and the following disclaimer in the documentation
18b6aadd18SAndrew Turner * and/or other materials provided with the distribution.
19b6aadd18SAndrew Turner *
20b6aadd18SAndrew Turner * 3. Neither the name of the copyright holder nor the names of its contributors
21b6aadd18SAndrew Turner * may be used to endorse or promote products derived from this software without
22b6aadd18SAndrew Turner * specific prior written permission.
23b6aadd18SAndrew Turner *
24b6aadd18SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
25b6aadd18SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26b6aadd18SAndrew Turner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27b6aadd18SAndrew Turner * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28b6aadd18SAndrew Turner * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29b6aadd18SAndrew Turner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30b6aadd18SAndrew Turner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31b6aadd18SAndrew Turner * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32b6aadd18SAndrew Turner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33b6aadd18SAndrew Turner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34b6aadd18SAndrew Turner */
35b6aadd18SAndrew Turner 
36b6aadd18SAndrew Turner #include "common/ocsd_gen_elem_stack.h"
37b6aadd18SAndrew Turner 
OcsdGenElemStack()38b6aadd18SAndrew Turner OcsdGenElemStack::OcsdGenElemStack() :
39b6aadd18SAndrew Turner     m_pElemArray(0),
40b6aadd18SAndrew Turner     m_elemArraySize(0),
41b6aadd18SAndrew Turner     m_elem_to_send(0),
42b6aadd18SAndrew Turner     m_curr_elem_idx(0),
43b6aadd18SAndrew Turner     m_send_elem_idx(0),
44b6aadd18SAndrew Turner     m_CSID(0),
45*46e6e290SRuslan Bukin     m_sendIf(NULL),
46b6aadd18SAndrew Turner     m_is_init(false)
47b6aadd18SAndrew Turner {
48b6aadd18SAndrew Turner 
49b6aadd18SAndrew Turner }
50b6aadd18SAndrew Turner 
~OcsdGenElemStack()51b6aadd18SAndrew Turner OcsdGenElemStack::~OcsdGenElemStack()
52b6aadd18SAndrew Turner {
53b6aadd18SAndrew Turner     for (int i = 0; i<m_elemArraySize; i++)
54b6aadd18SAndrew Turner     {
55b6aadd18SAndrew Turner         delete m_pElemArray[i].pElem;
56b6aadd18SAndrew Turner     }
57b6aadd18SAndrew Turner     delete [] m_pElemArray;
58b6aadd18SAndrew Turner     m_pElemArray = 0;
59b6aadd18SAndrew Turner }
60b6aadd18SAndrew Turner 
addElem(const ocsd_trc_index_t trc_pkt_idx)61b6aadd18SAndrew Turner ocsd_err_t OcsdGenElemStack::addElem(const ocsd_trc_index_t trc_pkt_idx)
62b6aadd18SAndrew Turner {
63b6aadd18SAndrew Turner     ocsd_err_t err = OCSD_OK;
64b6aadd18SAndrew Turner 
65b6aadd18SAndrew Turner     if (((m_curr_elem_idx + 1) == m_elemArraySize) || !m_pElemArray)
66b6aadd18SAndrew Turner     {
67b6aadd18SAndrew Turner         err = growArray();
68b6aadd18SAndrew Turner         if (err)
69b6aadd18SAndrew Turner             return err;
70b6aadd18SAndrew Turner     }
71b6aadd18SAndrew Turner 
72b6aadd18SAndrew Turner     // if there is a least one element then copy and increment
73b6aadd18SAndrew Turner     // otherwise we are at base of stack.
74b6aadd18SAndrew Turner     if (m_elem_to_send)
75b6aadd18SAndrew Turner     {
76b6aadd18SAndrew Turner         copyPersistentData(m_curr_elem_idx, m_curr_elem_idx + 1);
77b6aadd18SAndrew Turner         m_curr_elem_idx++;
78b6aadd18SAndrew Turner     }
79b6aadd18SAndrew Turner     m_pElemArray[m_curr_elem_idx].trc_pkt_idx = trc_pkt_idx;
80b6aadd18SAndrew Turner     m_elem_to_send++;
81b6aadd18SAndrew Turner     return err;
82b6aadd18SAndrew Turner }
83b6aadd18SAndrew Turner 
addElemType(const ocsd_trc_index_t trc_pkt_idx,ocsd_gen_trc_elem_t elem_type)84b6aadd18SAndrew Turner ocsd_err_t OcsdGenElemStack::addElemType(const ocsd_trc_index_t trc_pkt_idx, ocsd_gen_trc_elem_t elem_type)
85b6aadd18SAndrew Turner {
86b6aadd18SAndrew Turner     ocsd_err_t err = addElem(trc_pkt_idx);
87b6aadd18SAndrew Turner     if (!err)
88b6aadd18SAndrew Turner         getCurrElem().setType(elem_type);
89b6aadd18SAndrew Turner     return err;
90b6aadd18SAndrew Turner }
91b6aadd18SAndrew Turner 
resetElemStack()92b6aadd18SAndrew Turner ocsd_err_t OcsdGenElemStack::resetElemStack()
93b6aadd18SAndrew Turner {
94b6aadd18SAndrew Turner     ocsd_err_t err = OCSD_OK;
95b6aadd18SAndrew Turner     if (!m_pElemArray)
96b6aadd18SAndrew Turner     {
97b6aadd18SAndrew Turner         err = growArray();
98b6aadd18SAndrew Turner         if (err)
99b6aadd18SAndrew Turner             return err;
100b6aadd18SAndrew Turner     }
101b6aadd18SAndrew Turner 
102b6aadd18SAndrew Turner     if (!isInit())
103b6aadd18SAndrew Turner         return OCSD_ERR_NOT_INIT;
104b6aadd18SAndrew Turner 
105b6aadd18SAndrew Turner     resetIndexes();
106b6aadd18SAndrew Turner     return err;
107b6aadd18SAndrew Turner }
108b6aadd18SAndrew Turner 
resetIndexes()109b6aadd18SAndrew Turner void OcsdGenElemStack::resetIndexes()
110b6aadd18SAndrew Turner {
111b6aadd18SAndrew Turner     // last time there was more than one element on stack
112b6aadd18SAndrew Turner     if (m_curr_elem_idx > 0)
113b6aadd18SAndrew Turner         copyPersistentData(m_curr_elem_idx, 0);
114b6aadd18SAndrew Turner 
115b6aadd18SAndrew Turner     // indexes to bottom of stack, nothing in use at present
116b6aadd18SAndrew Turner     m_curr_elem_idx = 0;
117b6aadd18SAndrew Turner     m_send_elem_idx = 0;
118b6aadd18SAndrew Turner     m_elem_to_send = 0;
119b6aadd18SAndrew Turner }
120b6aadd18SAndrew Turner 
sendElements()121b6aadd18SAndrew Turner ocsd_datapath_resp_t OcsdGenElemStack::sendElements()
122b6aadd18SAndrew Turner {
123b6aadd18SAndrew Turner     ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
124b6aadd18SAndrew Turner     if (!isInit())
125b6aadd18SAndrew Turner         return OCSD_RESP_FATAL_NOT_INIT;
126b6aadd18SAndrew Turner 
127b6aadd18SAndrew Turner     while (m_elem_to_send && OCSD_DATA_RESP_IS_CONT(resp))
128b6aadd18SAndrew Turner     {
129b6aadd18SAndrew Turner         resp = m_sendIf->first()->TraceElemIn(m_pElemArray[m_send_elem_idx].trc_pkt_idx, m_CSID, *(m_pElemArray[m_send_elem_idx].pElem));
130b6aadd18SAndrew Turner         m_send_elem_idx++;
131b6aadd18SAndrew Turner         m_elem_to_send--;
132b6aadd18SAndrew Turner     }
133b6aadd18SAndrew Turner 
134b6aadd18SAndrew Turner     // clear the indexes if we are done.
135b6aadd18SAndrew Turner     if (!m_elem_to_send)
136b6aadd18SAndrew Turner         resetIndexes();
137b6aadd18SAndrew Turner     return resp;
138b6aadd18SAndrew Turner }
139b6aadd18SAndrew Turner 
growArray()140b6aadd18SAndrew Turner ocsd_err_t OcsdGenElemStack::growArray()
141b6aadd18SAndrew Turner {
142b6aadd18SAndrew Turner     elemPtr_t *p_new_array = 0;
143b6aadd18SAndrew Turner     const int increment = 4;
144b6aadd18SAndrew Turner 
145b6aadd18SAndrew Turner     p_new_array = new (std::nothrow) elemPtr_t[m_elemArraySize + increment];
146b6aadd18SAndrew Turner 
147b6aadd18SAndrew Turner     if (p_new_array != 0)
148b6aadd18SAndrew Turner     {
149b6aadd18SAndrew Turner         OcsdTraceElement *pElem = 0;
150b6aadd18SAndrew Turner 
151b6aadd18SAndrew Turner         // fill the last increment elements with new objects
152b6aadd18SAndrew Turner         for (int i = 0; i < increment; i++)
153b6aadd18SAndrew Turner         {
154b6aadd18SAndrew Turner             pElem = new (std::nothrow) OcsdTraceElement();
155b6aadd18SAndrew Turner             if (!pElem)
156b6aadd18SAndrew Turner                 return OCSD_ERR_MEM;
157b6aadd18SAndrew Turner             pElem->init();
158b6aadd18SAndrew Turner             p_new_array[m_elemArraySize + i].pElem = pElem;
159b6aadd18SAndrew Turner         }
160b6aadd18SAndrew Turner 
161b6aadd18SAndrew Turner         // copy the existing objects from the old array to the start of the new one
162b6aadd18SAndrew Turner         if (m_elemArraySize > 0)
163b6aadd18SAndrew Turner         {
164b6aadd18SAndrew Turner             for (int i = 0; i < m_elemArraySize; i++)
165b6aadd18SAndrew Turner             {
166b6aadd18SAndrew Turner                 p_new_array[i].pElem = m_pElemArray[i].pElem;
167b6aadd18SAndrew Turner                 p_new_array[i].trc_pkt_idx = m_pElemArray[i].trc_pkt_idx;
168b6aadd18SAndrew Turner             }
169b6aadd18SAndrew Turner         }
170b6aadd18SAndrew Turner 
171b6aadd18SAndrew Turner         // delete the old pointer array.
172b6aadd18SAndrew Turner         delete[] m_pElemArray;
173b6aadd18SAndrew Turner         m_elemArraySize += increment;
174b6aadd18SAndrew Turner         m_pElemArray = p_new_array;
175b6aadd18SAndrew Turner     }
176b6aadd18SAndrew Turner     else
177b6aadd18SAndrew Turner         return OCSD_ERR_MEM;
178b6aadd18SAndrew Turner 
179b6aadd18SAndrew Turner     return OCSD_OK;
180b6aadd18SAndrew Turner }
181b6aadd18SAndrew Turner 
copyPersistentData(int src,int dst)182b6aadd18SAndrew Turner void OcsdGenElemStack::copyPersistentData(int src, int dst)
183b6aadd18SAndrew Turner {
184b6aadd18SAndrew Turner     m_pElemArray[dst].pElem->copyPersistentData(*(m_pElemArray[src].pElem));
185b6aadd18SAndrew Turner }
186b6aadd18SAndrew Turner 
isInit()187b6aadd18SAndrew Turner const bool OcsdGenElemStack::isInit()
188b6aadd18SAndrew Turner {
189b6aadd18SAndrew Turner     if (!m_is_init) {
190b6aadd18SAndrew Turner         if (m_elemArraySize && m_pElemArray && m_sendIf)
191b6aadd18SAndrew Turner             m_is_init = true;
192b6aadd18SAndrew Turner     }
193b6aadd18SAndrew Turner     return m_is_init;
194b6aadd18SAndrew Turner }
195b6aadd18SAndrew Turner 
196b6aadd18SAndrew Turner 
197b6aadd18SAndrew Turner /* End of File ocsd_gen_elem_stack.cpp */
198