/misc/src/release/graphviz-2.18-1/src/graphviz-2.18/lib/neatogen/memory.c

Go to the documentation of this file.
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 }

Generated on Mon Mar 31 19:03:24 2008 for Graphviz by  doxygen 1.5.1