/src/racket/sgc/test.c

http://github.com/gmarceau/PLT · C · 127 lines · 99 code · 26 blank · 2 comment · 16 complexity · 8841ff83f7261805366213f8afbb20ae MD5 · raw file

  1. #include <sys/types.h>
  2. #include "sgc.h"
  3. void *x;
  4. void *y;
  5. void work()
  6. {
  7. char *v, *w;
  8. x = (char *)GC_malloc(20);
  9. y = (char *)GC_malloc(2000);
  10. v = (char *)GC_malloc(2);
  11. GC_gcollect();
  12. v[0] = 0;
  13. v = (char *)GC_malloc(10);
  14. GC_gcollect();
  15. v[0] = 0;
  16. v = (char *)GC_malloc(10000);
  17. w = (char *)GC_malloc(11000);
  18. GC_gcollect();
  19. v[0] = 0;
  20. v = (char *)GC_malloc(10);
  21. GC_gcollect();
  22. v[0] = 0;
  23. w[0] = 0;
  24. }
  25. typedef struct Chained
  26. {
  27. struct Chained *next;
  28. int data[1];
  29. } Chained;
  30. #define MAX_C_SIZE 70
  31. #define CHAIN_DEPTH 100
  32. #define NUM_REPEATS 10
  33. #define CHAINS_AS_LOCAL 1
  34. #if !CHAINS_AS_LOCAL
  35. Chained *chains[MAX_C_SIZE];
  36. #endif
  37. work2()
  38. {
  39. int broken = 15;
  40. int i, j, k, l;
  41. #if CHAINS_AS_LOCAL
  42. Chained *chains[MAX_C_SIZE];
  43. #endif
  44. #if !CHAINS_AS_LOCAL
  45. GC_add_roots((void *)chains, ((char *)chains) + sizeof(chains) + 1);
  46. #endif
  47. printf("chains at %lx\n", (long)chains);
  48. for (l = NUM_REPEATS; l--; ) {
  49. printf("cycle: %d\n", NUM_REPEATS - l);
  50. for (i = 0; i < MAX_C_SIZE; i++)
  51. chains[i] = 0L;
  52. if (l & 1) {
  53. /* Same size together: */
  54. for (i = 0; i < MAX_C_SIZE; i++) {
  55. for (k = CHAIN_DEPTH; k--; ) {
  56. Chained *c;
  57. c = (Chained *)GC_malloc(sizeof(Chained) + (i - 1) * sizeof(int));
  58. for (j = 0; j < i; j++) {
  59. c->data[j] = i;
  60. }
  61. c->next = chains[i];
  62. chains[i] = c;
  63. }
  64. }
  65. } else {
  66. /* Sizes shuffled: */
  67. for (k = CHAIN_DEPTH; k--; ) {
  68. for (i = 0; i < MAX_C_SIZE; i++) {
  69. Chained *c;
  70. c = (Chained *)GC_malloc(sizeof(Chained) + (i - 1) * sizeof(int));
  71. for (j = 0; j < i; j++) {
  72. c->data[j] = i;
  73. }
  74. c->next = chains[i];
  75. chains[i] = c;
  76. }
  77. }
  78. }
  79. for (i = 0; i < MAX_C_SIZE; i++) {
  80. Chained *c;
  81. c = chains[i];
  82. for (k = CHAIN_DEPTH; k--; c = c->next) {
  83. for (j = 0; j < i; j++)
  84. if (c->data[j] != i) {
  85. printf("broken: %d[%d][%d] = %d\n", i, (CHAIN_DEPTH - k), j, c->data[j]);
  86. if (!(broken--))
  87. return;
  88. }
  89. }
  90. }
  91. }
  92. }
  93. main()
  94. {
  95. int dummy;
  96. GC_set_stack_base((void *)&dummy);
  97. GC_add_roots((void *)&y, ((char *)&y) + sizeof(y) + 1);
  98. GC_add_roots((void *)&x, ((char *)&x) + sizeof(x) + 1);
  99. work();
  100. work2();
  101. }