Add internal MemoryUsageInfo object

Currently it only provides peak RSS usage for iOS, Linux, macOS and Windows.
This commit is contained in:
Alexander Shabalin
2021-06-10 12:53:57 +03:00
committed by Space
parent 670d66984f
commit 7ae59856cb
3 changed files with 97 additions and 0 deletions
@@ -0,0 +1,63 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
#include "MemoryUsageInfo.hpp"
#include <algorithm>
#include <limits>
#include "Types.h"
#if KONAN_WINDOWS
#include <windows.h>
#include <psapi.h>
size_t kotlin::GetPeakResidentSetSizeBytes() noexcept {
::PROCESS_MEMORY_COUNTERS memoryCounters;
auto succeeded = ::GetProcessMemoryInfo(::GetCurrentProcess(), &memoryCounters, sizeof(memoryCounters));
if (!succeeded) {
return 0;
}
return memoryCounters.PeakWorkingSetSize;
}
#elif KONAN_LINUX || KONAN_MACOSX || KONAN_IOS
#include <sys/time.h>
#include <sys/resource.h>
size_t kotlin::GetPeakResidentSetSizeBytes() noexcept {
::rusage usage;
auto failed = ::getrusage(RUSAGE_SELF, &usage);
#if KONAN_LINUX
// On Linux it's in kilobytes.
size_t maxrss = static_cast<size_t>(usage.ru_maxrss * 1024);
#elif KONAN_MACOSX || KONAN_IOS
// On macOS and iOS it's in bytes.
size_t maxrss = static_cast<size_t>(usage.ru_maxrss);
#else
#error "Check what units ru_maxrss is in."
#endif
if (failed) {
return 0;
}
return maxrss;
}
#else
// TODO: Support more platforms
size_t kotlin::GetPeakResidentSetSizeBytes() noexcept {
return 0;
}
#endif
extern "C" RUNTIME_NOTHROW KLong Kotlin_MemoryUsageInfo_getPeakResidentSetSizeBytes() {
auto result = kotlin::GetPeakResidentSetSizeBytes();
auto boundedResult = std::min<decltype(result)>(result, std::numeric_limits<KLong>::max());
return static_cast<KLong>(boundedResult);
}
@@ -0,0 +1,17 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
#ifndef RUNTIME_MEMORY_USAGE_INFO_H
#define RUNTIME_MEMORY_USAGE_INFO_H
#include <cstddef>
namespace kotlin {
size_t GetPeakResidentSetSizeBytes() noexcept;
}
#endif // RUNTIME_MEMORY_USAGE_INFO_H
@@ -0,0 +1,17 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
package kotlin.native.internal
@InternalForKotlinNative
object MemoryUsageInfo {
// An estimate of how much memory was committed by the process at its peak.
// Resident Set Size in *nix, Working Set Size in Windows.
// May return 0 if unimplemented on some platform, or in case of an error.
val peakResidentSetSizeBytes: Long
get() = MemoryUsageInfo_getPeakResidentSetSizeBytes()
}
@GCUnsafeCall("Kotlin_MemoryUsageInfo_getPeakResidentSetSizeBytes")
private external fun MemoryUsageInfo_getPeakResidentSetSizeBytes(): Long