diff --git a/performance/cinterop/src/main/kotlin-native/org/jetbrains/cinteropBenchmarks/typesBenchmark.kt b/performance/cinterop/src/main/kotlin-native/org/jetbrains/cinteropBenchmarks/typesBenchmark.kt index 292e16c83d1..113eb92810c 100644 --- a/performance/cinterop/src/main/kotlin-native/org/jetbrains/cinteropBenchmarks/typesBenchmark.kt +++ b/performance/cinterop/src/main/kotlin-native/org/jetbrains/cinteropBenchmarks/typesBenchmark.kt @@ -53,8 +53,9 @@ actual class StringBenchmark actual constructor() { val result = StringBuilder() for (i in 1..benchmarkSize) { val pointer = findSuitableString(strings.toCStringArray(this), benchmarkSize, "a") - result.append(pointer?.toKString()) - nativeHeap.free(pointer.rawValue) + val str = pointer?.toKString() + result.append(str) + freeSuitableString(pointer) } } } diff --git a/performance/cinterop/src/nativeInterop/cinterop/types.def b/performance/cinterop/src/nativeInterop/cinterop/types.def index 00bcb923643..c9107c7a723 100644 --- a/performance/cinterop/src/nativeInterop/cinterop/types.def +++ b/performance/cinterop/src/nativeInterop/cinterop/types.def @@ -26,6 +26,10 @@ const char* findSuitableString(const char* stringsArray[], int arraySize, const return NULL; } +void freeSuitableString(char* unusedString) { + free(unusedString); +} + unsigned long int sum(int array[], int arraySize) { unsigned long int result = 0; for(int i = 0; i < arraySize; ++i) { diff --git a/runtime/src/main/cpp/Exceptions.cpp b/runtime/src/main/cpp/Exceptions.cpp index 6a976b9bc10..2314280046f 100644 --- a/runtime/src/main/cpp/Exceptions.cpp +++ b/runtime/src/main/cpp/Exceptions.cpp @@ -46,19 +46,6 @@ namespace { -// TODO: it seems to be very common case; does C++ std library provide something like this? -class AutoFree { - private: - void* mem_; - - public: - AutoFree(void* mem): mem_(mem) {} - - ~AutoFree() { - konan::free(mem_); - } -}; - // RuntimeUtils.kt extern "C" void ReportUnhandledException(KRef throwable); extern "C" void ExceptionReporterLaunchpad(KRef reporter, KRef throwable); @@ -182,7 +169,7 @@ OBJ_GETTER(GetStackTraceStrings, KConstRef stackTrace) { if (size > 0) { char **symbols = backtrace_symbols(PrimitiveArrayAddressOfElementAt(stackTrace->array(), 0), size); RuntimeCheck(symbols != nullptr, "Not enough memory to retrieve the stacktrace"); - AutoFree autoFree(symbols); + for (int index = 0; index < size; ++index) { auto sourceInfo = Kotlin_getSourceInfo(*PrimitiveArrayAddressOfElementAt(stackTrace->array(), index)); const char* symbol = symbols[index]; @@ -203,6 +190,8 @@ OBJ_GETTER(GetStackTraceStrings, KConstRef stackTrace) { CreateStringFromCString(result, holder.slot()); UpdateHeapRef(ArrayAddressOfElementAt(strings->array(), index), holder.obj()); } + // Not konan::free. Used to free memory allocated in backtrace_symbols where malloc is used. + free(symbols); } #endif RETURN_OBJ(strings);