00001 /* $Id: memory.c,v 1.1.1.1 2004/12/23 04:05:14 ellson Exp $ $Revision: 1.1.1.1 $ */ 00002 /* vim:set shiftwidth=4 ts=8: */ 00003 00004 /********************************************************** 00005 * This software is part of the graphviz package * 00006 * http://www.graphviz.org/ * 00007 * * 00008 * Copyright (c) 1994-2004 AT&T Corp. * 00009 * and is licensed under the * 00010 * Common Public License, Version 1.0 * 00011 * by AT&T Corp. * 00012 * * 00013 * Information and Software Systems Research * 00014 * AT&T Research, Florham Park NJ * 00015 **********************************************************/ 00016 00017 #include "geometry.h" 00018 #include "render.h" 00019 00020 typedef struct freenode { 00021 struct freenode *nextfree; 00022 } Freenode; 00023 00024 typedef struct freeblock { 00025 struct freeblock *next; 00026 struct freenode *nodes; 00027 } Freeblock; 00028 00029 #include "mem.h" 00030 #include <stdlib.h> 00031 #include <stdio.h> 00032 00033 static int gcd(int y, int x) 00034 { 00035 while (x != y) { 00036 if (y < x) 00037 x = x - y; 00038 else 00039 y = y - x; 00040 } 00041 return x; 00042 } 00043 00044 #define LCM(x,y) ((x)%(y) == 0 ? (x) : (y)%(x) == 0 ? (y) : x*(y/gcd(x,y))) 00045 00046 void freeinit(Freelist * fl, int size) 00047 { 00048 00049 fl->head = NULL; 00050 fl->nodesize = LCM(size, sizeof(Freenode)); 00051 if (fl->blocklist != NULL) { 00052 Freeblock *bp, *np; 00053 00054 bp = fl->blocklist; 00055 while (bp != NULL) { 00056 np = bp->next; 00057 free(bp->nodes); 00058 free(bp); 00059 bp = np; 00060 } 00061 } 00062 fl->blocklist = NULL; 00063 } 00064 00065 void *getfree(Freelist * fl) 00066 { 00067 int i; 00068 Freenode *t; 00069 Freeblock *mem; 00070 00071 if (fl->head == NULL) { 00072 int size = fl->nodesize; 00073 char *cp; 00074 00075 mem = GNEW(Freeblock); 00076 mem->nodes = gmalloc(sqrt_nsites * size); 00077 cp = (char *) (mem->nodes); 00078 for (i = 0; i < sqrt_nsites; i++) { 00079 makefree(cp + i * size, fl); 00080 } 00081 mem->next = fl->blocklist; 00082 fl->blocklist = mem; 00083 } 00084 t = fl->head; 00085 fl->head = t->nextfree; 00086 return ((void *) t); 00087 } 00088 00089 void makefree(void *curr, Freelist * fl) 00090 { 00091 ((Freenode *) curr)->nextfree = fl->head; 00092 fl->head = (Freenode *) curr; 00093 }