Home | History | Annotate | Download | only in source
      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 
     24 dng_memory_data::dng_memory_data ()
     25 
     26 	:	fBuffer (NULL)
     27 
     28 	{
     29 
     30 	}
     31 
     32 /*****************************************************************************/
     33 
     34 dng_memory_data::dng_memory_data (uint32 size)
     35 
     36 	:	fBuffer (NULL)
     37 
     38 	{
     39 
     40 	Allocate (size);
     41 
     42 	}
     43 
     44 /*****************************************************************************/
     45 
     46 dng_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 
     58 dng_memory_data::~dng_memory_data ()
     59 	{
     60 
     61 	Clear ();
     62 
     63 	}
     64 
     65 /*****************************************************************************/
     66 
     67 void 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 
     90 void 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 
    110 void 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 
    126 dng_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 
    141 class 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 
    166 dng_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 
    204 dng_malloc_block::~dng_malloc_block ()
    205 	{
    206 
    207 	if (fMalloc)
    208 		{
    209 
    210 		free (fMalloc);
    211 
    212 		}
    213 
    214 	}
    215 
    216 /*****************************************************************************/
    217 
    218 dng_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 
    236 dng_memory_allocator gDefaultDNGMemoryAllocator;
    237 
    238 /*****************************************************************************/
    239