1/*****************************************************************************/
2// Copyright 2006 Adobe Systems Incorporated
3// All Rights Reserved.
4//
5// NOTICE: Adobe permits you to use, modify, and distribute this file in
6// accordance with the terms of the Adobe license agreement accompanying it.
7/*****************************************************************************/
8
9/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_memory.cpp#1 $ */
10/* $DateTime: 2012/05/30 13:28:51 $ */
11/* $Change: 832332 $ */
12/* $Author: tknoll $ */
13
14/*****************************************************************************/
15
16#include "dng_memory.h"
17
18#include "dng_bottlenecks.h"
19#include "dng_exceptions.h"
20#include "dng_safe_arithmetic.h"
21
22/*****************************************************************************/
23
24dng_memory_data::dng_memory_data ()
25
26 : fBuffer (NULL)
27
28 {
29
30 }
31
32/*****************************************************************************/
33
34dng_memory_data::dng_memory_data (uint32 size)
35
36 : fBuffer (NULL)
37
38 {
39
40 Allocate (size);
41
42 }
43
44/*****************************************************************************/
45
46dng_memory_data::dng_memory_data (uint32 count, std::size_t elementSize)
47
48 : fBuffer (NULL)
49
50 {
51
52 Allocate (count, elementSize);
53
54 }
55
56/*****************************************************************************/
57
58dng_memory_data::~dng_memory_data ()
59 {
60
61 Clear ();
62
63 }
64
65/*****************************************************************************/
66
67void dng_memory_data::Allocate (uint32 size)
68 {
69
70 Clear ();
71
72 if (size)
73 {
74
75 fBuffer = (char*)malloc (size);
76
77 if (!fBuffer)
78 {
79
80 ThrowMemoryFull ();
81
82 }
83
84 }
85
86 }
87
88/*****************************************************************************/
89
90void dng_memory_data::Allocate (uint32 count, std::size_t elementSize)
91 {
92
93 // Convert elementSize to a uint32.
94 const uint32 elementSizeAsUint32 = static_cast<uint32> (elementSize);
95 if (static_cast<std::size_t> (elementSizeAsUint32) != elementSize)
96 {
97 ThrowMemoryFull();
98 }
99
100 // Compute required number of bytes and allocate memory.
101 uint32 numBytes;
102 if (!SafeUint32Mult(count, elementSizeAsUint32, &numBytes))
103 {
104 ThrowMemoryFull();
105 }
106 Allocate(numBytes);
107
108 }
109
110void dng_memory_data::Clear ()
111 {
112
113 if (fBuffer)
114 {
115
116 free (fBuffer);
117
118 fBuffer = NULL;
119
120 }
121
122 }
123
124/*****************************************************************************/
125
126dng_memory_block * dng_memory_block::Clone (dng_memory_allocator &allocator) const
127 {
128
129 uint32 size = LogicalSize ();
130
131 dng_memory_block * result = allocator.Allocate (size);
132
133 DoCopyBytes (Buffer (), result->Buffer (), size);
134
135 return result;
136
137 }
138
139/*****************************************************************************/
140
141class dng_malloc_block : public dng_memory_block
142 {
143
144 private:
145
146 void *fMalloc;
147
148 public:
149
150 dng_malloc_block (uint32 logicalSize);
151
152 virtual ~dng_malloc_block ();
153
154 private:
155
156 // Hidden copy constructor and assignment operator.
157
158 dng_malloc_block (const dng_malloc_block &block);
159
160 dng_malloc_block & operator= (const dng_malloc_block &block);
161
162 };
163
164/*****************************************************************************/
165
166dng_malloc_block::dng_malloc_block (uint32 logicalSize)
167
168 : dng_memory_block (logicalSize)
169
170 , fMalloc (NULL)
171
172 {
173
174#if (qLinux && !defined(__ANDROID_API__)) || (defined(__ANDROID_API__) && __ANDROID_API__ >= 17)
175
176 int err = ::posix_memalign( (void **) &fMalloc, 16, (size_t) PhysicalSize() );
177
178 if (err)
179 {
180
181 ThrowMemoryFull ();
182
183 }
184
185#else
186
187 fMalloc = (char*)malloc (PhysicalSize ());
188
189 if (!fMalloc)
190 {
191
192 ThrowMemoryFull ();
193
194 }
195
196#endif
197
198 SetBuffer (fMalloc);
199
200 }
201
202/*****************************************************************************/
203
204dng_malloc_block::~dng_malloc_block ()
205 {
206
207 if (fMalloc)
208 {
209
210 free (fMalloc);
211
212 }
213
214 }
215
216/*****************************************************************************/
217
218dng_memory_block * dng_memory_allocator::Allocate (uint32 size)
219 {
220
221 dng_memory_block *result = new dng_malloc_block (size);
222
223 if (!result)
224 {
225
226 ThrowMemoryFull ();
227
228 }
229
230 return result;
231
232 }
233
234/*****************************************************************************/
235
236dng_memory_allocator gDefaultDNGMemoryAllocator;
237
238/*****************************************************************************/
239