app/internal/cocoainit: enable multithread support in Cocoa

According to

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html#//apple_ref/doc/uid/20000738-125024

Cocoa is by default not multithread-safe for programs that use the posix
api for creating threads:

"
For multithreaded applications, Cocoa frameworks use locks and other
forms of internal synchronization to ensure they behave correctly. To
prevent these locks from degrading performance in the single-threaded
case, however, Cocoa does not create them until the application spawns
its first new thread using the NSThread class. If you spawn threads
using only POSIX thread routines, Cocoa does not receive the
notifications it needs to know that your application is now
multithreaded. When that happens, operations involving the Cocoa
frameworks may destabilize or crash your application.
"

That includes Go programs.

The fix, as discovered by Steeve Morin, is to create and launch
an empty NSThread.

Add a package that does that, and use it everywhere Cocoa is used.

Sigh.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-04-23 21:08:55 +02:00
parent 08dfd2943b
commit 533bf953f9
4 changed files with 26 additions and 0 deletions
+2
View File
@@ -6,6 +6,8 @@ import (
"gioui.org/app/internal/glimpl"
"gioui.org/gpu/backend"
"gioui.org/gpu/gl"
_ "gioui.org/app/internal/cocoainit"
)
/*
+20
View File
@@ -0,0 +1,20 @@
// SPDX-License-Identifier: Unlicense OR MIT
// Package cocoainit initializes support for multithreaded
// programs in Cocoa.
package cocoainit
/*
#cgo CFLAGS: -xobjective-c -fmodules -fobjc-arc
#import <Foundation/Foundation.h>
static inline void activate_cocoa_multithreading() {
[[NSThread new] start];
}
#pragma GCC visibility push(hidden)
*/
import "C"
func init() {
C.activate_cocoa_multithreading()
}
+2
View File
@@ -16,6 +16,8 @@ import (
"io"
"log"
"unsafe"
_ "gioui.org/app/internal/cocoainit"
)
func init() {
+2
View File
@@ -17,6 +17,8 @@ import (
"gioui.org/io/key"
"gioui.org/io/pointer"
"gioui.org/io/system"
_ "gioui.org/app/internal/cocoainit"
)
/*