mirror of
https://github.com/gosticks/gml.git
synced 2025-10-16 12:05:33 +00:00
GC fixes
This commit is contained in:
parent
3825919525
commit
8257c2961f
15
app.go
15
app.go
@ -106,23 +106,10 @@ func newAppWithArgs(args []string) (a *app, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always free the C value.
|
|
||||||
runtime.SetFinalizer(a, freeApp)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func freeApp(a *app) {
|
// TODO: remove gml_app_free
|
||||||
if a.freed {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
a.freed = true
|
|
||||||
C.gml_app_free(a.app)
|
|
||||||
freeCharArray(a.argv, a.argc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *app) Free() {
|
|
||||||
freeApp(a)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *app) getDp() (dp float64, err error) {
|
func (a *app) getDp() (dp float64, err error) {
|
||||||
apiErr := errorPool.Get()
|
apiErr := errorPool.Get()
|
||||||
|
|||||||
16
bytes.go
16
bytes.go
@ -31,13 +31,11 @@ package gml
|
|||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
type bytes struct {
|
type bytes struct {
|
||||||
freed bool
|
ptr C.gml_bytes
|
||||||
ptr C.gml_bytes
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBytes() (b *bytes) {
|
func newBytes() (b *bytes) {
|
||||||
@ -49,21 +47,11 @@ func newBytes() (b *bytes) {
|
|||||||
if b.ptr == nil {
|
if b.ptr == nil {
|
||||||
panic(fmt.Errorf("failed to create gml bytes: C pointer is nil"))
|
panic(fmt.Errorf("failed to create gml bytes: C pointer is nil"))
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime.SetFinalizer(b, freeBytes) // Always free the C value.
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func freeBytes(b *bytes) {
|
|
||||||
if b.freed {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
b.freed = true
|
|
||||||
C.gml_bytes_free(b.ptr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *bytes) Free() {
|
func (b *bytes) Free() {
|
||||||
freeBytes(b)
|
C.gml_bytes_free(b.ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *bytes) Bytes() []byte {
|
func (b *bytes) Bytes() []byte {
|
||||||
|
|||||||
32
char.go
32
char.go
@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* GML - Go QML
|
|
||||||
*
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2019 Roland Singer <roland.singer[at]desertbit.com>
|
|
||||||
* Copyright (c) 2019 Sebastian Borchers <sebastian[at]desertbit.com>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package gml
|
|
||||||
|
|
||||||
// TODO: this is currently only supported for Variant. Add support to the code generation (signals, slots... args).
|
|
||||||
// A Char is an alias for a rune which is converted to a QChar when used within a Variant.
|
|
||||||
type Char rune
|
|
||||||
4
gml.go
4
gml.go
@ -63,7 +63,7 @@ func RunMain(f func()) {
|
|||||||
gapp.RunMain(f)
|
gapp.RunMain(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exec load sthe root QML file located at url,
|
// Exec load the root QML file located at url,
|
||||||
// executes the application and returns the exit code.
|
// executes the application and returns the exit code.
|
||||||
// This method is blocking.
|
// This method is blocking.
|
||||||
// Hint: Must be called within main thread.
|
// Hint: Must be called within main thread.
|
||||||
@ -71,7 +71,7 @@ func Exec(url string) (retCode int, err error) {
|
|||||||
return gapp.Exec(url)
|
return gapp.Exec(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExecExit load sthe root QML file located at url,
|
// ExecExit load the root QML file located at url,
|
||||||
// executes the app, prints errors and exits
|
// executes the app, prints errors and exits
|
||||||
// the application with the specific exit code.
|
// the application with the specific exit code.
|
||||||
func ExecExit(url string) {
|
func ExecExit(url string) {
|
||||||
|
|||||||
11
image.go
11
image.go
@ -38,8 +38,6 @@ import (
|
|||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: add LoadFromBuffer & LoadFromGoImage
|
|
||||||
|
|
||||||
type Image struct {
|
type Image struct {
|
||||||
freed bool
|
freed bool
|
||||||
img C.gml_image
|
img C.gml_image
|
||||||
@ -123,6 +121,10 @@ func (img *Image) LoadFromGoImage(gimg image.Image) error {
|
|||||||
return apiErr.Err("failed to load from data")
|
return apiErr.Err("failed to load from data")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prevent the GC from freeing. Go issue 13347
|
||||||
|
runtime.KeepAlive(img)
|
||||||
|
runtime.KeepAlive(gimg)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,5 +158,10 @@ func (img *Image) LoadFromData(data []byte) error {
|
|||||||
if ret != 0 {
|
if ret != 0 {
|
||||||
return apiErr.Err("failed to load from data")
|
return apiErr.Err("failed to load from data")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prevent the GC from freeing. Go issue 13347
|
||||||
|
runtime.KeepAlive(img)
|
||||||
|
runtime.KeepAlive(data)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -59,7 +59,6 @@ gml_variant gml_variant_new_from_uint32(u_int32_t i);
|
|||||||
gml_variant gml_variant_new_from_int64 (int64_t i);
|
gml_variant gml_variant_new_from_int64 (int64_t i);
|
||||||
gml_variant gml_variant_new_from_uint64(u_int64_t i);
|
gml_variant gml_variant_new_from_uint64(u_int64_t i);
|
||||||
|
|
||||||
gml_variant gml_variant_new_from_rune (int32_t r);
|
|
||||||
gml_variant gml_variant_new_from_string(char* s);
|
gml_variant gml_variant_new_from_string(char* s);
|
||||||
gml_variant gml_variant_new_from_bytes (char* b, int size);
|
gml_variant gml_variant_new_from_bytes (char* b, int size);
|
||||||
|
|
||||||
@ -82,7 +81,6 @@ u_int32_t gml_variant_to_uint32(gml_variant v);
|
|||||||
int64_t gml_variant_to_int64 (gml_variant v);
|
int64_t gml_variant_to_int64 (gml_variant v);
|
||||||
u_int64_t gml_variant_to_uint64(gml_variant v);
|
u_int64_t gml_variant_to_uint64(gml_variant v);
|
||||||
|
|
||||||
int32_t gml_variant_to_rune (gml_variant v);
|
|
||||||
void gml_variant_to_string(gml_variant v, gml_bytes b);
|
void gml_variant_to_string(gml_variant v, gml_bytes b);
|
||||||
void gml_variant_to_bytes (gml_variant v, gml_bytes b);
|
void gml_variant_to_bytes (gml_variant v, gml_bytes b);
|
||||||
|
|
||||||
|
|||||||
@ -241,21 +241,6 @@ gml_variant gml_variant_new_from_uint64(u_int64_t i) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gml_variant gml_variant_new_from_rune(int32_t r) {
|
|
||||||
try {
|
|
||||||
QVariant* v = new QVariant(QChar(r));
|
|
||||||
return (gml_variant)v;
|
|
||||||
}
|
|
||||||
catch (std::exception& e) {
|
|
||||||
gml_error_log_exception("variant: " + string(e.what()));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
gml_error_log_exception("variant");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gml_variant gml_variant_new_from_string(char* s) {
|
gml_variant gml_variant_new_from_string(char* s) {
|
||||||
try {
|
try {
|
||||||
QVariant* v = new QVariant(QString(s));
|
QVariant* v = new QVariant(QString(s));
|
||||||
@ -470,21 +455,6 @@ u_int64_t gml_variant_to_uint64(gml_variant v) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t gml_variant_to_rune(gml_variant v) {
|
|
||||||
try {
|
|
||||||
QVariant* qv = (QVariant*)v;
|
|
||||||
return (int32_t)(qv->toInt());
|
|
||||||
}
|
|
||||||
catch (std::exception& e) {
|
|
||||||
gml_error_log_exception("variant: " + string(e.what()));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
gml_error_log_exception("variant");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void gml_variant_to_string(gml_variant v, gml_bytes b) {
|
void gml_variant_to_string(gml_variant v, gml_bytes b) {
|
||||||
try {
|
try {
|
||||||
QVariant* qv = (QVariant*)v;
|
QVariant* qv = (QVariant*)v;
|
||||||
|
|||||||
@ -93,8 +93,6 @@ func ToVariant(i interface{}) *Variant {
|
|||||||
case uint64:
|
case uint64:
|
||||||
ptr = C.gml_variant_new_from_uint64(C.u_int64_t(d))
|
ptr = C.gml_variant_new_from_uint64(C.u_int64_t(d))
|
||||||
|
|
||||||
case Char: // TODO: remove?
|
|
||||||
ptr = C.gml_variant_new_from_rune(C.int32_t(d))
|
|
||||||
case string:
|
case string:
|
||||||
cstr := C.CString(d)
|
cstr := C.CString(d)
|
||||||
defer C.free(unsafe.Pointer(cstr))
|
defer C.free(unsafe.Pointer(cstr))
|
||||||
@ -183,8 +181,6 @@ func (v *Variant) Decode(i interface{}) (err error) {
|
|||||||
case *uint64:
|
case *uint64:
|
||||||
*d = uint64(C.gml_variant_to_uint64(v.ptr))
|
*d = uint64(C.gml_variant_to_uint64(v.ptr))
|
||||||
|
|
||||||
case *Char: // TODO: remove?
|
|
||||||
*d = Char(C.gml_variant_to_rune(v.ptr))
|
|
||||||
case *string:
|
case *string:
|
||||||
b := newBytes()
|
b := newBytes()
|
||||||
defer b.Free()
|
defer b.Free()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user