Example #1
0
static void
_memory_deallocate_malloc(void* p) {
#if FOUNDATION_SIZE_POINTER == 4
	if (!p)
		return;
#  if BUILD_ENABLE_MEMORY_GUARD
	p = _memory_guard_verify(p);
#  endif
#  if FOUNDATION_PLATFORM_WINDOWS
	_aligned_free(p);
#  else
	free(*((void**)p - 1));
#  endif

#else

	uintptr_t raw_ptr;

	if (!p)
		return;

#  if BUILD_ENABLE_MEMORY_GUARD
	p = _memory_guard_verify(p);
#  endif
	raw_ptr = *((uintptr_t*)p - 1);
	if (raw_ptr & 1) {
		raw_ptr &= ~(uintptr_t)1;
#  if FOUNDATION_PLATFORM_WINDOWS
		if (VirtualFree((void*)raw_ptr, 0, MEM_RELEASE) == 0)
			log_warnf(HASH_MEMORY, WARNING_SYSTEM_CALL_FAIL,
				STRING_CONST("Failed to VirtualFree 0x%" PRIfixPTR),
				(uintptr_t)raw_ptr);
#  else
		uintptr_t raw_size = *((uintptr_t*)p - 2);
		if (munmap((void*)raw_ptr, raw_size) < 0)
			log_warnf(HASH_MEMORY, WARNING_SYSTEM_CALL_FAIL,
			          STRING_CONST("Failed to munmap 0x%" PRIfixPTR " size %" PRIsize),
			          (uintptr_t)raw_ptr, raw_size);
#  endif
	}
	else {
#  if FOUNDATION_PLATFORM_WINDOWS
		_aligned_free((void*)raw_ptr);
#  else
		free((void*)raw_ptr);
#  endif
	}

#endif
}
Example #2
0
static void _memory_deallocate_malloc( void* p )
{
#if FOUNDATION_SIZE_POINTER == 4
	if( !p )
		return;
#  if BUILD_ENABLE_MEMORY_GUARD
	p = _memory_guard_verify( p );
#  endif
#  if FOUNDATION_PLATFORM_WINDOWS
	_aligned_free( p );
#  else
	free( *( (void**)p - 1 ) );
#  endif

#else

	uintptr_t raw_ptr;

	if( !p )
		return;

#  if BUILD_ENABLE_MEMORY_GUARD
	p = _memory_guard_verify( p );
#  endif
	raw_ptr = *( (uintptr_t*)p - 1 );
	if( raw_ptr & 1 )
	{
#  if FOUNDATION_PLATFORM_WINDOWS
		VirtualFree( (void*)raw_ptr, 0, MEM_RELEASE );
#  else
		uintptr_t raw_size = *( (uintptr_t*)p - 2 );
		munmap( (void*)raw_ptr, raw_size );
#  endif
	}
	else
	{
#  if FOUNDATION_PLATFORM_WINDOWS
		_aligned_free( (void*)raw_ptr );
#  else
		free( (void*)raw_ptr );
#  endif
	}

#endif
}
Example #3
0
static void*
_memory_reallocate_malloc(void* p, size_t size, unsigned  int align, size_t oldsize) {
#if ( FOUNDATION_SIZE_POINTER == 4 ) && FOUNDATION_PLATFORM_WINDOWS
	FOUNDATION_UNUSED(oldsize);
	align = _memory_get_align(align);
#  if BUILD_ENABLE_MEMORY_GUARD
	if (p) {
		p = _memory_guard_verify(p);
		p = _aligned_realloc(p, (size_t)size + FOUNDATION_MAX_ALIGN * 3, align);
	}
	else {
		p = _aligned_malloc((size_t)size + FOUNDATION_MAX_ALIGN * 3, align);
	}
	if (p)
		p = _memory_guard_initialize(p, (size_t)size);
	return p;
#  else
	return _aligned_realloc(p, (size_t)size, align);
#  endif
#else
	void* memory;
	void* raw_p;

	align = _memory_get_align(align);

	memory = p;
#  if BUILD_ENABLE_MEMORY_GUARD
	if (memory)
		memory = _memory_guard_verify(memory);
#  endif
	raw_p = memory ? *((void**)memory - 1) : nullptr;
	memory = nullptr;

#if FOUNDATION_PLATFORM_WINDOWS
	if (raw_p && !((uintptr_t)raw_p & 1)) {
		size_t padding = (align > FOUNDATION_SIZE_POINTER ? align : FOUNDATION_SIZE_POINTER);
#  if BUILD_ENABLE_MEMORY_GUARD
		size_t extra_padding = FOUNDATION_MAX_ALIGN * 3;
#  else
		size_t extra_padding = 0;
#  endif
		void* raw_memory = _aligned_realloc(raw_p, size + padding + extra_padding, align ? align : 8);
		if (raw_memory) {
			memory = pointer_offset(raw_memory, padding);
			*((void**)memory - 1) = raw_memory;
#  if BUILD_ENABLE_MEMORY_GUARD
			memory = _memory_guard_initialize(memory, size);
#  endif
		}
	}
	else {
#  if FOUNDATION_SIZE_POINTER == 4
		memory = _memory_allocate_malloc_raw(size, align, 0U);
#  else
		memory = _memory_allocate_malloc_raw(size, align,
		                                     (raw_p && ((uintptr_t)raw_p < 0xFFFFFFFFULL)) ?
		                                       MEMORY_32BIT_ADDRESS : 0U);
#  endif
		if (p && memory && oldsize)
			memcpy(memory, p, (size < oldsize) ? size : oldsize);
		_memory_deallocate_malloc(p);
	}

#else //!FOUNDATION_PLATFORM_WINDOWS

//If we're on ARM the realloc can return a 16-bit aligned address, causing raw pointer store to SIGILL
//Realigning does not work since the realloc memory copy preserve cannot be done properly. Revert to normal alloc-and-copy
//Same with alignment, since we cannot guarantee that the returned memory block offset from start of actual memory block
//is the same in the reallocated block as the original block, we need to alloc-and-copy to get alignment
//Memory guard introduces implicit alignments as well so alloc-and-copy for that
#if !FOUNDATION_ARCH_ARM && !FOUNDATION_ARCH_ARM_64 && !BUILD_ENABLE_MEMORY_GUARD
	if (!align && raw_p && !((uintptr_t)raw_p & 1)) {
		void* raw_memory = realloc(raw_p, (size_t)size + FOUNDATION_SIZE_POINTER);
		if (raw_memory) {
			*(void**)raw_memory = raw_memory;
			memory = pointer_offset(raw_memory, FOUNDATION_SIZE_POINTER);
		}
	}
	else
#endif
	{
#  if FOUNDATION_SIZE_POINTER == 4
#    if !BUILD_ENABLE_LOG
		FOUNDATION_UNUSED(raw_p);
#    endif
		memory = _memory_allocate_malloc_raw(size, align, 0U);
#  else
		memory = _memory_allocate_malloc_raw(size, align,
		                                     (raw_p && ((uintptr_t)raw_p < 0xFFFFFFFFULL)) ?
		                                       MEMORY_32BIT_ADDRESS : 0U);
#  endif
		if (p && memory && oldsize)
			memcpy(memory, p, (size < oldsize) ? (size_t)size : (size_t)oldsize);
		_memory_deallocate_malloc(p);
	}

#endif

	if (!memory) {
		string_const_t errmsg = system_error_message(0);
		log_panicf(HASH_MEMORY, ERROR_OUT_OF_MEMORY,
		           STRING_CONST("Unable to reallocate memory (%" PRIsize " -> %" PRIsize " @ 0x%" PRIfixPTR ", raw 0x%" PRIfixPTR "): %.*s"),
		           oldsize, size, (uintptr_t)p, (uintptr_t)raw_p, STRING_FORMAT(errmsg));
	}

	return memory;
#endif
}