Commit 472d2d04 authored by Daniel Black's avatar Daniel Black Committed by Sergey Vojtovich

my_large_free_int merge into my_large_free

parent 4ac76936
...@@ -60,7 +60,6 @@ static void my_get_large_page_sizes(size_t sizes[]); ...@@ -60,7 +60,6 @@ static void my_get_large_page_sizes(size_t sizes[]);
static inline my_bool my_is_2pow(size_t n) { return !((n) & ((n) - 1)); } static inline my_bool my_is_2pow(size_t n) { return !((n) & ((n) - 1)); }
static uchar* my_large_malloc_int(size_t *size, myf my_flags); static uchar* my_large_malloc_int(size_t *size, myf my_flags);
static my_bool my_large_free_int(void *ptr, size_t size);
#ifdef HAVE_LARGE_PAGES #ifdef HAVE_LARGE_PAGES
...@@ -222,12 +221,40 @@ void my_large_free(void *ptr, size_t size) ...@@ -222,12 +221,40 @@ void my_large_free(void *ptr, size_t size)
DBUG_ENTER("my_large_free"); DBUG_ENTER("my_large_free");
/* /*
my_large_free_int() can only fail if ptr was not allocated with The following implementations can only fail if ptr was not allocated with
my_large_malloc_int(), i.e. my_malloc_lock() was used so we should free it my_large_malloc_int(), i.e. my_malloc_lock() was used so we should free it
with my_free_lock() with my_free_lock()
*/ */
if (!my_large_free_int(ptr, size)) #if defined(HAVE_MMAP) && !defined(_WIN32)
if (munmap(ptr, size))
{
/*
This occurs when the original allocation fell back to conventional
memory so ignore the EINVAL error.
*/
if (errno == EINVAL)
{
my_free_lock(ptr);
}
else
{
fprintf(stderr, "Warning: Failed to unmap %zu bytes, errno %d\n", size, errno);
}
}
#elif defined(_WIN32)
/*
When RELEASE memory, the size parameter must be 0.
Do not use MEM_RELEASE with MEM_DECOMMIT.
*/
if (ptr && !VirtualFree(ptr, 0, MEM_RELEASE))
{
fprintf(stderr,
"Error: VirtualFree(%p, %zu) failed; Windows error %lu\n", ptr, size, GetLastError());
my_free_lock(ptr); my_free_lock(ptr);
}
#else
#error No my_large_free implementation for this OS
#endif
/* /*
For ASAN, we need to explicitly unpoison this memory region because the OS For ASAN, we need to explicitly unpoison this memory region because the OS
may reuse that memory for some TLS or stack variable. It will remain may reuse that memory for some TLS or stack variable. It will remain
...@@ -384,27 +411,6 @@ static void my_get_large_page_sizes(size_t sizes[my_large_page_sizes_length]) ...@@ -384,27 +411,6 @@ static void my_get_large_page_sizes(size_t sizes[my_large_page_sizes_length])
} }
#endif #endif
#if defined(HAVE_MMAP) && !defined(_WIN32)
/* mmap and Linux-specific large pages deallocator */
my_bool my_large_free_int(void *ptr, size_t size)
{
DBUG_ENTER("my_large_free_int");
if (munmap(ptr, size))
{
/* This occurs when the original allocation fell back to conventional memory so ignore the EINVAL error */
if (errno != EINVAL)
{
fprintf(stderr, "Warning: Failed to unmap %zu bytes, errno %d\n", size, errno);
}
DBUG_RETURN(0);
}
DBUG_RETURN(1);
}
#endif /* HAVE_MMAP */
#if defined(HAVE_MMAP) && !defined(__linux__) && !defined(MAP_ALIGNED) \ #if defined(HAVE_MMAP) && !defined(__linux__) && !defined(MAP_ALIGNED) \
&& !defined(_WIN32) && !defined(_WIN32)
...@@ -490,23 +496,5 @@ uchar* my_large_malloc_int(size_t *size, myf my_flags) ...@@ -490,23 +496,5 @@ uchar* my_large_malloc_int(size_t *size, myf my_flags)
DBUG_RETURN(ptr); DBUG_RETURN(ptr);
} }
/* Windows-specific large pages deallocator */
my_bool my_large_free_int(void *ptr, size_t size)
{
DBUG_ENTER("my_large_free_int");
/*
When RELEASE memory, the size parameter must be 0.
Do not use MEM_RELEASE with MEM_DECOMMIT.
*/
if (ptr && !VirtualFree(ptr, 0, MEM_RELEASE))
{
fprintf(stderr,
"Error: VirtualFree(%p, %zu) failed; Windows error %lu\n", ptr, size, GetLastError());
DBUG_RETURN(0);
}
DBUG_RETURN(1);
}
#endif /* _WIN32 */ #endif /* _WIN32 */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment