/************************************************************************ * IRC - Internet Relay Chat, ircd/ircd_alloc.c * Copyright (C) 1999 Thomas Helvey (BleepSoft) * * See file AUTHORS in IRC package for additional names of * the programmers. * * 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 1, 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. */ /** @file * @brief IRC daemon memory allocation functions. * @version $Id: ircd_alloc.c 1306 2005-01-27 04:07:46Z entrope $ */ #include "config.h" #include "ircd_alloc.h" #include "ircd_log.h" #include "ircd_string.h" #include "s_debug.h" /* #include -- Now using assert in ircd_log.h */ #include static void nomem_handler(void); /** Variable holding out-of-memory callback. */ static OutOfMemoryHandler noMemHandler = nomem_handler; /** Default handler for out-of-memory conditions. */ static void nomem_handler(void) { #ifdef MDEBUG assert(0); #else Debug((DEBUG_FATAL, "Out of memory, exiting")); exit(2); #endif } /** Set callback function for out-of-memory conditions. */ void set_nomem_handler(OutOfMemoryHandler handler) { noMemHandler = handler; } #ifndef MDEBUG /** Allocate memory. * @param[in] size Number of bytes to allocate. * @param[in] x Type of allocation (ignored). * @param[in] y Name of file doing allocation (ignored). * @param[in] z Line number doing allocation (ignored). * @return Newly allocated block of memory. */ void* DoMalloc(size_t size, const char* x, const char* y, int z) { void* t = malloc(size); if (!t) (*noMemHandler)(); return t; } /** Allocate zero-initialized memory. * @param[in] size Number of bytes to allocate. * @param[in] x Type of allocation (ignored). * @param[in] y Name of file doing allocation (ignored). * @param[in] z Line number doing allocation (ignored). * @return Newly allocated block of memory. */ void* DoMallocZero(size_t size, const char* x, const char* y, int z) { void* t = malloc(size); if (!t) (*noMemHandler)(); memset(t, 0, size); return t; } /** Resize an allocated block of memory. * @param[in] orig Original block to resize. * @param[in] size Minimum size for new block. * @param[in] file Name of file doing reallocation (ignored). * @param[in] line Line number doing reallocation (ignored). */ void* DoRealloc(void *orig, size_t size, const char *file, int line) { void* t = realloc(orig, size); if (!t) (*noMemHandler)(); return t; } #endif