source: git/Singular/mmtables.c @ d6681d

spielwiese
Last change on this file since d6681d was d6681d, checked in by Olaf Bachmann <obachman@…>, 25 years ago
* automatic_gc git-svn-id: file:///usr/local/Singular/svn/trunk@3795 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 4.6 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: mmtables.c,v 1.6 1999-10-26 15:06:12 obachman Exp $ */
5
6/*
7* ABSTRACT:
8*/
9
10#define _POSIX_SOURCE 1
11
12#ifdef GENERATE_INDEX_TABLE
13
14#include <stdio.h>
15#include <stdlib.h>
16#include <string.h>
17#include "mod2.h"
18#include "mmemory.h"
19#include "mmprivate.h"
20#include "mmpage.h"
21
22#define MAX_INDEX ((MAX_BLOCK_SIZE - 1) >> 2)
23
24#ifdef ALIGN_8
25
26/* make sure these are all divisible by 8 */
27#define HALF_MAX_BLOCK_SIZE (((MAX_BLOCK_SIZE) / 16)*8)
28#define QUARTER_MAX_BLOCK_SIZE (((MAX_BLOCK_SIZE) / 32)*8)
29#define EIGHTS_MAX_BLOCK_SIZE (((MAX_BLOCK_SIZE) / 64)*8)
30
31const size_t mm_mcbSizesAlign [] = 
32{   8,  16,  24,  32,
33    40,  48,  56,  64,
34    80,  96, 112, 128,
35    160, 192, 224, 
36    QUARTER_MAX_BLOCK_SIZE,
37    QUARTER_MAX_BLOCK_SIZE + EIGHTS_MAX_BLOCK_SIZE,
38    HALF_MAX_BLOCK_SIZE, 
39    HALF_MAX_BLOCK_SIZE + EIGHTS_MAX_BLOCK_SIZE,
40    HALF_MAX_BLOCK_SIZE + QUARTER_MAX_BLOCK_SIZE,
41    HALF_MAX_BLOCK_SIZE + QUARTER_MAX_BLOCK_SIZE + EIGHTS_MAX_BLOCK_SIZE,
42    MAX_BLOCK_SIZE};
43
44#else
45
46#define HALF_MAX_BLOCK_SIZE (((MAX_BLOCK_SIZE) / 8)*4)
47#define QUARTER_MAX_BLOCK_SIZE (((MAX_BLOCK_SIZE) / 16)*4)
48#define EIGHTS_MAX_BLOCK_SIZE (((MAX_BLOCK_SIZE) / 32)*4)
49
50const size_t mm_mcbSizesAlign [] = 
51{   8,  12,  16,  20,
52    24,  28,  32,
53    40,  48,  56,  64,
54    80,  96, 112, 128,
55    160, 192, 224, 
56    QUARTER_MAX_BLOCK_SIZE,
57    QUARTER_MAX_BLOCK_SIZE + EIGHTS_MAX_BLOCK_SIZE,
58    HALF_MAX_BLOCK_SIZE, 
59    HALF_MAX_BLOCK_SIZE + EIGHTS_MAX_BLOCK_SIZE,
60    HALF_MAX_BLOCK_SIZE + QUARTER_MAX_BLOCK_SIZE,
61    HALF_MAX_BLOCK_SIZE + QUARTER_MAX_BLOCK_SIZE + EIGHTS_MAX_BLOCK_SIZE,
62    MAX_BLOCK_SIZE};
63
64#endif
65
66
67int GetIndex(size_t size, const size_t* size_table)
68{
69  int i;
70
71  if (size > MAX_BLOCK_SIZE)
72  {
73    printf("GetIndex: %d size is too large\n", size);
74    exit(1);
75  }
76
77  for (i=0; size_table[i] < size; i++)
78  {};
79
80  return i;
81}
82
83
84void mmInitIndexTable(char* index_table, const size_t* size_table)
85{
86  unsigned int i;
87
88  /* Fill in IndexTable */
89  for (i=0; i<=MAX_INDEX; i++)
90    index_table[i] = GetIndex((size_t) i*4 + 1, size_table);
91}
92
93void OutputIndexTable(char* index_table)
94{
95  int i;
96  int l=0;
97  printf("const char mm_IndexTable[/*%d*/] = {\n",MAX_INDEX+1);
98  for (i=0;i<MAX_INDEX; i++,l++)
99  {
100    printf("%d,", index_table[i]);
101    if (l==15) { printf("\n"); l=0; }
102  }
103  printf("%d};\n", index_table[MAX_INDEX]);
104}
105
106void OutputTheListTable(const size_t *mm_mcbSizes)
107{
108  int i;
109  printf("struct sip_memHeap mm_theList[] = {\n");
110  printf("#ifndef MDEBUG\n");
111  for (i=0;  mm_mcbSizes[i] < MAX_BLOCK_SIZE; i++)
112  {
113#ifndef HAVE_AUTOMATIC_GC
114    printf("{NULL, NULL, NULL, %d},\n", mm_mcbSizes[i]);
115#else
116    printf("{mmZeroPage, NULL, %d, %d},\n", mm_mcbSizes[i], 
117           SIZE_OF_HEAP_PAGE/mm_mcbSizes[i]);
118#endif
119  }
120#ifndef HAVE_AUTOMATIC_GC
121    printf("{NULL, NULL, NULL, %d}\n};\n", mm_mcbSizes[i]);
122#else
123    printf("{mmZeroPage, NULL, %d, %d}\n};\n", mm_mcbSizes[i], 
124           SIZE_OF_HEAP_PAGE/mm_mcbSizes[i]);
125#endif
126  printf("#else /* MDEBUG */\n");
127  for (i=0; mm_mcbSizes[i] < MAX_BLOCK_SIZE; i++)
128  {
129#ifndef HAVE_AUTOMATIC_GC
130    printf("{NULL, NULL, NULL, %d},\n", RealSizeFromSize(mm_mcbSizes[i]));
131#else
132    printf("{mmZeroPage, NULL, %d, %d},\n", RealSizeFromSize(mm_mcbSizes[i]), 
133           SIZE_OF_HEAP_PAGE/RealSizeFromSize(mm_mcbSizes[i]));
134#endif
135  }
136#ifndef HAVE_AUTOMATIC_GC
137  printf("{NULL, NULL, NULL, %d}\n};\n", RealSizeFromSize(mm_mcbSizes[i]));
138#else
139  printf("{mmZeroPage, NULL, %d, %d}\n};\n", RealSizeFromSize(mm_mcbSizes[i]), 
140           SIZE_OF_HEAP_PAGE/RealSizeFromSize(mm_mcbSizes[i]));
141#endif
142  printf("#endif /* ! MDEBUG */\n");
143}
144 
145void OutputSizeTable( const size_t *mm_mcbSizes)
146{
147  int i;
148  printf("const size_t mm_mcbSizes[] = {");
149  for (i=0; mm_mcbSizes[i] < MAX_BLOCK_SIZE; i++)
150    printf("%d, ",  mm_mcbSizes[i]);
151  printf("%d};\n",  mm_mcbSizes[i]);
152}
153 
154int main()
155{
156  char mm_IndiciesAlign[MAX_INDEX + 1];
157  mmInitIndexTable(mm_IndiciesAlign, mm_mcbSizesAlign);
158
159  printf("#ifndef MM_TABLES_INC\n#define MM_TABLES_INC\n");
160  printf("
161#include \"mod2.h\"
162#include \"mmemory.h\"
163#include \"mmprivate.h\"
164");
165  printf("\n\n");
166#ifdef HAVE_AUTOMATIC_GC
167  printf("struct sip_memHeapPage mmZeroPage[] = {{0, NULL, NULL, NULL}};\n");
168  printf("\n");
169#endif
170  OutputIndexTable(mm_IndiciesAlign);
171  printf("\n");
172  OutputSizeTable(mm_mcbSizesAlign);
173  printf("\n");
174  OutputTheListTable(mm_mcbSizesAlign);
175  printf("\n");
176  printf("#endif /* MM_TABLES_INC*/\n");
177  return 0;
178}
179
180#else /* ! GENERATE_INDEX_TABLE */
181
182#include "mod2.h"
183#include "mmemory.h"
184#include "mmprivate.h"
185#include "mmtables.inc"
186
187#endif /* GENERATE_INDEX_TABLE */
188
Note: See TracBrowser for help on using the repository browser.