1*c120c564SAndrew Turner /*
2*c120c564SAndrew Turner * \file ocsd_gen_elem_list.cpp
3*c120c564SAndrew Turner * \brief OpenCSD : List of Generic trace elements for output.
4*c120c564SAndrew Turner *
5*c120c564SAndrew Turner * \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
6*c120c564SAndrew Turner */
7*c120c564SAndrew Turner
8*c120c564SAndrew Turner
9*c120c564SAndrew Turner /*
10*c120c564SAndrew Turner * Redistribution and use in source and binary forms, with or without modification,
11*c120c564SAndrew Turner * are permitted provided that the following conditions are met:
12*c120c564SAndrew Turner *
13*c120c564SAndrew Turner * 1. Redistributions of source code must retain the above copyright notice,
14*c120c564SAndrew Turner * this list of conditions and the following disclaimer.
15*c120c564SAndrew Turner *
16*c120c564SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright notice,
17*c120c564SAndrew Turner * this list of conditions and the following disclaimer in the documentation
18*c120c564SAndrew Turner * and/or other materials provided with the distribution.
19*c120c564SAndrew Turner *
20*c120c564SAndrew Turner * 3. Neither the name of the copyright holder nor the names of its contributors
21*c120c564SAndrew Turner * may be used to endorse or promote products derived from this software without
22*c120c564SAndrew Turner * specific prior written permission.
23*c120c564SAndrew Turner *
24*c120c564SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
25*c120c564SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26*c120c564SAndrew Turner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27*c120c564SAndrew Turner * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28*c120c564SAndrew Turner * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29*c120c564SAndrew Turner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30*c120c564SAndrew Turner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31*c120c564SAndrew Turner * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32*c120c564SAndrew Turner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33*c120c564SAndrew Turner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*c120c564SAndrew Turner */
35*c120c564SAndrew Turner
36*c120c564SAndrew Turner #include "common/ocsd_gen_elem_list.h"
37*c120c564SAndrew Turner
OcsdGenElemList()38*c120c564SAndrew Turner OcsdGenElemList::OcsdGenElemList()
39*c120c564SAndrew Turner {
40*c120c564SAndrew Turner m_firstElemIdx=0;
41*c120c564SAndrew Turner m_numUsed=0;
42*c120c564SAndrew Turner m_numPend=0;
43*c120c564SAndrew Turner
44*c120c564SAndrew Turner m_elemArraySize = 0;
45*c120c564SAndrew Turner m_sendIf = 0;
46*c120c564SAndrew Turner m_CSID = 0;
47*c120c564SAndrew Turner m_pElemArray = 0;
48*c120c564SAndrew Turner }
49*c120c564SAndrew Turner
~OcsdGenElemList()50*c120c564SAndrew Turner OcsdGenElemList::~OcsdGenElemList()
51*c120c564SAndrew Turner {
52*c120c564SAndrew Turner for(int i = 0; i<m_elemArraySize; i++)
53*c120c564SAndrew Turner {
54*c120c564SAndrew Turner delete m_pElemArray[i].pElem;
55*c120c564SAndrew Turner }
56*c120c564SAndrew Turner delete [] m_pElemArray;
57*c120c564SAndrew Turner m_pElemArray = 0;
58*c120c564SAndrew Turner }
59*c120c564SAndrew Turner
reset()60*c120c564SAndrew Turner void OcsdGenElemList::reset()
61*c120c564SAndrew Turner {
62*c120c564SAndrew Turner m_firstElemIdx=0;
63*c120c564SAndrew Turner m_numUsed=0;
64*c120c564SAndrew Turner m_numPend=0;
65*c120c564SAndrew Turner }
66*c120c564SAndrew Turner
getNextElem(const ocsd_trc_index_t trc_pkt_idx)67*c120c564SAndrew Turner OcsdTraceElement *OcsdGenElemList::getNextElem(const ocsd_trc_index_t trc_pkt_idx)
68*c120c564SAndrew Turner {
69*c120c564SAndrew Turner OcsdTraceElement *pElem = 0;
70*c120c564SAndrew Turner if(getNumElem() == m_elemArraySize) // all in use
71*c120c564SAndrew Turner growArray();
72*c120c564SAndrew Turner
73*c120c564SAndrew Turner if(m_pElemArray != 0)
74*c120c564SAndrew Turner {
75*c120c564SAndrew Turner m_numUsed++;
76*c120c564SAndrew Turner int idx = getAdjustedIdx(m_firstElemIdx + m_numUsed - 1);
77*c120c564SAndrew Turner pElem = m_pElemArray[idx].pElem;
78*c120c564SAndrew Turner m_pElemArray[idx].trc_pkt_idx = trc_pkt_idx;
79*c120c564SAndrew Turner }
80*c120c564SAndrew Turner return pElem;
81*c120c564SAndrew Turner }
82*c120c564SAndrew Turner
getElemType(const int entryN) const83*c120c564SAndrew Turner const ocsd_gen_trc_elem_t OcsdGenElemList::getElemType(const int entryN) const
84*c120c564SAndrew Turner {
85*c120c564SAndrew Turner ocsd_gen_trc_elem_t elem_type = OCSD_GEN_TRC_ELEM_UNKNOWN;
86*c120c564SAndrew Turner if(entryN < getNumElem())
87*c120c564SAndrew Turner {
88*c120c564SAndrew Turner int idx = getAdjustedIdx(m_firstElemIdx + entryN);
89*c120c564SAndrew Turner elem_type = m_pElemArray[idx].pElem->getType();
90*c120c564SAndrew Turner }
91*c120c564SAndrew Turner return elem_type;
92*c120c564SAndrew Turner }
93*c120c564SAndrew Turner
sendElements()94*c120c564SAndrew Turner ocsd_datapath_resp_t OcsdGenElemList::sendElements()
95*c120c564SAndrew Turner {
96*c120c564SAndrew Turner ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
97*c120c564SAndrew Turner
98*c120c564SAndrew Turner if((m_elemArraySize == 0) || (m_sendIf == 0))
99*c120c564SAndrew Turner return OCSD_RESP_FATAL_NOT_INIT;
100*c120c564SAndrew Turner
101*c120c564SAndrew Turner if(!m_sendIf->hasAttachedAndEnabled())
102*c120c564SAndrew Turner return OCSD_RESP_FATAL_NOT_INIT;
103*c120c564SAndrew Turner
104*c120c564SAndrew Turner while(elemToSend() && OCSD_DATA_RESP_IS_CONT(resp))
105*c120c564SAndrew Turner {
106*c120c564SAndrew Turner resp = m_sendIf->first()->TraceElemIn(m_pElemArray[m_firstElemIdx].trc_pkt_idx, m_CSID, *(m_pElemArray[m_firstElemIdx].pElem));
107*c120c564SAndrew Turner m_firstElemIdx++;
108*c120c564SAndrew Turner if(m_firstElemIdx >= m_elemArraySize)
109*c120c564SAndrew Turner m_firstElemIdx = 0;
110*c120c564SAndrew Turner m_numUsed--;
111*c120c564SAndrew Turner }
112*c120c564SAndrew Turner return resp;
113*c120c564SAndrew Turner }
114*c120c564SAndrew Turner
115*c120c564SAndrew Turner // this function will enlarge the array, and create extra element objects.
116*c120c564SAndrew Turner // existing objects will be moved to the front of the array
117*c120c564SAndrew Turner // called if all elements are in use. (sets indexes accordingly)
growArray()118*c120c564SAndrew Turner void OcsdGenElemList::growArray()
119*c120c564SAndrew Turner {
120*c120c564SAndrew Turner elemPtr_t *p_new_array = 0;
121*c120c564SAndrew Turner
122*c120c564SAndrew Turner int increment;
123*c120c564SAndrew Turner if(m_elemArraySize == 0)
124*c120c564SAndrew Turner // starting from scratch...
125*c120c564SAndrew Turner increment = 8;
126*c120c564SAndrew Turner else
127*c120c564SAndrew Turner increment = m_elemArraySize / 2; // grow by 50%
128*c120c564SAndrew Turner
129*c120c564SAndrew Turner
130*c120c564SAndrew Turner p_new_array = new (std::nothrow) elemPtr_t[m_elemArraySize+increment];
131*c120c564SAndrew Turner
132*c120c564SAndrew Turner if(p_new_array != 0)
133*c120c564SAndrew Turner {
134*c120c564SAndrew Turner // fill the last increment elements with new objects
135*c120c564SAndrew Turner for(int i=0; i < increment; i++)
136*c120c564SAndrew Turner {
137*c120c564SAndrew Turner p_new_array[m_elemArraySize+i].pElem = new (std::nothrow) OcsdTraceElement();
138*c120c564SAndrew Turner }
139*c120c564SAndrew Turner
140*c120c564SAndrew Turner // copy the existing objects from the old array to the start of the new one
141*c120c564SAndrew Turner // and adjust the indices.
142*c120c564SAndrew Turner if(m_elemArraySize > 0)
143*c120c564SAndrew Turner {
144*c120c564SAndrew Turner int inIdx = m_firstElemIdx;
145*c120c564SAndrew Turner for(int i = 0; i < m_elemArraySize; i++)
146*c120c564SAndrew Turner {
147*c120c564SAndrew Turner p_new_array[i].pElem = m_pElemArray[inIdx].pElem;
148*c120c564SAndrew Turner p_new_array[i].trc_pkt_idx = m_pElemArray[inIdx].trc_pkt_idx;
149*c120c564SAndrew Turner inIdx++;
150*c120c564SAndrew Turner if(inIdx >= m_elemArraySize)
151*c120c564SAndrew Turner inIdx = 0;
152*c120c564SAndrew Turner }
153*c120c564SAndrew Turner }
154*c120c564SAndrew Turner
155*c120c564SAndrew Turner // delete the old pointer array.
156*c120c564SAndrew Turner delete [] m_pElemArray;
157*c120c564SAndrew Turner m_elemArraySize += increment;
158*c120c564SAndrew Turner }
159*c120c564SAndrew Turner else
160*c120c564SAndrew Turner m_elemArraySize = 0;
161*c120c564SAndrew Turner
162*c120c564SAndrew Turner // update the internal array pointers to the new array
163*c120c564SAndrew Turner if(m_firstElemIdx >= 0)
164*c120c564SAndrew Turner m_firstElemIdx = 0;
165*c120c564SAndrew Turner m_pElemArray = p_new_array;
166*c120c564SAndrew Turner }
167*c120c564SAndrew Turner
168*c120c564SAndrew Turner /* End of File ocsd_gen_elem_list.cpp */
169