X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fsmartall.h;h=4973f4fa255819c4a6fd5ca6ed3896bc6b08d975;hb=8944db1b635424752b455e55dfc73cf4f26860d5;hp=ad72bcedd6a8a392e50422e4a6b67363d740a101;hpb=e2d135c434c49195af083945bdb94bc670615457;p=bacula%2Fbacula diff --git a/bacula/src/lib/smartall.h b/bacula/src/lib/smartall.h index ad72bcedd6..4973f4fa25 100644 --- a/bacula/src/lib/smartall.h +++ b/bacula/src/lib/smartall.h @@ -1,52 +1,67 @@ /* + Bacula® - The Network Backup Solution - Definitions for the smart memory allocator - - Version $Id$ + Copyright (C) 2000-2010 Free Software Foundation Europe e.V. -*/ - -/* - Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version three of the GNU Affero General Public + License as published by the Free Software Foundation and included + in the file LICENSE. - 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 + 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., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + You should have received a copy of the GNU Affero General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. - */ + Bacula® is a registered trademark of Kern Sibbald. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ +/* + Definitions for the smart memory allocator -#ifdef SMARTALLOC +*/ + +#ifndef SMARTALLOC_H +#define SMARTALLOC_H + +extern uint64_t DLL_IMP_EXP sm_max_bytes; +extern uint64_t DLL_IMP_EXP sm_bytes; +extern uint32_t DLL_IMP_EXP sm_max_buffers; +extern uint32_t DLL_IMP_EXP sm_buffers; + +#ifdef SMARTALLOC +#undef SMARTALLOC +#define SMARTALLOC SMARTALLOC -typedef enum {False = 0, True = 1} Boolean; extern void *sm_malloc(const char *fname, int lineno, unsigned int nbytes), - *sm_calloc(const char *fname, int lineno, - unsigned int nelem, unsigned int elsize), - *sm_realloc(const char *fname, int lineno, void *ptr, unsigned int size), - *actuallymalloc(unsigned int size), - *actuallycalloc(unsigned int nelem, unsigned int elsize), - *actuallyrealloc(void *ptr, unsigned int size); + *sm_calloc(const char *fname, int lineno, + unsigned int nelem, unsigned int elsize), + *sm_realloc(const char *fname, int lineno, void *ptr, unsigned int size), + *actuallymalloc(unsigned int size), + *actuallycalloc(unsigned int nelem, unsigned int elsize), + *actuallyrealloc(void *ptr, unsigned int size); extern void sm_free(const char *fname, int lineno, void *fp); extern void actuallyfree(void *cp), - sm_dump(Boolean bufdump), sm_static(int mode); + sm_dump(bool bufdump, bool in_use=false), sm_static(int mode); extern void sm_new_owner(const char *fname, int lineno, char *buf); #ifdef SMCHECK -extern void sm_check(const char *fname, int lineno, Boolean bufdump); -extern int sm_check_rtn(const char *fname, int lineno, Boolean bufdump); +#define Dsm_check(lvl) if ((lvl)<=debug_level) sm_check(__FILE__, __LINE__, true) +extern void sm_check(const char *fname, int lineno, bool bufdump); +extern int sm_check_rtn(const char *fname, int lineno, bool bufdump); #else +#define Dsm_check(lvl) #define sm_check(f, l, fl) #define sm_check_rtn(f, l, fl) 1 #endif @@ -73,13 +88,92 @@ extern int sm_check_rtn(const char *fname, int lineno, Boolean bufdump); #define sm_dump(x) #define sm_static(x) #define sm_new_owner(a, b, c) -#define sm_malloc(f, l, n) malloc(n) - +#define sm_malloc(f, l, n) malloc(n) +#define sm_free(f, l, n) free(n) #define sm_check(f, l, fl) #define sm_check_rtn(f, l, fl) 1 extern void *b_malloc(); -#define malloc(x) b_malloc(__FILE__, __LINE__, (x)) +#define malloc(x) b_malloc(__FILE__, __LINE__, (x)) #endif + +#ifdef SMARTALLOC + +#define New(type) new(__FILE__, __LINE__) type + +/* We do memset(0) because it's not possible to memset a class when + * using subclass with virtual functions + */ + +class SMARTALLOC +{ +public: + +void *operator new(size_t s, const char *fname, int line) +{ + size_t size = s > sizeof(int) ? (unsigned int)s : sizeof(int); + void *p = sm_malloc(fname, line, size); + memset(p, 0, size); + return p; +} +void *operator new[](size_t s, const char *fname, int line) +{ + size_t size = s > sizeof(int) ? (unsigned int)s : sizeof(int); + void *p = sm_malloc(fname, line, size); + memset(p, 0, size); + return p; +} + +void operator delete(void *ptr) +{ + free(ptr); +} +void operator delete[](void *ptr, size_t /*i*/) +{ + free(ptr); +} + +void operator delete(void *ptr, const char * /*fname*/, int /*line*/) +{ + free(ptr); +} +void operator delete[](void *ptr, size_t /*i*/, + const char * /*fname*/, int /*line*/) +{ + free(ptr); +} + +private: +void *operator new(size_t s) throw() { (void)s; return 0; } +void *operator new[](size_t s) throw() { (void)s; return 0; } +}; + +#else + +#define New(type) new type + +class SMARTALLOC +{ + public: + void *operator new(size_t s) { + void *p = malloc(s); + memset(p, 0, s); + return p; + } + void *operator new[](size_t s) { + void *p = malloc(s); + memset(p, 0, s); + return p; + } + void operator delete(void *ptr) { + free(ptr); + } + void operator delete[](void *ptr, size_t i) { + free(ptr); + } +}; +#endif /* SMARTALLOC */ + +#endif /* !SMARTALLOC_H */