add stack size limit
This commit is contained in:
parent
576df80400
commit
dbae325cdb
21
build.zig
21
build.zig
@ -128,7 +128,11 @@ fn getPackageSuffix(target: Build.ResolvedTarget) []const u8 {
|
||||
};
|
||||
}
|
||||
|
||||
const bytes_per_kib = 1024;
|
||||
const bytes_per_mib = bytes_per_kib * 1024;
|
||||
|
||||
const ProjectOptions = struct {
|
||||
stack_size: usize = 4 * bytes_per_mib,
|
||||
imgui: ?bool = null,
|
||||
assets_from_filesystem: ?bool = null,
|
||||
tracy: ?bool = null,
|
||||
@ -188,6 +192,9 @@ fn buildProject(ctx: Context, target: Build.ResolvedTarget, optimize: std.builti
|
||||
if (assets_from_filesystem) {
|
||||
build_options.addOptionPathDirectory("assets_dir", assets_dir);
|
||||
}
|
||||
if (is_debug and !is_wasm) {
|
||||
build_options.addOption(usize, "stack_size_limit", opts.stack_size);
|
||||
}
|
||||
platform_mod.addOptions("build_options", build_options);
|
||||
|
||||
platform_mod.addImport("embedded_assets", try createAssetsModule(b, assets_dir, &asset_files));
|
||||
@ -275,6 +282,18 @@ fn buildProject(ctx: Context, target: Build.ResolvedTarget, optimize: std.builti
|
||||
&(dep_sokol.artifact("sokol_clib").step)
|
||||
);
|
||||
|
||||
var extra_args: std.ArrayList([]const u8) = .empty;
|
||||
try extra_args.append(b.allocator, "-sALLOW_MEMORY_GROWTH");
|
||||
try extra_args.append(b.allocator, "-sENVIRONMENT=web");
|
||||
try extra_args.append(b.allocator, b.fmt("-sSTACK_SIZE={}", .{opts.stack_size}));
|
||||
|
||||
if (is_debug) {
|
||||
try extra_args.append(b.allocator, "-sASSERTIONS=2");
|
||||
try extra_args.append(b.allocator, "-sSTACK_OVERFLOW_CHECK=2");
|
||||
try extra_args.append(b.allocator, "-gsource-map");
|
||||
try extra_args.append(b.allocator, "-g2");
|
||||
}
|
||||
|
||||
const link_step = try sokol.emLinkStep(b, .{
|
||||
.lib_main = main_lib,
|
||||
.target = target,
|
||||
@ -284,7 +303,7 @@ fn buildProject(ctx: Context, target: Build.ResolvedTarget, optimize: std.builti
|
||||
.use_emmalloc = true,
|
||||
.use_filesystem = true,
|
||||
.shell_file_path = b.path("src/platform/shell.html"),
|
||||
.extra_args = &.{ "-sALLOW_MEMORY_GROWTH", "-sENVIRONMENT=web" }
|
||||
.extra_args = extra_args.items
|
||||
});
|
||||
|
||||
return ProjectResult{
|
||||
|
||||
@ -356,7 +356,7 @@ footstep_sound: Audio.SoundId = .nil,
|
||||
sfx_bus: Audio.BusId,
|
||||
|
||||
game_scene: GameScene,
|
||||
in_main_menu: bool = false,
|
||||
in_main_menu: bool = true,
|
||||
main_menu_state: UI.State = .empty,
|
||||
|
||||
pub fn init(self: *App, plt: Platform.Init) !?u8 {
|
||||
@ -523,7 +523,7 @@ fn loadLevels(self: *App, gpa: Allocator, assets: *Platform.Assets) !std.ArrayLi
|
||||
}
|
||||
};
|
||||
|
||||
std.mem.sort(World, levels.items, Context{}, Context.lessThan);
|
||||
std.sort.insertion(World, levels.items, Context{}, Context.lessThan);
|
||||
|
||||
return levels;
|
||||
}
|
||||
|
||||
@ -623,7 +623,7 @@ pub const Frame = struct {
|
||||
}
|
||||
};
|
||||
|
||||
pub fn run(App: type, opts: RunOptions) void {
|
||||
fn runThread(App: type, opts: RunOptions) void {
|
||||
const gpa = opts.init.gpa;
|
||||
const io = opts.init.io;
|
||||
|
||||
@ -706,6 +706,19 @@ pub fn run(App: type, opts: RunOptions) void {
|
||||
});
|
||||
}
|
||||
|
||||
pub fn run(App: type, opts: RunOptions) void {
|
||||
if (@hasDecl(build_options, "stack_size_limit")) {
|
||||
var t = std.Thread.spawn(
|
||||
.{ .stack_size = build_options.stack_size_limit },
|
||||
runThread,
|
||||
.{App, opts}
|
||||
) catch @panic("Failed to launch thread for limiting stack size");
|
||||
t.join();
|
||||
} else {
|
||||
runThread(App, opts);
|
||||
}
|
||||
}
|
||||
|
||||
fn posixSignalHandler(sig: std.posix.SIG) callconv(.c) void {
|
||||
_ = sig;
|
||||
sapp.requestQuit();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user