[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20463] branches/soc-2007-joeedh/intern/ guardedalloc/intern/mallocn.c: bleh try to fix this file, which is different on my checkout then svn
Joseph Eagar
joeedh at gmail.com
Thu May 28 06:49:49 CEST 2009
Revision: 20463
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20463
Author: joeedh
Date: 2009-05-28 06:49:49 +0200 (Thu, 28 May 2009)
Log Message:
-----------
bleh try to fix this file, which is different on my checkout then svn
Removed Paths:
-------------
branches/soc-2007-joeedh/intern/guardedalloc/intern/mallocn.c
Deleted: branches/soc-2007-joeedh/intern/guardedalloc/intern/mallocn.c
===================================================================
--- branches/soc-2007-joeedh/intern/guardedalloc/intern/mallocn.c 2009-05-28 04:41:02 UTC (rev 20462)
+++ branches/soc-2007-joeedh/intern/guardedalloc/intern/mallocn.c 2009-05-28 04:49:49 UTC (rev 20463)
@@ -1,708 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * 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
- * 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.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * Guarded memory allocation, and boundary-write detection.
- */
-
-#include <stdlib.h>
-#include <string.h> /* memcpy */
-#include <stdarg.h>
-
-/* mmap exception */
-#if defined(AMIGA) || defined(__BeOS)
-#elif defined(WIN32)
-#include <sys/types.h>
-#include "mmap_win.h"
-#else
-#include <sys/types.h>
-#include <sys/mman.h>
-#endif
-
-#include "MEM_guardedalloc.h"
-
-/* --------------------------------------------------------------------- */
-/* local functions */
-/* --------------------------------------------------------------------- */
-
-static void addtail(volatile localListBase *listbase, void *vlink);
-static void remlink(volatile localListBase *listbase, void *vlink);
-static void rem_memblock(MemHead *memh);
-static void MemorY_ErroR(const char *block, const char *error);
-static const char *check_memlist(MemHead *memh);
-
-/* --------------------------------------------------------------------- */
-/* locally used defines */
-/* --------------------------------------------------------------------- */
-
-#if defined( __sgi) || defined (__sun) || defined (__sun__) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || (defined (__APPLE__) && !defined(__LITTLE_ENDIAN__))
-#define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
-#else
-#define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
-#endif
-
-#define MEMTAG1 MAKE_ID('M', 'E', 'M', 'O')
-#define MEMTAG2 MAKE_ID('R', 'Y', 'B', 'L')
-#define MEMTAG3 MAKE_ID('O', 'C', 'K', '!')
-#define MEMFREE MAKE_ID('F', 'R', 'E', 'E')
-
-#define MEMNEXT(x) ((MemHead *)(((char *) x) - ((char *) & (((MemHead *)0)->next))))
-
-/* --------------------------------------------------------------------- */
-/* vars */
-/* --------------------------------------------------------------------- */
-
-
-static volatile int totblock= 0;
-static volatile uintptr_t mem_in_use= 0, mmap_in_use= 0;
-
-static volatile struct localListBase _membase;
-static volatile struct localListBase *membase = &_membase;
-static void (*error_callback)(char *) = NULL;
-static void (*thread_lock_callback)(void) = NULL;
-static void (*thread_unlock_callback)(void) = NULL;
-
-static int malloc_debug_memset= 0;
-
-#ifdef malloc
-#undef malloc
-#endif
-
-#ifdef calloc
-#undef calloc
-#endif
-
-#ifdef free
-#undef free
-#endif
-
-
-/* --------------------------------------------------------------------- */
-/* implementation */
-/* --------------------------------------------------------------------- */
-
-static void print_error(const char *str, ...)
-{
- char buf[1024];
- va_list ap;
-
- va_start(ap, str);
- vsprintf(buf, str, ap);
- va_end(ap);
-
- if (error_callback) error_callback(buf);
-}
-
-static void mem_lock_thread()
-{
- if (thread_lock_callback)
- thread_lock_callback();
-}
-
-static void mem_unlock_thread()
-{
- if (thread_unlock_callback)
- thread_unlock_callback();
-}
-
-int MEM_check_memory_integrity()
-{
- const char* err_val = NULL;
- MemHead* listend;
- /* check_memlist starts from the front, and runs until it finds
- * the requested chunk. For this test, that's the last one. */
- listend = membase->last;
-
- err_val = check_memlist(listend);
-
- if (err_val == 0) return 0;
- return 1;
-}
-
-
-void MEM_set_error_callback(void (*func)(char *))
-{
- error_callback = func;
-}
-
-void MEM_set_lock_callback(void (*lock)(void), void (*unlock)(void))
-{
- thread_lock_callback = lock;
- thread_unlock_callback = unlock;
-}
-
-void MEM_set_memory_debug(void)
-{
- malloc_debug_memset= 1;
-}
-
-int MEM_allocN_len(void *vmemh)
-{
- if (vmemh) {
- MemHead *memh= vmemh;
-
- memh--;
- return memh->len;
- } else
- return 0;
-}
-
-void *MEM_dupallocN(void *vmemh)
-{
- void *newp= NULL;
-
- if (vmemh) {
- MemHead *memh= vmemh;
- memh--;
-
- if(memh->mmap)
- newp= MEM_mapallocN(memh->len, "dupli_mapalloc");
- else
- newp= MEM_mallocN(memh->len, "dupli_alloc");
-
- if (newp == NULL) return NULL;
-
- memcpy(newp, vmemh, memh->len);
- }
-
- return newp;
-}
-
-static void make_memhead_header(MemHead *memh, unsigned int len, const char *str)
-{
- MemTail *memt;
-
- memh->tag1 = MEMTAG1;
- memh->name = str;
- memh->nextname = 0;
- memh->len = len;
- memh->mmap = 0;
- memh->tag2 = MEMTAG2;
-
- memt = (MemTail *)(((char *) memh) + sizeof(MemHead) + len);
- memt->tag3 = MEMTAG3;
-
- addtail(membase,&memh->next);
- if (memh->next) memh->nextname = MEMNEXT(memh->next)->name;
-
- totblock++;
- mem_in_use += len;
-}
-
-void *MEM_mallocN(unsigned int len, const char *str)
-{
- MemHead *memh;
-
- mem_lock_thread();
-
- len = (len + 3 ) & ~3; /* allocate in units of 4 */
-
- memh= (MemHead *)malloc(len+sizeof(MemHead)+sizeof(MemTail));
-
- if(memh) {
- make_memhead_header(memh, len, str);
- mem_unlock_thread();
- if(malloc_debug_memset && len)
- memset(memh+1, 255, len);
- return (++memh);
- }
- mem_unlock_thread();
- print_error("Malloc returns nill: len=%d in %s, total %u\n",len, str, mem_in_use);
- return NULL;
-}
-
-void *MEM_callocN(unsigned int len, const char *str)
-{
- MemHead *memh;
-
- mem_lock_thread();
-
- len = (len + 3 ) & ~3; /* allocate in units of 4 */
-
- memh= (MemHead *)calloc(len+sizeof(MemHead)+sizeof(MemTail),1);
-
- if(memh) {
- make_memhead_header(memh, len, str);
- mem_unlock_thread();
- return (++memh);
- }
- mem_unlock_thread();
- print_error("Calloc returns nill: len=%d in %s, total %u\n",len, str, mem_in_use);
- return 0;
-}
-
-/* note; mmap returns zero'd memory */
-void *MEM_mapallocN(unsigned int len, const char *str)
-{
-#if defined(AMIGA) || defined(__BeOS)
- return MEM_callocN(len, str);
-#else
- MemHead *memh;
-
- mem_lock_thread();
-
- len = (len + 3 ) & ~3; /* allocate in units of 4 */
-
-#ifdef __sgi
- {
-#include <fcntl.h>
-
- int fd;
- fd = open("/dev/zero", O_RDWR);
-
- memh= mmap(0, len+sizeof(MemHead)+sizeof(MemTail),
- PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
- close(fd);
- }
-#else
- memh= mmap(0, len+sizeof(MemHead)+sizeof(MemTail),
- PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
-#endif
-
- if(memh!=(MemHead *)-1) {
- make_memhead_header(memh, len, str);
- memh->mmap= 1;
- mmap_in_use += len;
- mem_unlock_thread();
- return (++memh);
- }
- else {
- mem_unlock_thread();
- print_error("Mapalloc returns nill, fallback to regular malloc: len=%d in %s, total %u\n",len, str, mmap_in_use);
- return MEM_callocN(len, str);
- }
-#endif
-}
-
-/* Memory statistics print */
-typedef struct MemPrintBlock {
- const char *name;
- uintptr_t len;
- int items;
-} MemPrintBlock;
-
-static int compare_name(const void *p1, const void *p2)
-{
- const MemPrintBlock *pb1= (const MemPrintBlock*)p1;
- const MemPrintBlock *pb2= (const MemPrintBlock*)p2;
-
- return strcmp(pb1->name, pb2->name);
-}
-
-static int compare_len(const void *p1, const void *p2)
-{
- const MemPrintBlock *pb1= (const MemPrintBlock*)p1;
- const MemPrintBlock *pb2= (const MemPrintBlock*)p2;
-
- if(pb1->len < pb2->len)
- return 1;
- else if(pb1->len == pb2->len)
- return 0;
- else
- return -1;
-}
-
-void MEM_printmemlist_stats()
-{
- MemHead *membl;
- MemPrintBlock *pb, *printblock;
- int totpb, a, b;
-
- mem_lock_thread();
-
- /* put memory blocks into array */
- printblock= malloc(sizeof(MemPrintBlock)*totblock);
-
- pb= printblock;
- totpb= 0;
-
- membl = membase->first;
- if (membl) membl = MEMNEXT(membl);
-
- while(membl) {
- pb->name= membl->name;
- pb->len= membl->len;
- pb->items= 1;
-
- totpb++;
- pb++;
-
- if(membl->next)
- membl= MEMNEXT(membl->next);
- else break;
- }
-
- /* sort by name and add together blocks with the same name */
- qsort(printblock, totpb, sizeof(MemPrintBlock), compare_name);
- for(a=0, b=0; a<totpb; a++) {
- if(a == b) {
- continue;
- }
- else if(strcmp(printblock[a].name, printblock[b].name) == 0) {
- printblock[b].len += printblock[a].len;
- printblock[b].items++;
- }
- else {
- b++;
- memcpy(&printblock[b], &printblock[a], sizeof(MemPrintBlock));
- }
- }
- totpb= b+1;
-
- /* sort by length and print */
- qsort(printblock, totpb, sizeof(MemPrintBlock), compare_len);
- printf("\ntotal memory len: %.3f MB\n", (double)mem_in_use/(double)(1024*1024));
- for(a=0, pb=printblock; a<totpb; a++, pb++)
- printf("%s items: %d, len: %.3f MB\n", pb->name, pb->items, (double)pb->len/(double)(1024*1024));
-
- free(printblock);
-
- mem_unlock_thread();
-}
-
-/* Prints in python syntax for easy */
-static void MEM_printmemlist_internal( int pydict )
-{
- MemHead *membl;
-
- mem_lock_thread();
-
- membl = membase->first;
- if (membl) membl = MEMNEXT(membl);
-
- if (pydict) {
- print_error("# membase_debug.py\n");
- print_error("membase = [\\\n");
- }
- while(membl) {
- if (pydict) {
- fprintf(stderr, "{'len':%i, 'name':'''%s''', 'pointer':'%p'},\\\n", membl->len, membl->name, membl+1);
- } else {
- print_error("%s len: %d %p\n",membl->name,membl->len, membl+1);
- }
- if(membl->next)
- membl= MEMNEXT(membl->next);
- else break;
- }
- if (pydict) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list