diff --git a/red4ext/EdgeWeightGPS/src/Main.cpp b/red4ext/EdgeWeightGPS/src/Main.cpp index 411c0e9..5d49d44 100644 --- a/red4ext/EdgeWeightGPS/src/Main.cpp +++ b/red4ext/EdgeWeightGPS/src/Main.cpp @@ -278,6 +278,7 @@ uint32_t gGpsCostTablePatchLogCount = 0; uint32_t gGpsProviderClassPatchLogCount = 0; std::array gGpsResolveHandleRetLogCounts{}; uint64_t gGpsResolveTraceWindowUntilMs = 0; +uint32_t gGpsResolveTraceWindowSerial = 0; std::array gGpsEdgeCostClassLogCounts{}; std::mutex gGpsCostLogMutex; std::mutex gGpsAsyncLogMutex; @@ -1111,6 +1112,8 @@ void ExtendGpsResolveTraceWindow(uint64_t aNowMs) { std::lock_guard lock(gGpsCostLogMutex); const auto untilMs = aNowMs + kGpsResolveTraceWindowMs; + std::fill(gGpsResolveHandleRetLogCounts.begin(), gGpsResolveHandleRetLogCounts.end(), 0); + ++gGpsResolveTraceWindowSerial; if (untilMs > gGpsResolveTraceWindowUntilMs) { gGpsResolveTraceWindowUntilMs = untilMs; @@ -4000,16 +4003,19 @@ int32_t DetourGpsResolveHandle(void* aGraph, uint64_t aHandle, void* aOutSegment const auto pointIndex = aHandle & 0xFFFFF; uint32_t callCount = 0; uint32_t returnCallCount = 0; + uint32_t traceWindowSerial = 0; + bool inTraceWindow = false; bool shouldLog = false; { std::lock_guard lock(gGpsCostLogMutex); callCount = gGpsResolveHandleLogCount++; const auto returnBucket = GetGpsResolveReturnBucket(returnRva); - if (returnBucket < gGpsResolveHandleRetLogCounts.size()) + inTraceWindow = GetElapsedMs() <= gGpsResolveTraceWindowUntilMs; + traceWindowSerial = gGpsResolveTraceWindowSerial; + if (inTraceWindow && returnBucket < gGpsResolveHandleRetLogCounts.size()) { returnCallCount = gGpsResolveHandleRetLogCounts[returnBucket]++; } - const auto inTraceWindow = GetElapsedMs() <= gGpsResolveTraceWindowUntilMs; shouldLog = result >= 0 && hasSegment && hasPoint && ((IsSelectedGpsResolveReturnRva(returnRva) && inTraceWindow && returnCallCount < kGpsResolveSelectedRetLogLimit) || @@ -4031,6 +4037,7 @@ int32_t DetourGpsResolveHandle(void* aGraph, uint64_t aHandle, void* aOutSegment std::ostringstream line; line << "hook GPSResolveHandle 0x44e1a8 call=" << callCount << " retCall=" << returnCallCount + << " traceWindow=" << traceWindowSerial << " inTraceWindow=" << (inTraceWindow ? 1 : 0) << " value=0x" << std::hex << static_cast(result) << " handle=0x" << aHandle << std::dec; AppendGpsPackedHandleSummary(line, "handle", aHandle); AppendPointerWithRva(line, "graph", aGraph); @@ -4047,7 +4054,8 @@ int32_t DetourGpsResolveHandle(void* aGraph, uint64_t aHandle, void* aOutSegment AppendPointerWithRva(line, "segment_p38", aux38); AppendGpsPointSummary(line, "pointSummary", point); const auto shouldDumpBytes = - callCount < kGpsResolveVerboseDumpLimit || returnCallCount < kGpsResolveVerboseDumpLimit; + callCount < kGpsResolveVerboseDumpLimit || + (inTraceWindow && returnCallCount < kGpsResolveVerboseDumpLimit); line << " dump=" << (shouldDumpBytes ? 1 : 0); if (shouldDumpBytes) {