|
Graphviz
2.29.20120524.0446
|
00001 /* $Id$ $Revision$ */ 00002 /* vim:set shiftwidth=4 ts=8: */ 00003 00004 /************************************************************************* 00005 * Copyright (c) 2011 AT&T Intellectual Property 00006 * All rights reserved. This program and the accompanying materials 00007 * are made available under the terms of the Eclipse Public License v1.0 00008 * which accompanies this distribution, and is available at 00009 * http://www.eclipse.org/legal/epl-v10.html 00010 * 00011 * Contributors: See CVS logs. Details at http://www.graphviz.org/ 00012 *************************************************************************/ 00013 00014 #include "geometry.h" 00015 #include "render.h" 00016 00017 typedef struct freenode { 00018 struct freenode *nextfree; 00019 } Freenode; 00020 00021 typedef struct freeblock { 00022 struct freeblock *next; 00023 struct freenode *nodes; 00024 } Freeblock; 00025 00026 #include "mem.h" 00027 #include <stdlib.h> 00028 #include <stdio.h> 00029 00030 static int gcd(int y, int x) 00031 { 00032 while (x != y) { 00033 if (y < x) 00034 x = x - y; 00035 else 00036 y = y - x; 00037 } 00038 return x; 00039 } 00040 00041 #define LCM(x,y) ((x)%(y) == 0 ? (x) : (y)%(x) == 0 ? (y) : x*(y/gcd(x,y))) 00042 00043 void freeinit(Freelist * fl, int size) 00044 { 00045 00046 fl->head = NULL; 00047 fl->nodesize = LCM(size, sizeof(Freenode)); 00048 if (fl->blocklist != NULL) { 00049 Freeblock *bp, *np; 00050 00051 bp = fl->blocklist; 00052 while (bp != NULL) { 00053 np = bp->next; 00054 free(bp->nodes); 00055 free(bp); 00056 bp = np; 00057 } 00058 } 00059 fl->blocklist = NULL; 00060 } 00061 00062 void *getfree(Freelist * fl) 00063 { 00064 int i; 00065 Freenode *t; 00066 Freeblock *mem; 00067 00068 if (fl->head == NULL) { 00069 int size = fl->nodesize; 00070 char *cp; 00071 00072 mem = GNEW(Freeblock); 00073 mem->nodes = gmalloc(sqrt_nsites * size); 00074 cp = (char *) (mem->nodes); 00075 for (i = 0; i < sqrt_nsites; i++) { 00076 makefree(cp + i * size, fl); 00077 } 00078 mem->next = fl->blocklist; 00079 fl->blocklist = mem; 00080 } 00081 t = fl->head; 00082 fl->head = t->nextfree; 00083 return ((void *) t); 00084 } 00085 00086 void makefree(void *curr, Freelist * fl) 00087 { 00088 ((Freenode *) curr)->nextfree = fl->head; 00089 fl->head = (Freenode *) curr; 00090 }
1.7.5