X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=pdf%2Fgoo%2Fgmem.c;h=27ebb2b6ec9e0d6774b4c6854602e6bc611e9851;hb=refs%2Ftags%2FXPDF_2_01;hp=4ae54812367ae50c0a5e0acdcd47f6b4daf92900;hpb=d9f9a6449f377b4c933b75d57541b19c6d088994;p=evince.git diff --git a/pdf/goo/gmem.c b/pdf/goo/gmem.c index 4ae54812..27ebb2b6 100644 --- a/pdf/goo/gmem.c +++ b/pdf/goo/gmem.c @@ -3,9 +3,10 @@ * * Memory routines with out-of-memory checking. * - * Copyright 1996 Derek B. Noonburg + * Copyright 1996-2002 Glyph & Cog, LLC */ +#include #include #include #include @@ -13,6 +14,7 @@ #include "gmem.h" #ifdef DEBUG_MEM + typedef struct _GMemHdr { int size; int index; @@ -23,28 +25,42 @@ typedef struct _GMemHdr { #define gMemTrlSize (sizeof(long)) #if gmemTrlSize==8 -#define gMemDeadVal 0xdeadbeefdeadbeef +#define gMemDeadVal 0xdeadbeefdeadbeefUL #else -#define gMemDeadVal 0xdeadbeef +#define gMemDeadVal 0xdeadbeefUL +#endif /* round data size so trailer will be aligned */ #define gMemDataSize(size) \ ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize) -#endif +#define gMemNLists 64 +#define gMemListShift 4 +#define gMemListMask (gMemNLists - 1) +static GMemHdr *gMemList[gMemNLists] = { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; -static GMemHdr *gMemList = NULL; static int gMemIndex = 0; static int gMemAlloc = 0; -#endif + +#endif /* DEBUG_MEM */ void *gmalloc(int size) { -#if DEBUG_MEM +#ifdef DEBUG_MEM int size1; char *mem; GMemHdr *hdr; void *data; - long *trl, *p; + int lst; + unsigned long *trl, *p; if (size == 0) return NULL; @@ -55,13 +71,14 @@ void *gmalloc(int size) { } hdr = (GMemHdr *)mem; data = (void *)(mem + gMemHdrSize); - trl = (long *)(mem + gMemHdrSize + size1); + trl = (unsigned long *)(mem + gMemHdrSize + size1); hdr->size = size; hdr->index = gMemIndex++; - hdr->next = gMemList; - gMemList = hdr; + lst = ((int)hdr >> gMemListShift) & gMemListMask; + hdr->next = gMemList[lst]; + gMemList[lst] = hdr; ++gMemAlloc; - for (p = (long *)data; p <= trl; ++p) + for (p = (unsigned long *)data; p <= trl; ++p) *p = gMemDeadVal; return data; #else @@ -78,7 +95,7 @@ void *gmalloc(int size) { } void *grealloc(void *p, int size) { -#if DEBUG_MEM +#ifdef DEBUG_MEM GMemHdr *hdr; void *q; int oldSize; @@ -123,11 +140,13 @@ void gfree(void *p) { int size; GMemHdr *hdr; GMemHdr *prevHdr, *q; - long *trl, *clr; + int lst; + unsigned long *trl, *clr; if (p) { hdr = (GMemHdr *)((char *)p - gMemHdrSize); - for (prevHdr = NULL, q = gMemList; q; prevHdr = q, q = q->next) { + lst = ((int)hdr >> gMemListShift) & gMemListMask; + for (prevHdr = NULL, q = gMemList[lst]; q; prevHdr = q, q = q->next) { if (q == hdr) break; } @@ -135,15 +154,15 @@ void gfree(void *p) { if (prevHdr) prevHdr->next = hdr->next; else - gMemList = hdr->next; + gMemList[lst] = hdr->next; --gMemAlloc; size = gMemDataSize(hdr->size); - trl = (long *)((char *)hdr + gMemHdrSize + size); + trl = (unsigned long *)((char *)hdr + gMemHdrSize + size); if (*trl != gMemDeadVal) { fprintf(stderr, "Overwrite past end of block %d at address %p\n", hdr->index, p); } - for (clr = (long *)hdr; clr <= trl; ++clr) + for (clr = (unsigned long *)hdr; clr <= trl; ++clr) *clr = gMemDeadVal; free(hdr); } else { @@ -159,14 +178,17 @@ void gfree(void *p) { #ifdef DEBUG_MEM void gMemReport(FILE *f) { GMemHdr *p; + int lst; fprintf(f, "%d memory allocations in all\n", gMemIndex); if (gMemAlloc > 0) { fprintf(f, "%d memory blocks left allocated:\n", gMemAlloc); fprintf(f, " index size\n"); fprintf(f, "-------- --------\n"); - for (p = gMemList; p; p = p->next) - fprintf(f, "%8d %8d\n", p->index, p->size); + for (lst = 0; lst < gMemNLists; ++lst) { + for (p = gMemList[lst]; p; p = p->next) + fprintf(f, "%8d %8d\n", p->index, p->size); + } } else { fprintf(f, "No memory blocks left allocated\n"); }