diff --git a/cmd/gio/iosbuild.go b/cmd/gio/iosbuild.go index 17ce31bb..7cd5b6cd 100644 --- a/cmd/gio/iosbuild.go +++ b/cmd/gio/iosbuild.go @@ -139,11 +139,8 @@ func exeIOS(tmpDir, target, app string, bi *buildInfo) error { const mainmSrc = `@import UIKit; @import Gio; -void gio_runMain(void); - int main(int argc, char * argv[]) { @autoreleasepool { - gio_runMain(); return UIApplicationMain(argc, argv, nil, NSStringFromClass([GioAppDelegate class])); } }` diff --git a/ui/app/os_ios.m b/ui/app/os_ios.m index 378e2c44..3d9e7964 100644 --- a/ui/app/os_ios.m +++ b/ui/app/os_ios.m @@ -34,6 +34,8 @@ static void redraw(CFTypeRef viewRef, BOOL sync) { @implementation GioAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + gio_runMain(); + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; GioViewController *controller = [[GioViewController alloc] initWithNibName:nil bundle:nil]; controller.screen = self.window.screen; diff --git a/ui/app/runmain.go b/ui/app/runmain.go index 4a59727d..7d7eb7be 100644 --- a/ui/app/runmain.go +++ b/ui/app/runmain.go @@ -7,16 +7,21 @@ package app // library mode. To make Gio programs simpler and uniform, we'll // link to the main function here and call it from Java. -import _ "unsafe" // for go:linkname +import ( + "sync" + _ "unsafe" // for go:linkname +) //go:linkname mainMain main.main func mainMain() +var runMainOnce sync.Once + func runMain() { - go func() { + runMainOnce.Do(func() { // Indirect call, since the linker does not know the address of main when // laying down this package. fn := mainMain - fn() - }() + go fn() + }) }