mirror of
https://github.com/Facepunch/Facepunch.Steamworks.git
synced 2025-02-26 21:41:19 +03:00
Some collection modified safety in Dispatch (seeing a few exceptions on Rust staging)
This commit is contained in:
parent
5aeeaa0cd7
commit
e6c0167c48
@ -65,12 +65,23 @@ namespace Steamworks
|
|||||||
SteamAPI_ManualDispatch_Init();
|
SteamAPI_ManualDispatch_Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
|
||||||
|
/// </summary>
|
||||||
|
static bool runningFrame = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Calls RunFrame and processes events from this Steam Pipe
|
/// Calls RunFrame and processes events from this Steam Pipe
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static void Frame( HSteamPipe pipe )
|
internal static void Frame( HSteamPipe pipe )
|
||||||
{
|
{
|
||||||
|
if ( runningFrame )
|
||||||
|
return;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
runningFrame = true;
|
||||||
|
|
||||||
SteamAPI_ManualDispatch_RunFrame( pipe );
|
SteamAPI_ManualDispatch_RunFrame( pipe );
|
||||||
SteamNetworkingUtils.OutputDebugMessages();
|
SteamNetworkingUtils.OutputDebugMessages();
|
||||||
|
|
||||||
@ -88,6 +99,19 @@ namespace Steamworks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
runningFrame = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// To be safe we don't call the continuation functions while iterating
|
||||||
|
/// the Callback list. This is maybe overly safe because the only way this
|
||||||
|
/// could be an issue is if the callback list is modified in the continuation
|
||||||
|
/// which would only happen if starting or shutting down in the callback.
|
||||||
|
/// </summary>
|
||||||
|
static List<Action<IntPtr>> actionsToCall = new List<Action<IntPtr>>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A callback is a general global message
|
/// A callback is a general global message
|
||||||
@ -108,13 +132,22 @@ namespace Steamworks
|
|||||||
|
|
||||||
if ( Callbacks.TryGetValue( msg.Type, out var list ) )
|
if ( Callbacks.TryGetValue( msg.Type, out var list ) )
|
||||||
{
|
{
|
||||||
|
actionsToCall.Clear();
|
||||||
|
|
||||||
foreach ( var item in list )
|
foreach ( var item in list )
|
||||||
{
|
{
|
||||||
if ( item.server != isServer )
|
if ( item.server != isServer )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
item.action( msg.Data );
|
actionsToCall.Add( item.action );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ( var action in actionsToCall )
|
||||||
|
{
|
||||||
|
action( msg.Data );
|
||||||
|
}
|
||||||
|
|
||||||
|
actionsToCall.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user