Migrated util.go and main.go to the new pkgui convention and C file. Also replaced C.CBytes() with C.malloc() (this bumps our minimum version requirement to 1.8, but it's better than keeping a massive slice around at all times).

This commit is contained in:
Pietro Gagliardi 2018-08-26 10:19:10 -04:00
parent 62ac252773
commit 766f9ed028
6 changed files with 73 additions and 63 deletions

View File

@ -1,45 +0,0 @@
// 12 december 2015
package ui
import (
"unsafe"
)
// #include <stdlib.h>
// #include "util.h"
import "C"
// We want Go itself to complain when we're out of memory.
// The allocators in cgo *should* do this, but there isn't a
// C.CMalloc(). There *is* a C.CBytes(), however, for transferring
// binary blobs from Go to C. If we pass this an arbitrary slice
// of the desired length, we get our C.CMalloc(). Using a slice
// that's always initialized to zero gives us the memset(0)
// (or ZeroMemory()) for free.
var allocBytes = make([]byte, 1024) // 1024 bytes first
//export pkguiAlloc
func pkguiAlloc(n C.size_t) unsafe.Pointer {
if n > C.size_t(len(allocBytes)) {
// TODO round n up to a multiple of a power of 2?
// for instance 0x1234 bytes -> 0x1800 bytes
allocBytes = make([]byte, n)
}
return C.CBytes(allocBytes[:n])
}
func freestr(str *C.char) {
C.free(unsafe.Pointer(str))
}
func tobool(b C.int) bool {
return b != 0
}
func frombool(b bool) C.int {
if b {
return 1
}
return 0
}

View File

@ -9,12 +9,7 @@ import (
"unsafe"
)
// #include "ui.h"
// extern void doQueueMain(void *);
// extern int doOnShouldQuit(void *);
// // see golang/go#19835
// typedef void (*queueMainCallback)(void *);
// typedef int (*onShouldQuitCallback)(void *);
// #include "pkgui.h"
import "C"
// make sure main() runs on the first thread created by the OS
@ -33,15 +28,15 @@ func init() {
// nil. If package ui fails to initialize, Main returns an appropriate
// error.
func Main(f func()) error {
// TODO HEAP SAFETY
opts := C.uiInitOptions{}
estr := C.uiInit(&opts)
opts := C.pkguiAllocInitOptions()
estr := C.uiInit(opts)
C.pkguiFreeInitOptions(opts)
if estr != nil {
err := errors.New(C.GoString(estr))
C.uiFreeInitError(estr)
return err
}
C.uiOnShouldQuit(C.onShouldQuitCallback(C.doOnShouldQuit), nil)
C.pkguiOnShouldQuit()
QueueMain(f)
C.uiMain()
return nil
@ -90,11 +85,11 @@ func QueueMain(f func()) {
}
}
qmmap[n] = f
C.uiQueueMain(C.queueMainCallback(C.doQueueMain), unsafe.Pointer(n))
C.pkguiQueueMain(C.uintptr_t(n))
}
//export doQueueMain
func doQueueMain(nn unsafe.Pointer) {
//export pkguiDoQueueMain
func pkguiDoQueueMain(nn unsafe.Pointer) {
qmlock.Lock()
n := uintptr(nn)
@ -121,8 +116,8 @@ func OnShouldQuit(f func() bool) {
shouldQuitFunc = f
}
//export doOnShouldQuit
func doOnShouldQuit(unused unsafe.Pointer) C.int {
//export pkguiDoOnShouldQuit
func pkguiDoOnShouldQuit(unused unsafe.Pointer) C.int {
if shouldQuitFunc == nil {
return 0
}

23
pkgui.c Normal file
View File

@ -0,0 +1,23 @@
// 26 august 2018
#include "pkgui.h"
#include "xxxxx"
uiInitOptions *pkguiAllocInitOptions(void)
{
return (uiInitOptions *) pkguiAlloc(sizeof (uiInitOptions));
}
void pkguiFreeInitOptions(uiInitOptions *o)
{
free(o);
}
void pkguiQueueMain(uintptr_t n)
{
uiQueueMain(pkguiDoQueueMain, (void *) n);
}
void pkguiOnShouldQuit(void)
{
uiOnShouldQuit(pkguiDoOnShouldQuit, NULL);
}

9
pkgui.h Normal file
View File

@ -0,0 +1,9 @@
// 12 august 2018
#include <stdio.h>
#include "ui.h"
// main.go
extern uiInitOptions *pkguiAllocInitOptions(void);
extern void pkguiFreeInitOptions(uiInitOptions *o);
extern void pkguiQueueMain(uintptr_t n);
extern void pkguiOnShouldQuit(void);

31
util.go Normal file
View File

@ -0,0 +1,31 @@
// 12 december 2015
package ui
import (
"unsafe"
)
// #include "pkgui.h"
import "C"
//export pkguiAlloc
func pkguiAlloc(n C.size_t) unsafe.Pointer {
// cgo turns C.malloc() into a panic-on-OOM version; use it
return C.malloc(n)
}
func freestr(str *C.char) {
C.free(unsafe.Pointer(str))
}
func tobool(b C.int) bool {
return b != 0
}
func frombool(b bool) C.int {
if b {
return 1
}
return 0
}

3
util.h
View File

@ -1,3 +0,0 @@
// 12 august 2018
extern void *pkguiAlloc(size_t);