Skip to content

Commit

Permalink
Merge pull request #728 from bugsnag/removeDateTimeNowUsage
Browse files Browse the repository at this point in the history
Backport Release v6.3.4
  • Loading branch information
richardelms authored Jul 6, 2023
2 parents 83a3f77 + 74d5830 commit 7cd57e3
Show file tree
Hide file tree
Showing 8 changed files with 80 additions and 17 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog


## 6.3.4 (2023-07-06)

## Bug Fixes

- Remove unnecessary usages of DateTimeOffset.Now to prevent iOS app hangs resulting from Unity native code accessing non-thread safe methods. [#725](https://github.com/bugsnag/bugsnag-unity/pull/725)


## 6.3.3 (2023-06-13)

## Bug Fixes
Expand Down
2 changes: 1 addition & 1 deletion build.cake
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ var target = Argument("target", "Default");
var solution = File("./BugsnagUnity.sln");
var configuration = Argument("configuration", "Release");
var project = File("./src/BugsnagUnity/BugsnagUnity.csproj");
var version = "6.3.3";
var version = "6.3.4";

Task("Restore-NuGet-Packages")
.Does(() => NuGetRestore(solution));
Expand Down
13 changes: 9 additions & 4 deletions src/BugsnagUnity/MaximumLogTypeCounter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,24 @@ public class MaximumLogTypeCounter

private Dictionary<LogType, int> CurrentCounts { get; }

private DateTimeOffset FlushAt { get; set; }
private double FlushAt { get; set; }

private TimeSpan MaximumLogsTimePeriod => Configuration.MaximumLogsTimePeriod;
private double MaximumLogsTimePeriod => Configuration.MaximumLogsTimePeriod.TotalSeconds;

private Dictionary<LogType, int> MaximumTypePerTimePeriod => Configuration.MaximumTypePerTimePeriod;

private readonly object _lock = new object();

private void SetFlushTime()
{
FlushAt = Time.ElapsedSeconds + MaximumLogsTimePeriod;
}

public MaximumLogTypeCounter(Configuration configuration)
{
Configuration = configuration;
CurrentCounts = new Dictionary<LogType, int>();
FlushAt = DateTimeOffset.Now.Add(Configuration.MaximumLogsTimePeriod);
SetFlushTime();
}

public bool ShouldSend(UnityLogMessage unityLogMessage)
Expand All @@ -47,7 +52,7 @@ public bool ShouldSend(UnityLogMessage unityLogMessage)
if (unityLogMessage.CreatedAt > FlushAt)
{
CurrentCounts.Clear();
FlushAt = DateTimeOffset.Now.Add(MaximumLogsTimePeriod);
SetFlushTime();
return true;
}
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/BugsnagUnity/Payload/AppWithState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ internal AppWithState(Dictionary<string, object> cachedData) : base(cachedData){

internal AppWithState(Configuration configuration) : base(configuration)
{
Duration = TimeSpan.FromSeconds(Time.realtimeSinceStartup);
Duration = TimeSpan.FromSeconds(UnityEngine.Time.realtimeSinceStartup);
}

}
Expand Down
36 changes: 36 additions & 0 deletions src/BugsnagUnity/Time.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System;
using System.Diagnostics;

namespace BugsnagUnity
{
// A simple timer used internally to avoid thread complications when using the unity Time API
internal class Time
{

private static object _swLock = new object();

private static Stopwatch _sw;

internal static Stopwatch Timer
{
get
{
if (_sw == null)
{
lock (_swLock)
{
if (_sw == null)
{
_sw = Stopwatch.StartNew();
}
}
}
return _sw;
}
}

internal static double ElapsedSeconds => Timer.Elapsed.TotalSeconds;

}
}

14 changes: 9 additions & 5 deletions src/BugsnagUnity/UniqueLogThrottle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,25 @@ public class UniqueLogThrottle
/// <summary>
/// Used to track when the counter should be flushed next
/// </summary>
private DateTime FlushAt { get; set; }
private double FlushAt { get; set; }

/// <summary>
/// The configuration for unique log counts and times
/// </summary>
private Configuration Configuration { get; }

private TimeSpan UniqueLogsTimePeriod => Configuration.SecondsPerUniqueLog;
private double UniqueLogsTimePeriod => Configuration.SecondsPerUniqueLog.TotalSeconds;

private void SetFlushTime()
{
FlushAt = Time.ElapsedSeconds + UniqueLogsTimePeriod;
}

public UniqueLogThrottle(Configuration configuration)
{
Configuration = configuration;
Counter = new Dictionary<UnityLogMessage, int>(new UnityLogMessageEqualityComparer());
FlushAt = DateTime.UtcNow.Add(Configuration.SecondsPerUniqueLog);
SetFlushTime();
}

/// <summary>
Expand All @@ -43,7 +48,6 @@ public UniqueLogThrottle(Configuration configuration)
public bool ShouldSend(UnityLogMessage unityLogMessage)
{
bool shouldSend;

lock (_lock)
{
shouldSend = !Counter.ContainsKey(unityLogMessage);
Expand All @@ -57,7 +61,7 @@ public bool ShouldSend(UnityLogMessage unityLogMessage)
if (unityLogMessage.CreatedAt > FlushAt)
{
Counter.Clear();
FlushAt = DateTime.UtcNow.Add(UniqueLogsTimePeriod);
SetFlushTime();
shouldSend = true;
}
}
Expand Down
15 changes: 13 additions & 2 deletions src/BugsnagUnity/UnityLogMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,29 @@ public class UnityLogMessage
{
public UnityLogMessage(string condition, string stackTrace, LogType type)
{
CreatedAt = DateTime.UtcNow;
CreatedAt = Time.ElapsedSeconds;
Condition = condition;
StackTrace = stackTrace;
Type = type;
}


public UnityLogMessage(Exception exception)
{
CreatedAt = Time.ElapsedSeconds;
Condition = exception.Message == null ? string.Empty : exception.Message;
StackTrace = exception.StackTrace == null ? string.Empty : exception.StackTrace;
Type = LogType.Exception;
}

public string Condition { get; }

public string StackTrace { get; }

public LogType Type { get; }

public DateTime CreatedAt { get; }
public double CreatedAt { get; }


}
}
7 changes: 3 additions & 4 deletions tests/UnityEngine/Time.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using System;
namespace UnityEngine
namespace UnityEngine
{
public class Time
{

public static float realtimeSinceStartup { get; set; }

}
}
}

0 comments on commit 7cd57e3

Please sign in to comment.