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

📄 slp_xmalloc.c

📁 SLP协议在linux下的实现。此版本为1.2.1版。官方网站为www.openslp.org
💻 C
字号:
/***************************************************************************//*                                                                         *//* Project:     OpenSLP - OpenSource implementation of Service Location    *//*              Protocol                                                   *//*                                                                         *//* File:        slp_xmalloc.h                                              *//*                                                                         *//* Abstract:    Debug memory allocator                                     *//*                                                                         *//*-------------------------------------------------------------------------*//*                                                                         *//*     Please submit patches to http://www.openslp.org                     *//*                                                                         *//*-------------------------------------------------------------------------*//*                                                                         *//* Copyright (C) 2000 Caldera Systems, Inc                                 *//* All rights reserved.                                                    *//*                                                                         *//* Redistribution and use in source and binary forms, with or without      *//* modification, are permitted provided that the following conditions are  *//* met:                                                                    */ /*                                                                         *//*      Redistributions of source code must retain the above copyright     *//*      notice, this list of conditions and the following disclaimer.      *//*                                                                         *//*      Redistributions in binary form must reproduce the above copyright  *//*      notice, this list of conditions and the following disclaimer in    *//*      the documentation and/or other materials provided with the         *//*      distribution.                                                      *//*                                                                         *//*      Neither the name of Caldera Systems nor the names of its           *//*      contributors may be used to endorse or promote products derived    *//*      from this software without specific prior written permission.      *//*                                                                         *//* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS     *//* `AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT      *//* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR   *//* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CALDERA      *//* SYSTEMS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *//* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT        *//* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE,  *//* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON       *//* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *//* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE   *//* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.    *//*                                                                         *//***************************************************************************/#ifdef DEBUG#include "slp_xmalloc.h"/*=========================================================================*/SLPList G_xmalloc_list = {0,0,0};FILE*   G_xmalloc_fh = 0;size_t  G_xmalloc_freemem = 0;size_t  G_xmalloc_allocmem = 0;/*=========================================================================*//*-------------------------------------------------------------------------*/void _xmalloc_log(xallocation_t* x)/*-------------------------------------------------------------------------*/{    size_t i;    if(G_xmalloc_fh)    {           fprintf(G_xmalloc_fh,"xmalloced memory:\n");        fprintf(G_xmalloc_fh,"   x->where = %s\n",x->where);        fprintf(G_xmalloc_fh,"   x->size  = %i\n",x->size);        fprintf(G_xmalloc_fh,"   x->buf   = %p  {",x->buf);        for (i=0;i<x->size && i < SLPXMALLOC_MAX_BUF_LOG_LEN;i++)        {            fprintf(G_xmalloc_fh,"%c",((char*)(x->buf))[i]);        }        fprintf(G_xmalloc_fh,"}\n");    }}/*-------------------------------------------------------------------------*/xallocation_t* _xmalloc_find(void* buf)/*-------------------------------------------------------------------------*/{    xallocation_t* x;         x = (xallocation_t*)G_xmalloc_list.head;    while(x)    {        if(x->buf == buf)        {            break;        }        x = (xallocation_t*)(x->listitem.next);    }    return x;}/*=========================================================================*/void* _xmalloc(const char* file,               int line,               size_t size)/*=========================================================================*/{    xallocation_t* x;    if(G_xmalloc_freemem &&       G_xmalloc_allocmem + size > G_xmalloc_freemem)    {        if(G_xmalloc_fh)        {            fprintf(G_xmalloc_fh,"\n*** Simulating out of memory error ***\n\n");        }        return NULL;    }    x = malloc(sizeof(xallocation_t));    if(x == NULL)    {        if(G_xmalloc_fh)        {            fprintf(G_xmalloc_fh,"\n*** Real out of memory error ***\n\n");        }        return NULL;    }    x->buf = malloc(size);    if(x->buf == NULL)    {        if(G_xmalloc_fh)        {            fprintf(G_xmalloc_fh,"\n*** Real out of memory error ***\n\n");        }        return NULL;    }    SLPListLinkTail(&G_xmalloc_list, (SLPListItem*)x);    x->size = size;    snprintf(x->where,SLPXMALLOC_MAX_WHERE_LEN,"%s:%i",file,line);    G_xmalloc_allocmem += size;    if(G_xmalloc_fh)    {        fprintf(G_xmalloc_fh,"Called xmalloc() %s:%i ",file,line);        _xmalloc_log(x);    }            return x->buf;}/*=========================================================================*/void _xfree(const char* file,            int line,            void* buf)/*=========================================================================*/{    xallocation_t* x;         x =_xmalloc_find(buf);    if(x == NULL)    {        if(G_xmalloc_fh)        {            fprintf(G_xmalloc_fh,                     "*** xfree called on non xmalloced memory ***\n");        }        return;    }    if(G_xmalloc_fh)    {        fprintf(G_xmalloc_fh,"Called xfree() %s:%i ",file,line);        _xmalloc_log(x);    }        G_xmalloc_allocmem -= x->size;        free(x->buf);        free(SLPListUnlink(&G_xmalloc_list, (SLPListItem*)x));}/*=========================================================================*/void* _xrealloc(const char* file,                int line,                void* buf,                 size_t size)/*=========================================================================*/{    xallocation_t* x;    if(G_xmalloc_freemem &&       G_xmalloc_allocmem + size > G_xmalloc_freemem)    {        if(G_xmalloc_fh)        {            fprintf(G_xmalloc_fh,"\n*** Simulating out of memory error ***\n\n");        }        return NULL;    }    if(buf)    {        x =_xmalloc_find(buf);        if(x == NULL)        {            if(G_xmalloc_fh)            {                fprintf(G_xmalloc_fh,                         "*** xrealloc called on non xmalloced memory ***\n");            }                return NULL;        }        G_xmalloc_allocmem -= x->size;    }    else    {        x = malloc(sizeof(xallocation_t));        if(x == NULL)        {            if(G_xmalloc_fh)            {                fprintf(G_xmalloc_fh,"\n*** Real out of memory error ***\n\n");            }            return NULL;        }                SLPListLinkTail(&G_xmalloc_list, (SLPListItem*)x);    }    x->buf = realloc(buf,size);    if(x->buf == NULL)    {        if(G_xmalloc_fh)        {            fprintf(G_xmalloc_fh,"\n*** Real out of memory error ***\n\n");        }        return NULL;    }    snprintf(x->where,SLPXMALLOC_MAX_WHERE_LEN,"%s:%i",file,line);    x->size = size;        G_xmalloc_allocmem += size;    if(G_xmalloc_fh)    {        fprintf(G_xmalloc_fh,"Called xrealloc() %s:%i ", file, line);        _xmalloc_log(x);    }        return x->buf;}                     /*=========================================================================*/char* _xstrdup(const char* file,               int line,               const char* str)/*=========================================================================*/{    xallocation_t* x;    size_t strlength = strlen(str);    if(G_xmalloc_freemem &&       G_xmalloc_allocmem + strlength > G_xmalloc_freemem)    {        if(G_xmalloc_fh)        {            fprintf(G_xmalloc_fh,"\n*** Simulating out of memory error ***\n\n");        }        return NULL;    }    x = malloc(sizeof(xallocation_t));    if(x == NULL)    {        if(G_xmalloc_fh)        {            fprintf(G_xmalloc_fh,"\n*** Real out of memory error ***\n\n");        }        return NULL;    }    x->buf = strdup(str);    if(x->buf == NULL)    {        if(G_xmalloc_fh)        {            fprintf(G_xmalloc_fh,"\n*** Real out of memory error ***\n\n");        }        return NULL;    }    x->size = strlength;    snprintf(x->where,SLPXMALLOC_MAX_WHERE_LEN,"%s:%i",file,line);    G_xmalloc_allocmem += strlength;    if(G_xmalloc_fh)    {        fprintf(G_xmalloc_fh,"Called xstrdup() %s:%i ",file,line);        _xmalloc_log(x);    }        SLPListLinkTail(&G_xmalloc_list, (SLPListItem*)x);    return (char*)x->buf;}/*=========================================================================*/int xmalloc_init(const char* filename, size_t freemem)/*=========================================================================*/{    G_xmalloc_fh = fopen(filename, "w");    if(G_xmalloc_fh)    {        return 0;    }    G_xmalloc_freemem = freemem;    return 1;}/*=========================================================================*/int xmalloc_report()/*=========================================================================*/{    xallocation_t* x;    if(G_xmalloc_fh)    {        fprintf(G_xmalloc_fh,                 "\n*** Start of xmalloc_report ***\n");    }    x = (xallocation_t*)G_xmalloc_list.head;    while(x)    {        _xmalloc_log(x);        x = (xallocation_t*)(x->listitem.next);;    }    if(G_xmalloc_fh)    {	fprintf(G_xmalloc_fh, 		"*** End of xmalloc_report ***\n\n");    }    return 0;}/*=========================================================================*/void xmalloc_deinit()/*=========================================================================*/{    xmalloc_report();    if(G_xmalloc_fh)    {        fclose(G_xmalloc_fh);        G_xmalloc_fh = NULL;    }    while(G_xmalloc_list.count)    {        free((xallocation_t*)SLPListUnlink(&G_xmalloc_list,G_xmalloc_list.head));    }    memset(&G_xmalloc_list,0,sizeof(G_xmalloc_list));}#endif

⌨️ 快捷键说明

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