Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37836311
en ru br
ALT Linux repos
S:3.3.8d-alt16.1
5.0: 3.3.8b-alt3
4.1: 3.3.8b-alt2.qa1
4.0: 3.3.8b-alt0.M40.1
3.0: 3.3.4-alt6
+updates:3.3.4-alt6.3.M30

Group :: System/Libraries
RPM: qt3

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

// -*- c-basic-offset: 2 -*-
/*
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

/*
* This will use libc malloc instead of trying to use any other malloc.
*/

#include <sys/types.h>
#include <dlfcn.h>

/* SVID2/XPG mallinfo structure */
struct mallinfo {
int arena; /* total space allocated from system */
int ordblks; /* number of non-inuse chunks */
int smblks; /* unused -- always zero */
int hblks; /* number of mmapped regions */
int hblkhd; /* total space in mmapped regions */
int usmblks; /* unused -- always zero */
int fsmblks; /* unused -- always zero */
int uordblks; /* total allocated space */
int fordblks; /* total non-inuse space */
int keepcost; /* top-most, releasable (via malloc_trim) space */
};

namespace
{
void* (*malloc_ptr)(size_t);
void (*free_ptr)(void*);
void* (*realloc_ptr)(void*,size_t);
void* (*memalign_ptr)(size_t,size_t);
void* (*valloc_ptr)(size_t);
void* (*pvalloc_ptr)(size_t);
void* (*calloc_ptr)(size_t,size_t);
void (*cfree_ptr)(void*);
struct mallinfo (*mallinfo_ptr)();
int (*mallopt_ptr)(int,int);

void* dlopen_handle;

void init_symbols()
{
dlopen_handle = dlopen( "libc.so", RTLD_LAZY );
if( dlopen_handle == 0 )
dlopen_handle = dlopen( "libc.so.6", RTLD_LAZY );
malloc_ptr = (void* (*)(size_t))dlsym( dlopen_handle, "malloc");
free_ptr = (void (*)(void*))dlsym( dlopen_handle, "free");
realloc_ptr = (void* (*)(void*,size_t))dlsym( dlopen_handle, "realloc");
memalign_ptr = (void* (*)(size_t,size_t))dlsym( dlopen_handle, "memalign");
valloc_ptr = (void* (*)(size_t))dlsym( dlopen_handle, "valloc");
pvalloc_ptr = (void* (*)(size_t))dlsym( dlopen_handle, "pvalloc");
calloc_ptr = (void* (*)(size_t,size_t))dlsym( dlopen_handle, "calloc");
cfree_ptr = (void (*)(void*))dlsym( dlopen_handle, "cfree");
mallinfo_ptr = (struct mallinfo (*)())dlsym( dlopen_handle, "mallinfo");
mallopt_ptr = (int (*)(int,int))dlsym( dlopen_handle, "mallopt");
if( cfree_ptr == 0 )
cfree_ptr = free_ptr;
dlclose( dlopen_handle );
}

}; // namespace

extern "C"
{

void* malloc( size_t s_P )
{
if( malloc_ptr == 0 )
init_symbols();
return malloc_ptr( s_P );
}

void free( void* ptr_P )
{
if( free_ptr == 0 )
init_symbols();
free_ptr( ptr_P );
}

void* realloc( void* ptr_P, size_t s_P )
{
if( realloc_ptr == 0 )
init_symbols();
return realloc_ptr( ptr_P, s_P );
}

void* memalign( size_t s1_P, size_t s2_P )
{
if( memalign_ptr == 0 )
init_symbols();
return memalign_ptr( s1_P, s2_P );
}

void* valloc( size_t s_P )
{
if( valloc_ptr == 0 )
init_symbols();
return valloc_ptr( s_P );
}

void* pvalloc( size_t s_P )
{
if( pvalloc_ptr == 0 )
init_symbols();
return pvalloc_ptr( s_P );
}

void* calloc( size_t s1_P, size_t s2_P )
{
if( calloc_ptr == 0 )
init_symbols();
return calloc_ptr( s1_P, s2_P );
}

void cfree( void* ptr_P )
{
if( cfree_ptr == 0 )
init_symbols();
return cfree_ptr( ptr_P );
}

struct mallinfo mallinfo()
{
if( mallinfo_ptr == 0 )
init_symbols();
return mallinfo_ptr();
}

int mallopt( int i1_P, int i2_P )
{
if( mallopt_ptr == 0 )
init_symbols();
return mallopt_ptr( i1_P, i2_P );
}

}; // extern "C"
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin