Line data Source code
1 : /* zmalloc - total amount of allocated memory aware version of malloc() 2 : * 3 : * Copyright (c) 2006-2009, Salvatore Sanfilippo <antirez at gmail dot com> 4 : * All rights reserved. 5 : * 6 : * Redistribution and use in source and binary forms, with or without 7 : * modification, are permitted provided that the following conditions are met: 8 : * 9 : * * Redistributions of source code must retain the above copyright notice, 10 : * this list of conditions and the following disclaimer. 11 : * * Redistributions in binary form must reproduce the above copyright 12 : * notice, this list of conditions and the following disclaimer in the 13 : * documentation and/or other materials provided with the distribution. 14 : * * Neither the name of Redis nor the names of its contributors may be used 15 : * to endorse or promote products derived from this software without 16 : * specific prior written permission. 17 : * 18 : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 : * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 : * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 22 : * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 : * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 : * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 : * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 : * POSSIBILITY OF SUCH DAMAGE. 29 : */ 30 : 31 : #include <stdlib.h> 32 : #include <string.h> 33 : 34 : static size_t used_memory = 0; 35 : 36 8 : void *zmalloc(size_t size) { 37 8 : void *ptr = malloc(size+sizeof(size_t)); 38 : 39 8 : *((size_t*)ptr) = size; 40 8 : used_memory += size+sizeof(size_t); 41 8 : return ptr+sizeof(size_t); 42 : } 43 : 44 0 : void *zrealloc(void *ptr, size_t size) { 45 : void *realptr; 46 : size_t oldsize; 47 : void *newptr; 48 : 49 0 : if (ptr == NULL) return zmalloc(size); 50 0 : realptr = ptr-sizeof(size_t); 51 0 : oldsize = *((size_t*)realptr); 52 0 : newptr = realloc(realptr,size+sizeof(size_t)); 53 0 : if (!newptr) return NULL; 54 : 55 0 : *((size_t*)newptr) = size; 56 0 : used_memory -= oldsize; 57 0 : used_memory += size; 58 0 : return newptr+sizeof(size_t); 59 : } 60 : 61 8 : void zfree(void *ptr) { 62 : void *realptr; 63 : size_t oldsize; 64 : 65 8 : if (ptr == NULL) return; 66 8 : realptr = ptr-sizeof(size_t); 67 8 : oldsize = *((size_t*)realptr); 68 8 : used_memory -= oldsize+sizeof(size_t); 69 8 : free(realptr); 70 : } 71 : 72 0 : char *zstrdup(const char *s) { 73 0 : size_t l = strlen(s)+1; 74 0 : char *p = zmalloc(l); 75 : 76 0 : memcpy(p,s,l); 77 0 : return p; 78 : } 79 : 80 0 : size_t zmalloc_used_memory(void) { 81 0 : return used_memory; 82 : }