20
20
#undef DPRINT
21
21
#define DPRINT (fmt, ...)
22
22
23
- // const size_t DEFAULT_CHUNK_SIZE = 4096 ;
24
- const size_t DEFAULT_CHUNK_SIZE = 500000 ;
23
+ const size_t DEFAULT_CHUNK_SIZE = 128 ;
24
+ const size_t MAX_CHUNK_SIZE = ( 1024 * 64 ) ;
25
25
const size_t DEFAULT_ALIGNMENT = 16 ;
26
26
27
27
// A single type-tagged allocation in a chunk.
@@ -42,7 +42,6 @@ rust_obstack_chunk::alloc(size_t len, type_desc *tydesc) {
42
42
43
43
if (sizeof (rust_obstack_alloc) + len > size - alen) {
44
44
DPRINT (" Not enough space, len=%lu!\n " , len);
45
- assert (0 ); // FIXME
46
45
return NULL ; // Not enough space.
47
46
}
48
47
@@ -70,9 +69,15 @@ rust_obstack_chunk::mark() {
70
69
// Allocates the given number of bytes in a new chunk.
71
70
void *
72
71
rust_obstack::alloc_new (size_t len, type_desc *tydesc) {
72
+ size_t default_chunk_size = DEFAULT_CHUNK_SIZE;
73
+ if (chunk) {
74
+ default_chunk_size = std::min (chunk->size * 2 , MAX_CHUNK_SIZE);
75
+ }
76
+
73
77
size_t chunk_size = std::max (sizeof (rust_obstack_alloc) + len,
74
- DEFAULT_CHUNK_SIZE);
75
- void *ptr = task->malloc (sizeof (chunk) + chunk_size, " obstack" );
78
+ default_chunk_size);
79
+ void *ptr = task->malloc (sizeof (rust_obstack_chunk) + chunk_size,
80
+ " obstack" );
76
81
DPRINT (" making new chunk at %p, len %lu\n " , ptr, chunk_size);
77
82
chunk = new (ptr) rust_obstack_chunk (chunk, chunk_size);
78
83
return chunk->alloc (len, tydesc);
0 commit comments