⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 malloc.cxx

📁 ecos实时嵌入式操作系统
💻 CXX
字号:
//========================================================================////      malloc.cxx////      Implementation of ISO C memory allocation routines////========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos 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 or (at your option) any later version.//// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):     jlarmour// Contributors:  // Date:          2000-04-30// Purpose:       Provides ISO C calloc(), malloc(), realloc() and free()//                functions// Description:   Implementation of ISO standard allocation routines as per//                ISO C section 7.10.3// Usage:       ////####DESCRIPTIONEND####////========================================================================// CONFIGURATION#include <pkgconf/memalloc.h>   // Configuration header// Do we want these functions?#ifdef CYGPKG_MEMALLOC_MALLOC_ALLOCATORS// INCLUDES#include <cyg/infra/cyg_type.h>    // Common type definitions and support#include <cyg/infra/cyg_trac.h>    // Common tracing support#include <cyg/infra/cyg_ass.h>     // Common assertion support#include <string.h>                // For memset() and memmove()#include <stdlib.h>                // header for this file#ifdef CYGBLD_MEMALLOC_MALLOC_EXTERNAL_HEAP_H# include CYGBLD_MEMALLOC_MALLOC_EXTERNAL_HEAP_H#else# include <pkgconf/heaps.hxx>       // heap pools information#endif#include CYGBLD_MEMALLOC_MALLOC_IMPLEMENTATION_HEADER// STATIC VARIABLES// First deal with the worst case, that the memory layout didn't define a// heap#if CYGMEM_HEAP_COUNT == 0// the data space for the memory poolcyg_uint8 cyg_memalloc_mallocpool_memory[     CYGNUM_MEMALLOC_FALLBACK_MALLOC_POOL_SIZE ] CYGBLD_ATTRIB_WEAK;// the memory pool object itselfCYGCLS_MEMALLOC_MALLOC_IMPL cyg_memalloc_mallocpool   CYGBLD_ATTRIB_INIT_BEFORE( CYG_INIT_LIBC ) =   CYGCLS_MEMALLOC_MALLOC_IMPL( cyg_memalloc_mallocpool_memory,                                sizeof( cyg_memalloc_mallocpool_memory ) );# define POOL cyg_memalloc_mallocpool#elif CYGMEM_HEAP_COUNT == 1// one heap, so it's straightforward# define POOL (*cygmem_memalloc_heaps[0])#else // multiple heaps# include <cyg/memalloc/memjoin.hxx>Cyg_Mempool_Joined<CYGCLS_MEMALLOC_MALLOC_IMPL> cyg_memalloc_mallocpool   CYGBLD_ATTRIB_INIT_BEFORE( CYG_INIT_LIBC ) =     Cyg_Mempool_Joined<CYGCLS_MEMALLOC_MALLOC_IMPL>(       CYGMEM_HEAP_COUNT, cygmem_memalloc_heaps     );# define POOL cyg_memalloc_mallocpool#endif// FUNCTIONSvoid *malloc( size_t size ){    void *data_ptr;    CYG_REPORT_FUNCNAMETYPE( "malloc", "returning pointer %08x" );        CYG_REPORT_FUNCARG1DV( size );#ifdef CYGSEM_MEMALLOC_MALLOC_ZERO_RETURNS_NULL    // first check if size wanted is 0    if ( 0 == size ) {        CYG_REPORT_RETVAL( NULL );        return NULL;    } // if#endif    // ask the pool for the data    data_ptr = POOL.try_alloc( size );    // if it isn't NULL is the pointer valid?    if ( NULL != data_ptr ) {        CYG_CHECK_DATA_PTR( data_ptr,                            "allocator returned invalid pointer!" );        // And just check its alignment        CYG_ASSERT( !((CYG_ADDRWORD)data_ptr & (sizeof(CYG_ADDRWORD) - 1)),                    "Allocator has returned badly aligned data!");    } // if    CYG_REPORT_RETVAL( data_ptr );    return data_ptr;} // malloc()voidfree( void *ptr ){    cyg_bool freeret;    CYG_REPORT_FUNCNAME( "free");        CYG_REPORT_FUNCARG1XV( ptr );    // if null pointer, do nothing as per spec    if ( NULL==ptr )        return;    CYG_CHECK_DATA_PTR( ptr, "Pointer to free isn't even valid!" );    // get pool to free it    freeret = POOL.free( (cyg_uint8 *) ptr );    CYG_ASSERT( freeret , "Couldn't free!" );    CYG_REPORT_RETURN();} // free()void *calloc( size_t nmemb, size_t size ){    void *data_ptr;    cyg_ucount32 realsize;    CYG_REPORT_FUNCNAMETYPE( "calloc", "returning pointer %08x" );        CYG_REPORT_FUNCARG2DV( nmemb, size );    realsize = nmemb * size;    data_ptr = malloc( realsize );    // Fill with 0's if non-NULL    if ( data_ptr != NULL )        memset( data_ptr, 0, realsize );    CYG_REPORT_RETVAL( data_ptr );    return data_ptr;} // calloc()externC void *realloc( void *ptr, size_t size ){    cyg_int32 oldsize;    CYG_REPORT_FUNCNAMETYPE( "realloc", "returning pointer %08x" );    CYG_REPORT_FUNCARG2( "ptr=%08x, size=%d", ptr, size );    // if pointer is NULL, we must malloc it    if ( ptr == NULL ) {        ptr = malloc( size );        CYG_REPORT_RETVAL( ptr );        return ptr;    } // if    CYG_CHECK_DATA_PTR( ptr, "realloc() passed a bogus pointer!" );    // if size is 0, we must free it    if (size == 0) {        free(ptr);        CYG_REPORT_RETVAL( NULL );        return NULL;    } // if            void *newptr;    // otherwise try to resize allocation    newptr = POOL.resize_alloc( (cyg_uint8 *)ptr, size, &oldsize );    if ( NULL == newptr ) {        // if resize_alloc doesn't return a pointer, it failed, so we        // just have to allocate new space instead, and later copy it                CYG_ASSERT( oldsize != 0,                    "resize_alloc() couldn't determine allocation size!" );        newptr = malloc( size );                if ( NULL != newptr ) {            memcpy( newptr, ptr, size < (size_t) oldsize ? size                    : (size_t) oldsize );            free( ptr );        }    }        CYG_REPORT_RETVAL( newptr );    return newptr;} // realloc()externC struct mallinfomallinfo( void ){    struct mallinfo ret = { 0 }; // initialize to all zeros    Cyg_Mempool_Status stat;    CYG_REPORT_FUNCTION();    POOL.get_status( CYG_MEMPOOL_STAT_ARENASIZE|                     CYG_MEMPOOL_STAT_FREEBLOCKS|                     CYG_MEMPOOL_STAT_TOTALALLOCATED|                     CYG_MEMPOOL_STAT_TOTALFREE|                     CYG_MEMPOOL_STAT_MAXFREE, stat );    if ( stat.arenasize > 0 )        ret.arena = stat.arenasize;        if ( stat.freeblocks > 0 )        ret.ordblks = stat.freeblocks;    if ( stat.totalallocated > 0 )        ret.uordblks = stat.totalallocated;        if ( stat.totalfree > 0 )        ret.fordblks = stat.totalfree;    if ( stat.maxfree > 0 )        ret.maxfree = stat.maxfree;    CYG_REPORT_RETURN();    return ret;} // mallinfo()#endif // ifdef CYGPKG_MEMALLOC_MALLOC_ALLOCATORS// EOF malloc.cxx

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -