malloc.c

来自「MPI stands for the Message Passing Inter」· C语言 代码 · 共 180 行

C
180
字号
/* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana *                         University Research and Technology *                         Corporation.  All rights reserved. * Copyright (c) 2004-2005 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,  *                         University of Stuttgart.  All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. *                         All rights reserved. * $COPYRIGHT$ *  * Additional copyrights may follow *  * $HEADER$ */#include "opal_config.h"#include <stdlib.h>#include "opal/util/malloc.h"#include "opal/util/output.h"/* * Undefine "malloc" and "free" */#if defined(malloc)#undef malloc#endif#if defined(calloc)#undef calloc#endif#if defined(free)#undef free#endif#if defined(realloc)#undef realloc#endif/* * Public variables */int opal_malloc_debug_level = OPAL_MALLOC_DEBUG_LEVEL;int opal_malloc_output = -1;/* * Private variables */static opal_output_stream_t malloc_stream;/* * Initialize the malloc debug interface */void opal_malloc_init(void){    OBJ_CONSTRUCT(&malloc_stream, opal_output_stream_t);    malloc_stream.lds_is_debugging = true;    malloc_stream.lds_verbose_level = 5;    malloc_stream.lds_prefix = "malloc debug: ";    malloc_stream.lds_want_stderr = true;    opal_malloc_output = opal_output_open(&malloc_stream);}/* * Finalize the malloc debug interface */void opal_malloc_finalize(void){  if (-1 != opal_malloc_output) {    opal_output_close(opal_malloc_output);    opal_malloc_output = -1;    OBJ_DESTRUCT(&malloc_stream);  }}/* * Debug version of malloc */void *opal_malloc(size_t size, const char *file, int line){    void *addr;    if (opal_malloc_debug_level > 1) {        if (size <= 0) {          opal_output(opal_malloc_output, "Request for %ld bytes (%s, %d)",                      (long) size, file, line);        }    }    addr = malloc(size);    if (opal_malloc_debug_level > 0) {        if (NULL == addr) {            opal_output(opal_malloc_output,                        "Request for %ld bytes failed (%s, %d)",                       (long) size, file, line);        }    }    return addr;}/* * Debug version of calloc */void *opal_calloc(size_t nmembers, size_t size, const char *file, int line){    void *addr;    if (opal_malloc_debug_level > 1) {        if (size <= 0) {          opal_output(opal_malloc_output,                     "Request for %ld zeroed elements of size %ld (%s, %d)",                      (long) nmembers, (long) size, file, line);        }    }    addr = calloc(nmembers, size);    if (opal_malloc_debug_level > 0) {        if (NULL == addr) {            opal_output(opal_malloc_output,                        "Request for %ld zeroed elements of size %ld failed (%s, %d)",                       (long) nmembers, (long) size, file, line);        }    }    return addr;}/* * Debug version of realloc */void *opal_realloc(void *ptr, size_t size, const char *file, int line){    void *addr;    if (opal_malloc_debug_level > 1) {        if (size <= 0) {          if (NULL == ptr) {            opal_output(opal_malloc_output,                        "Realloc NULL for %ld bytes (%s, %d)",                        (long) size, file, line);          } else {            opal_output(opal_malloc_output, "Realloc %p for %ld bytes (%s, %d)",                        ptr, (long) size, file, line);          }        }    }    addr = realloc(ptr, size);    if (opal_malloc_debug_level > 0) {        if (NULL == addr) {            opal_output(opal_malloc_output,                        "Realloc %p for %ld bytes failed (%s, %d)",                       ptr, (long) size, file, line);        }    }    return addr;}/* * Debug version of free */void opal_free(void *addr, const char *file, int line){    if (opal_malloc_debug_level > 1 && NULL == addr) {      opal_output(opal_malloc_output, "Invalid free (%s, %d)", file, line);    } else {      free(addr);    }}

⌨️ 快捷键说明

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