Cache commonly used C strings

This commit is contained in:
DarthSim
2019-01-28 22:20:54 +06:00
parent 4a89f0c355
commit 0b5c85f644

View File

@@ -36,6 +36,8 @@ type cConfig struct {
var cConf cConfig var cConf cConfig
var cstrings map[string]*C.char
func initVips() { func initVips() {
runtime.LockOSThread() runtime.LockOSThread()
defer runtime.UnlockOSThread() defer runtime.UnlockOSThread()
@@ -117,6 +119,17 @@ func shutdownVips() {
C.vips_shutdown() C.vips_shutdown()
} }
func cachedCString(str string) *C.char {
if cstr, ok := cstrings[str]; ok {
return cstr
}
cstr := C.CString(str)
cstrings[str] = cstr
return cstr
}
func extractMeta(img *C.VipsImage) (int, int, int, bool) { func extractMeta(img *C.VipsImage) (int, int, int, bool) {
width := int(img.Xsize) width := int(img.Xsize)
height := int(img.Ysize) height := int(img.Ysize)
@@ -704,20 +717,14 @@ func vipsImageHasAlpha(img *C.struct__VipsImage) bool {
func vipsGetInt(img *C.struct__VipsImage, name string) (int, error) { func vipsGetInt(img *C.struct__VipsImage, name string) (int, error) {
var i C.int var i C.int
cname := C.CString(name) if C.vips_image_get_int(img, cachedCString(name), &i) != 0 {
defer C.free(unsafe.Pointer(cname))
if C.vips_image_get_int(img, cname, &i) != 0 {
return 0, vipsError() return 0, vipsError()
} }
return int(i), nil return int(i), nil
} }
func vipsSetInt(img *C.struct__VipsImage, name string, value int) { func vipsSetInt(img *C.struct__VipsImage, name string, value int) {
cname := C.CString(name) C.vips_image_set_int(img, cachedCString(name), C.int(value))
defer C.free(unsafe.Pointer(cname))
C.vips_image_set_int(img, cname, C.int(value))
} }
func vipsPremultiply(img **C.struct__VipsImage) (C.VipsBandFormat, error) { func vipsPremultiply(img **C.struct__VipsImage) (C.VipsBandFormat, error) {
@@ -866,10 +873,7 @@ func vipsImportColourProfile(img **C.struct__VipsImage) error {
return err return err
} }
cprofile := C.CString(profile) if C.vips_icc_import_go(*img, &tmp, cachedCString(profile)) != 0 {
defer C.free(unsafe.Pointer(cprofile))
if C.vips_icc_import_go(*img, &tmp, cprofile) != 0 {
return vipsError() return vipsError()
} }
C.swap_and_clear(img, tmp) C.swap_and_clear(img, tmp)