pref: add support for `-thread-stack-size 4194304` (default set to 8MB) (#14168)
parent
7dd5d9ee61
commit
be04ec0620
|
@ -257,7 +257,7 @@ see also `v help build`.
|
|||
Passing -no-std will remove that flag, and you can then use -cflags ''
|
||||
to pass the other options for your specific C compiler.
|
||||
|
||||
-assert aborts
|
||||
-assert aborts
|
||||
Call abort() after an assertion failure. Debuggers usually
|
||||
install signal handlers for SIGABRT, so your program will stop and you
|
||||
will get a backtrace. If you are running your program outside of a
|
||||
|
@ -267,3 +267,14 @@ see also `v help build`.
|
|||
Call print_backtrace() after an assertion failure. Note that
|
||||
backtraces are not implemented yet on all combinations of
|
||||
platform/compiler.
|
||||
|
||||
-thread-stack-size 4194304
|
||||
Set the thread stack size to 4MB. Use multiples of 4096.
|
||||
The default is 8MB, which is enough for compiling V programs, with deeply
|
||||
nested expressions (~40 levels).
|
||||
It may need to be increased, if you are getting stack overflow errors for
|
||||
deeply recursive programs like some of the stages of the V compiler itself,
|
||||
that use relatively few threads.
|
||||
It may be decreased, to reduce the memory footprint of programs that launch
|
||||
hundreds/thousands of threads, but where each of the threads does not need
|
||||
a big stack.
|
||||
|
|
|
@ -1777,7 +1777,14 @@ fn (mut g Gen) go_expr(node ast.GoExpr) {
|
|||
}
|
||||
} else {
|
||||
g.writeln('pthread_t thread_$tmp;')
|
||||
g.writeln('int ${tmp}_thr_res = pthread_create(&thread_$tmp, NULL, (void*)$wrapper_fn_name, $arg_tmp_var);')
|
||||
mut sthread_attributes := 'NULL'
|
||||
if g.pref.os != .vinix {
|
||||
g.writeln('pthread_attr_t thread_${tmp}_attributes;')
|
||||
g.writeln('pthread_attr_init(&thread_${tmp}_attributes);')
|
||||
g.writeln('pthread_attr_setstacksize(&thread_${tmp}_attributes, $g.pref.thread_stack_size);')
|
||||
sthread_attributes = '&thread_${tmp}_attributes'
|
||||
}
|
||||
g.writeln('int ${tmp}_thr_res = pthread_create(&thread_$tmp, $sthread_attributes, (void*)$wrapper_fn_name, $arg_tmp_var);')
|
||||
g.writeln('if (${tmp}_thr_res) panic_error_number(tos3("`go ${name}()`: "), ${tmp}_thr_res);')
|
||||
if !node.is_expr {
|
||||
g.writeln('pthread_detach(thread_$tmp);')
|
||||
|
|
|
@ -199,6 +199,7 @@ pub mut:
|
|||
nofloat bool // for low level code, like kernels: replaces f32 with u32 and f64 with u64
|
||||
// checker settings:
|
||||
checker_match_exhaustive_cutoff_limit int = 12
|
||||
thread_stack_size int = 8388608 // Change with `-thread-stack-size 4194304`. Note: on macos it was 524288, which is too small for more complex programs with many nested callexprs.
|
||||
}
|
||||
|
||||
pub fn parse_args(known_external_commands []string, args []string) (&Preferences, string) {
|
||||
|
@ -571,6 +572,10 @@ pub fn parse_args_and_show_errors(known_external_commands []string, args []strin
|
|||
res.message_limit = cmdline.option(current_args, arg, '5').int()
|
||||
i++
|
||||
}
|
||||
'-thread-stack-size' {
|
||||
res.thread_stack_size = cmdline.option(current_args, arg, res.thread_stack_size.str()).int()
|
||||
i++
|
||||
}
|
||||
'-cc' {
|
||||
res.ccompiler = cmdline.option(current_args, '-cc', 'cc')
|
||||
res.build_options << '$arg "$res.ccompiler"'
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
fn f(x u8) u8 {
|
||||
eprintln('> f: $x')
|
||||
if x == 0 {
|
||||
return 0
|
||||
}
|
||||
mut local := [131072]u8{}
|
||||
local[local.len - 1] = x + f(x - 1)
|
||||
return local[0] + local[local.len - 1]
|
||||
}
|
||||
|
||||
fn abc(depth u8) u8 {
|
||||
return f(depth)
|
||||
}
|
||||
|
||||
fn test_default_stack_depth() {
|
||||
$if tinyc && windows {
|
||||
exit(0) // skip for now testing on windows-tcc
|
||||
}
|
||||
// Note: 10 levels of recursing f, requires a little over 1.4MB,
|
||||
// and would have failed on macos, where the default thread size
|
||||
// is just 512KB, if V was not changed to have a default for
|
||||
// `-thread-stack-size` of 8MB.
|
||||
t := go abc(10)
|
||||
res := t.wait()
|
||||
assert res == 55
|
||||
}
|
Loading…
Reference in New Issue