From 4760ad7c5a4f9a6db8c7adb5af8c10a27badb199 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 13 Dec 2015 02:24:43 -0500 Subject: Added OS X building. Go 1.5 required because of https://github.com/golang/go/issues/9411 which affects this. Also set up proper multithreading on OS X. Currently crashes due to similar issue I've had with libui. --- link_darwin.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 link_darwin.go (limited to 'link_darwin.go') diff --git a/link_darwin.go b/link_darwin.go new file mode 100644 index 0000000..c1d1a20 --- /dev/null +++ b/link_darwin.go @@ -0,0 +1,22 @@ +// 13 december 2015 + +package ui + +// #cgo LDFLAGS: -L${SRCDIR} -lui -framework CoreFoundation -lpthread +// #include +// #include +// extern void _CFRunLoopSetCurrent(CFRunLoopRef); +// extern pthread_t _CFMainPThread; +import "C" + +// OS X cares very deeply if we don't run on the very first thread the OS creates +// why? who knows. it's stupid and completely indefensible. let's use undocumented APIs to get around it. +// apple uses them too: http://www.opensource.apple.com/source/kext_tools/kext_tools-19.2/kextd_main.c?txt +// apple HAS SUGGESTED them too: http://lists.apple.com/archives/darwin-development/2002/Sep/msg00250.html +// gstreamer uses them too: http://cgit.freedesktop.org/gstreamer/gst-plugins-good/tree/sys/osxvideo/osxvideosink.m +func ensureMainThread() { + // TODO set to nil like the apple code? + C._CFRunLoopSetCurrent(C.CFRunLoopGetMain()) + // TODO is this part necessary? + C._CFMainPThread = C.pthread_self() +} -- cgit v1.2.3