History

Initial Commit

Ethan Hugg committed 12 years ago

Commit 70e5e621 parent bd509b2308 files · +97095 −-5Browse files

Showing the changes to codec/encoder/core/src/memory_align.cpp (1 of 308 files). Show all

Unified · Split

codec/encoder/core/src/memory_align.cpp+161−0
@@ -0,0 +1,161 @@
1/*!
2 * \copy
3 * Copyright (c) 2013, Cisco Systems
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 */
32
33#include <stdlib.h>
34#include <string.h>
35#include <assert.h>
36#include "memory_align.h"
37#include "macros.h"
38
39namespace WelsSVCEnc {
40
41CMemoryAlign::CMemoryAlign( const uint32_t kuiCacheLineSize )
42#ifdef MEMORY_MONITOR
43: m_nMemoryUsageInBytes( 0 )
44#endif//MEMORY_MONITOR
45{
46 if ( (kuiCacheLineSize == 0) || (kuiCacheLineSize & 0x0f) )
47 m_nCacheLineSize = 0x10;
48 else
49 m_nCacheLineSize = kuiCacheLineSize;
50
51#ifdef MEMORY_CHECK
52 m_fpMemChkPoint = fopen("./enc_mem_check_point.txt", "wt+");
53 m_nCountRequestNum = 0;
54#endif//MEMORY_CHECK
55}
56
57CMemoryAlign::~CMemoryAlign()
58{
59#ifdef MEMORY_MONITOR
60 assert( m_nMemoryUsageInBytes == 0 );
61#endif//MEMORY_MONITOR
62
63#ifdef MEMORY_CHECK
64 fclose(m_fpMemChkPoint);
65 m_fpMemChkPoint = NULL;
66
67 m_nCountRequestNum = 0;
68#endif//MEMORY_CHECK
69}
70
71void* CMemoryAlign::WelsMallocz( const uint32_t kuiSize, const str_t *kpTag )
72{
73 void *pPointer = WelsMalloc( kuiSize, kpTag );
74 if ( NULL == pPointer )
75 {
76 return NULL;
77 }
78 // zero memory
79 memset( pPointer, 0, kuiSize );
80
81 return pPointer;
82}
83
84void* CMemoryAlign::WelsMalloc( const uint32_t kuiSize, const str_t *kpTag )
85{
86 const int32_t kiSizeOfVoidPointer = sizeof( void ** );
87 const int32_t kiSizeOfInt = sizeof( int32_t );
88 const int32_t kiAlignedBytes = m_nCacheLineSize - 1;
89 const int32_t kiTrialRequestedSize = kuiSize + kiAlignedBytes + kiSizeOfVoidPointer + kiSizeOfInt;
90#if MEMORY_REQUEST_ALIGN_BYTES
91 // ensure 4 bytes boundary aligned memory request, unused extra bytes padding in pData payload
92 const int32_t kiActualRequestedSize = WELS_ALIGN(kiTrialRequestedSize, MEMORY_REQUEST_ALIGN_BYTES);
93 const uint32_t kiPayloadSize = kuiSize + MEMORY_REQUEST_ALIGN_BYTES - (kiTrialRequestedSize & (MEMORY_REQUEST_ALIGN_BYTES-1));
94#else
95 const int32_t kiActualRequestedSize = kiTrialRequestedSize;
96 const uint32_t kiPayloadSize = kuiSize;
97#endif//MEMORY_REQUEST_ALIGN_BYTES
98
99 uint8_t* pBuf = (uint8_t *) malloc( kiActualRequestedSize );
100#ifdef MEMORY_CHECK
101 if (m_fpMemChkPoint != NULL)
102 {
103 if ( kpTag != NULL )
104 fprintf( m_fpMemChkPoint, "WelsMalloc(), 0x%x : actual uiSize:\t%d\tbytes, input uiSize: %d bytes, %d - %s\n", (void *)pBuf, kiActualRequestedSize, kuiSize, m_nCountRequestNum++, kpTag );
105 else
106 fprintf( m_fpMemChkPoint, "WelsMalloc(), 0x%x : actual uiSize:\t%d\tbytes, input uiSize: %d bytes, %d \n", (void *)pBuf, kiActualRequestedSize, kuiSize, m_nCountRequestNum++ );
107 fflush( m_fpMemChkPoint);
108 }
109#endif
110 uint8_t* pAlignedBuffer;
111
112 if ( NULL == pBuf )
113 return NULL;
114
115 pAlignedBuffer = pBuf + kiAlignedBytes + kiSizeOfVoidPointer + kiSizeOfInt;
116 pAlignedBuffer -= ((int32_t) pAlignedBuffer & kiAlignedBytes);
117 *( (void **) ( pAlignedBuffer - kiSizeOfVoidPointer ) ) = pBuf;
118 *( (int32_t *) ( pAlignedBuffer - (kiSizeOfVoidPointer + kiSizeOfInt) ) ) = kiPayloadSize;
119
120#ifdef MEMORY_MONITOR
121 m_nMemoryUsageInBytes += kiActualRequestedSize;
122#endif//MEMORY_MONITOR
123
124 return pAlignedBuffer;
125}
126
127void CMemoryAlign::WelsFree( void* pPointer, const str_t *kpTag )
128{
129 if( pPointer )
130 {
131#ifdef MEMORY_MONITOR
132 const int32_t kiMemoryLength = *((int32_t *)((uint8_t *)pPointer- sizeof(void **) - sizeof(int32_t))) + m_nCacheLineSize - 1 + sizeof(void **) + sizeof(int32_t);
133 m_nMemoryUsageInBytes -= kiMemoryLength;
134#endif//MEMORY_MONITOR
135#ifdef MEMORY_CHECK
136 if (m_fpMemChkPoint != NULL)
137 {
138 if ( kpTag != NULL )
139 fprintf( m_fpMemChkPoint, "WelsFree(), 0x%x - %s: \t%d\t bytes \n", (void *)(*( ( ( void **) pPointer ) - 1 )), kpTag, kiMemoryLength );
140 else
141 fprintf( m_fpMemChkPoint, "WelsFree(), 0x%x \n", (void *)(*( ( ( void **) pPointer ) - 1 )) );
142 fflush( m_fpMemChkPoint);
143 }
144#endif
145 free( *( ( ( void **) pPointer ) - 1 ) );
146 }
147}
148
149const uint32_t CMemoryAlign::WelsGetCacheLineSize() const
150{
151 return m_nCacheLineSize;
152}
153
154#if defined(MEMORY_MONITOR)
155const uint32_t CMemoryAlign::WelsGetMemoryUsage() const
156{
157 return m_nMemoryUsageInBytes;
158}
159#endif//MEMORY_MONITOR
160
161} // end of namespace WelsSVCEnc

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t