From 93c647f4da429b75be6eea6c7611b771d4d786cf Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Fri, 20 Oct 2023 13:30:48 -0700 Subject: [PATCH] fix: memory leak from string cstring disposal (#40) * fix: memory leak from string cstring disposal * undo test case --- src/amplitude_experiment/local/evaluation/evaluation.py | 5 ++++- .../local/evaluation/libevaluation_interop.py | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/amplitude_experiment/local/evaluation/evaluation.py b/src/amplitude_experiment/local/evaluation/evaluation.py index e4f426f..3454eb8 100644 --- a/src/amplitude_experiment/local/evaluation/evaluation.py +++ b/src/amplitude_experiment/local/evaluation/evaluation.py @@ -1,4 +1,5 @@ from .libevaluation_interop import libevaluation_interop_symbols +from ctypes import cast, c_char_p def evaluate(rules: str, user: str) -> str: """ @@ -11,4 +12,6 @@ def evaluate(rules: str, user: str) -> str: Evaluation results with variants in JSON """ result = libevaluation_interop_symbols().contents.kotlin.root.evaluate(rules, user) - return str(result, 'utf-8') + py_result = cast(result, c_char_p).value + libevaluation_interop_symbols().contents.DisposeString(result) + return str(py_result, 'utf-8') diff --git a/src/amplitude_experiment/local/evaluation/libevaluation_interop.py b/src/amplitude_experiment/local/evaluation/libevaluation_interop.py index 869e24f..de2b0c2 100644 --- a/src/amplitude_experiment/local/evaluation/libevaluation_interop.py +++ b/src/amplitude_experiment/local/evaluation/libevaluation_interop.py @@ -1086,7 +1086,11 @@ class struct_anon_14(Structure): 'evaluate', ] struct_anon_14._fields_ = [ - ('evaluate', CFUNCTYPE(UNCHECKED(c_char_p), String, String)), + # NOTE(bgiori): Changed this line from `UNCHECKED(c_char_p)` to `UNCHECKED(c_void_p)` + # to help fix a memory leak. Strings returned from kotlin/native must + # be freed using the DisposeString function, but c_char_p converts the + # c value making it incompatible with the dispose function. + ('evaluate', CFUNCTYPE(UNCHECKED(c_void_p), String, String)), ] # src/amplitude_experiment/local/evaluation/lib/macosX64/libevaluation_interop_api.h: 100