#include "blis.h"
#if 0#endif
void* bli_malloc_user( size_t size, err_t* r_val )
{
const malloc_ft malloc_fp = BLIS_MALLOC_USER;
const size_t align_size = BLIS_HEAP_ADDR_ALIGN_SIZE;
#ifdef BLIS_ENABLE_MEM_TRACING
printf( "bli_malloc_user(): size %ld, align size %ld\n",
( long )size, ( long )align_size );
fflush( stdout );
#endif
void* p = bli_fmalloc_align( malloc_fp, size, align_size, r_val );
return p;
}
void bli_free_user( void* p )
{
#ifdef BLIS_ENABLE_MEM_TRACING
printf( "bli_free_user(): freeing block\n" );
fflush( stdout );
#endif
bli_ffree_align( BLIS_FREE_USER, p );
}
void* bli_malloc_intl( size_t size, err_t* r_val )
{
const malloc_ft malloc_fp = BLIS_MALLOC_INTL;
#ifdef BLIS_ENABLE_MEM_TRACING
printf( "bli_malloc_intl(): size %ld\n", ( long )size );
fflush( stdout );
#endif
void* p = bli_fmalloc_noalign( malloc_fp, size, r_val );
return p;
}
void* bli_calloc_intl( size_t size, err_t* r_val )
{
#ifdef BLIS_ENABLE_MEM_TRACING
printf( "bli_calloc_intl(): " );
#endif
void* p = bli_malloc_intl( size, r_val );
if ( bli_is_success( *r_val ) )
memset( p, 0, size );
return p;
}
void bli_free_intl( void* p )
{
#ifdef BLIS_ENABLE_MEM_TRACING
printf( "bli_free_intl(): freeing block\n" );
fflush( stdout );
#endif
bli_ffree_noalign( BLIS_FREE_INTL, p );
}
void* bli_fmalloc_align
(
malloc_ft f,
size_t size,
size_t align_size,
err_t* r_val
)
{
const size_t ptr_size = sizeof( void* );
size_t align_offset = 0;
void* p_orig;
int8_t* p_byte;
void** p_addr;
if ( bli_error_checking_is_enabled() )
bli_fmalloc_align_check( f, size, align_size );
if ( size == 0 ) return NULL;
size += align_size + ptr_size;
p_orig = f( size );
if ( bli_error_checking_is_enabled() )
bli_fmalloc_post_check( p_orig );
*r_val = BLIS_SUCCESS;
p_byte = p_orig;
p_byte += ptr_size;
if ( bli_is_unaligned_to( ( siz_t )p_byte, ( siz_t )align_size ) )
{
align_offset = align_size -
bli_offset_past_alignment( ( siz_t )p_byte,
( siz_t )align_size );
}
p_byte += align_offset;
p_addr = ( void** )(p_byte - ptr_size);
*p_addr = p_orig;
return p_byte;
}
void bli_ffree_align
(
free_ft f,
void* p
)
{
const size_t ptr_size = sizeof( void* );
void* p_orig;
int8_t* p_byte;
void** p_addr;
if ( p == NULL ) return;
p_byte = p;
p_addr = ( void** )( p_byte - ptr_size );
p_orig = *p_addr;
f( p_orig );
}
void* bli_fmalloc_noalign
(
malloc_ft f,
size_t size,
err_t* r_val
)
{
void* p = f( size );
if ( bli_error_checking_is_enabled() )
bli_fmalloc_post_check( p );
*r_val = BLIS_SUCCESS;
return p;
}
void bli_ffree_noalign
(
free_ft f,
void* p
)
{
f( p );
}
void bli_fmalloc_align_check
(
malloc_ft f,
size_t size,
size_t align_size
)
{
err_t e_val;
e_val = bli_check_alignment_is_power_of_two( align_size );
bli_check_error_code( e_val );
e_val = bli_check_alignment_is_mult_of_ptr_size( align_size );
bli_check_error_code( e_val );
}
void bli_fmalloc_post_check
(
void* p
)
{
err_t e_val;
e_val = bli_check_valid_malloc_buf( p );
bli_check_error_code( e_val );
}