@@ -104,36 +104,46 @@ void jl_gc_init(void) {
104
104
// MMTK_MIN_HSIZE and MMTK_MAX_HSIZE environment variables
105
105
long long min_heap_size ;
106
106
long long max_heap_size ;
107
- char * min_size_def = getenv ("MMTK_MIN_HSIZE" );
108
- char * min_size_gb = getenv ("MMTK_MIN_HSIZE_G" );
109
-
110
- char * max_size_def = getenv ("MMTK_MAX_HSIZE" );
111
- char * max_size_gb = getenv ("MMTK_MAX_HSIZE_G" );
112
-
113
- // If min and max values are not specified, set them to 0 here
114
- // and use stock heuristics as defined in the binding
115
- if (min_size_def != NULL ) {
116
- char * p ;
117
- double min_size = strtod (min_size_def , & p );
118
- min_heap_size = (long ) 1024 * 1024 * min_size ;
119
- } else if (min_size_gb != NULL ) {
120
- char * p ;
121
- double min_size = strtod (min_size_gb , & p );
122
- min_heap_size = (long ) 1024 * 1024 * 1024 * min_size ;
123
- } else {
124
- min_heap_size = 0 ;
125
- }
126
107
127
- if (max_size_def != NULL ) {
128
- char * p ;
129
- double max_size = strtod (max_size_def , & p );
130
- max_heap_size = (long ) 1024 * 1024 * max_size ;
131
- } else if (max_size_gb != NULL ) {
132
- char * p ;
133
- double max_size = strtod (max_size_gb , & p );
134
- max_heap_size = (long ) 1024 * 1024 * 1024 * max_size ;
108
+ if (jl_options .hard_heap_limit != 0 ) {
109
+ min_heap_size = jl_options .hard_heap_limit ;
110
+ max_heap_size = jl_options .hard_heap_limit ;
135
111
} else {
136
- max_heap_size = 0 ;
112
+ char * min_size_def = getenv ("MMTK_MIN_HSIZE" );
113
+ char * min_size_gb = getenv ("MMTK_MIN_HSIZE_G" );
114
+ char * max_size_def = getenv ("MMTK_MAX_HSIZE" );
115
+ char * max_size_gb = getenv ("MMTK_MAX_HSIZE_G" );
116
+
117
+ // If min and max values are not specified, set them to 0 here
118
+ // and use stock heuristics as defined in the binding
119
+ if (min_size_def != NULL ) {
120
+ char * p ;
121
+ double min_size = strtod (min_size_def , & p );
122
+ min_heap_size = (long ) 1024 * 1024 * min_size ;
123
+ } else if (min_size_gb != NULL ) {
124
+ char * p ;
125
+ double min_size = strtod (min_size_gb , & p );
126
+ min_heap_size = (long ) 1024 * 1024 * 1024 * min_size ;
127
+ } else {
128
+ min_heap_size = 0 ;
129
+ }
130
+
131
+ if (max_size_def != NULL ) {
132
+ char * p ;
133
+ double max_size = strtod (max_size_def , & p );
134
+ max_heap_size = (long ) 1024 * 1024 * max_size ;
135
+ } else if (max_size_gb != NULL ) {
136
+ char * p ;
137
+ double max_size = strtod (max_size_gb , & p );
138
+ max_heap_size = (long ) 1024 * 1024 * 1024 * max_size ;
139
+ } else {
140
+ max_heap_size = 0 ;
141
+ }
142
+
143
+ // if only max size is specified initialize MMTk with a fixed size heap
144
+ if (max_size_def != NULL || (max_size_gb != NULL && (min_size_def == NULL && min_size_gb == NULL ))) {
145
+ min_heap_size = 0 ;
146
+ }
137
147
}
138
148
139
149
// Assert that the number of stock GC threads is 0; MMTK uses the number of threads in jl_options.ngcthreads
@@ -150,15 +160,10 @@ void jl_gc_init(void) {
150
160
151
161
mmtk_julia_copy_stack_check (copy_stacks );
152
162
153
- // if only max size is specified initialize MMTk with a fixed size heap
154
163
// TODO: We just assume mark threads means GC threads, and ignore the number of concurrent sweep threads.
155
164
// If the two values are the same, we can use either. Otherwise, we need to be careful.
156
165
uintptr_t gcthreads = jl_options .nmarkthreads ;
157
- if (max_size_def != NULL || (max_size_gb != NULL && (min_size_def == NULL && min_size_gb == NULL ))) {
158
- mmtk_gc_init (0 , max_heap_size , gcthreads , (sizeof (jl_taggedvalue_t )), jl_buff_tag );
159
- } else {
160
- mmtk_gc_init (min_heap_size , max_heap_size , gcthreads , (sizeof (jl_taggedvalue_t )), jl_buff_tag );
161
- }
166
+ mmtk_gc_init (min_heap_size , max_heap_size , gcthreads , (sizeof (jl_taggedvalue_t )), jl_buff_tag );
162
167
}
163
168
164
169
void jl_start_gc_threads (void ) {
0 commit comments