memory.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*************************************************************************
  2. * Copyright (c) 2011 AT&T Intellectual Property
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * https://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors: Details at https://graphviz.org
  9. *************************************************************************/
  10. #include <neatogen/geometry.h>
  11. #include <common/render.h>
  12. #include <util/alloc.h>
  13. typedef struct freenode {
  14. struct freenode *nextfree;
  15. } Freenode;
  16. typedef struct freeblock {
  17. struct freeblock *next;
  18. struct freenode *nodes;
  19. } Freeblock;
  20. #include <neatogen/mem.h>
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. static int gcd(int y, int x)
  24. {
  25. while (x != y) {
  26. if (y < x)
  27. x = x - y;
  28. else
  29. y = y - x;
  30. }
  31. return x;
  32. }
  33. #define LCM(x,y) ((x)%(y) == 0 ? (x) : (y)%(x) == 0 ? (y) : x*(y/gcd(x,y)))
  34. void freeinit(Freelist * fl, int size)
  35. {
  36. fl->head = NULL;
  37. fl->nodesize = LCM(size, sizeof(Freenode));
  38. if (fl->blocklist != NULL) {
  39. Freeblock *bp, *np;
  40. bp = fl->blocklist;
  41. while (bp != NULL) {
  42. np = bp->next;
  43. free(bp->nodes);
  44. free(bp);
  45. bp = np;
  46. }
  47. }
  48. fl->blocklist = NULL;
  49. }
  50. void *getfree(Freelist * fl)
  51. {
  52. int i;
  53. Freenode *t;
  54. if (fl->head == NULL) {
  55. int size = fl->nodesize;
  56. char *cp;
  57. Freeblock *mem = gv_alloc(sizeof(Freeblock));
  58. mem->nodes = gv_calloc(sqrt_nsites, size);
  59. cp = (char *) (mem->nodes);
  60. for (i = 0; i < sqrt_nsites; i++) {
  61. makefree(cp + i * size, fl);
  62. }
  63. mem->next = fl->blocklist;
  64. fl->blocklist = mem;
  65. }
  66. t = fl->head;
  67. fl->head = t->nextfree;
  68. return t;
  69. }
  70. void makefree(void *curr, Freelist * fl)
  71. {
  72. ((Freenode *) curr)->nextfree = fl->head;
  73. fl->head = curr;
  74. }