|
24 | 24 | #include "thread_annotations.h" |
25 | 25 | #include "tracing.h" |
26 | 26 |
|
| 27 | +#include <inttypes.h> |
| 28 | + |
27 | 29 | namespace scudo { |
28 | 30 |
|
29 | 31 | // SizeClassAllocator64 is an allocator tuned for 64-bit address space. |
@@ -1150,13 +1152,23 @@ void SizeClassAllocator64<Config>::getStats(ScopedString *Str, uptr ClassId, |
1150 | 1152 | "%s %02zu (%6zu): mapped: %6zuK popped: %7zu pushed: %7zu " |
1151 | 1153 | "inuse: %6zu total: %6zu releases attempted: %6zu last " |
1152 | 1154 | "released: %6zuK latest pushed bytes: %6zuK region: 0x%zx " |
1153 | | - "(0x%zx)\n", |
| 1155 | + "(0x%zx)", |
1154 | 1156 | Region->Exhausted ? "E" : " ", ClassId, getSizeByClassId(ClassId), |
1155 | 1157 | Region->MemMapInfo.MappedUser >> 10, Region->FreeListInfo.PoppedBlocks, |
1156 | 1158 | Region->FreeListInfo.PushedBlocks, InUseBlocks, TotalChunks, |
1157 | 1159 | Region->ReleaseInfo.NumReleasesAttempted, |
1158 | 1160 | Region->ReleaseInfo.LastReleasedBytes >> 10, RegionPushedBytesDelta >> 10, |
1159 | 1161 | Region->RegionBeg, getRegionBaseByClassId(ClassId)); |
| 1162 | + const u64 CurTimeNs = getMonotonicTimeFast(); |
| 1163 | + const u64 LastReleaseAtNs = Region->ReleaseInfo.LastReleaseAtNs; |
| 1164 | + if (LastReleaseAtNs != 0 && CurTimeNs != LastReleaseAtNs) { |
| 1165 | + const u64 DiffSinceLastReleaseNs = |
| 1166 | + CurTimeNs - Region->ReleaseInfo.LastReleaseAtNs; |
| 1167 | + const u64 LastReleaseSecAgo = DiffSinceLastReleaseNs / 1000000000; |
| 1168 | + const u64 LastReleaseMsAgo = (DiffSinceLastReleaseNs % 1000000000) / 1000000; |
| 1169 | + Str->append("Latest release: %" PRIu64 ":%" PRIu64 " seconds ago", LastReleaseSecAgo, LastReleaseMsAgo); |
| 1170 | + } |
| 1171 | + Str->append("\n"); |
1160 | 1172 | } |
1161 | 1173 |
|
1162 | 1174 | template <typename Config> |
|
0 commit comments