Files
Xune/UIX.RenderApi.Skia/Microsoft/Iris/Render/Protocol/DataBufferTracker.cs
T

152 lines
5.4 KiB
C#
Raw Normal View History

2021-07-11 22:59:29 -05:00
// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.Render.Protocol.DataBufferTracker
// Assembly: UIX.RenderApi, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: D47658B8-A8EA-43D6-8837-ECE823BFFFC1
// Assembly location: C:\Program Files\Zune\UIX.RenderApi.dll
using Microsoft.Iris.Render.Internal;
using System;
namespace Microsoft.Iris.Render.Protocol
{
2021-07-11 23:04:40 -05:00
internal class DataBufferTracker
2021-07-11 22:59:29 -05:00
{
2021-07-11 23:04:40 -05:00
private Vector m_alTracking;
2021-07-11 22:59:29 -05:00
2021-07-11 23:04:40 -05:00
internal DataBufferTracker(object objUser) => this.m_alTracking = new Vector();
2021-07-11 22:59:29 -05:00
2021-07-11 23:04:40 -05:00
~DataBufferTracker() => this.Dispose(false);
2021-07-11 22:59:29 -05:00
2021-07-11 23:04:40 -05:00
internal void Dispose()
2021-07-11 22:59:29 -05:00
{
2021-07-11 23:07:04 -05:00
GC.SuppressFinalize(this);
2021-07-11 23:04:40 -05:00
this.Dispose(true);
}
private void Dispose(bool fInDispose)
{
if (fInDispose && this.m_alTracking != null && this.m_alTracking.Count > 0)
{
foreach (DataBufferTracker.TrackingInfo trackingInfo in this.m_alTracking)
trackingInfo.DataBuffer.Dispose();
this.m_alTracking.Clear();
}
2021-07-11 23:07:04 -05:00
this.m_alTracking = null;
2021-07-11 23:04:40 -05:00
}
internal int Count => this.m_alTracking.Count;
internal string DEBUG_Description => (string)null;
internal object DEBUG_User => (object)null;
internal event EventHandler TrackerEmpty;
protected virtual void OnTrackerEmpty(object sender, EventArgs args)
{
if (this.TrackerEmpty == null)
return;
this.TrackerEmpty(sender, args);
}
2021-07-11 23:07:04 -05:00
internal void Track(DataBuffer dataBuffer) => this.Track(dataBuffer, null, null);
2021-07-11 23:04:40 -05:00
internal void Track(
DataBuffer dataBuffer,
DataBufferTracker.CleanupEventHandler handler,
object contextData)
{
2021-07-11 23:07:04 -05:00
DataBufferTracker.TrackingInfo trackingInfo = new DataBufferTracker.TrackingInfo(dataBuffer, Users.Valid, handler, contextData);
2021-07-11 23:04:40 -05:00
dataBuffer.DataConsumed += new EventHandler(this.OnDataConsumed);
dataBuffer.ReleaseLocalData += new EventHandler(this.OnReleaseLocalData);
2021-07-11 23:07:04 -05:00
this.m_alTracking.Add(trackingInfo);
2021-07-11 23:04:40 -05:00
}
internal void Release(DataBuffer dataBuffer, DataBufferTracker.Users userFlags)
{
2021-07-11 23:07:04 -05:00
DataBufferTracker.TrackingInfo trackingInfo1 = null;
2021-07-11 23:04:40 -05:00
foreach (DataBufferTracker.TrackingInfo trackingInfo2 in this.m_alTracking)
{
if (trackingInfo2.DataBuffer == dataBuffer)
{
trackingInfo1 = trackingInfo2;
break;
}
}
if (trackingInfo1 == null)
return;
uint userFlags1 = (uint)trackingInfo1.UserFlags;
Bits.ClearFlag(ref userFlags1, (uint)userFlags);
trackingInfo1.UserFlags = (DataBufferTracker.Users)userFlags1;
if (userFlags1 != 0U)
return;
if (trackingInfo1.CleanupHandler != null)
2021-07-11 23:07:04 -05:00
trackingInfo1.CleanupHandler(this, new DataBufferTracker.CleanupEventArgs(trackingInfo1.CleanupHandlerData));
this.m_alTracking.Remove(trackingInfo1);
2021-07-11 23:04:40 -05:00
trackingInfo1.DataBuffer.DataConsumed -= new EventHandler(this.OnDataConsumed);
trackingInfo1.DataBuffer.ReleaseLocalData -= new EventHandler(this.OnReleaseLocalData);
trackingInfo1.DataBuffer.Dispose();
2021-07-11 23:07:04 -05:00
trackingInfo1.DataBuffer = null;
trackingInfo1.CleanupHandler = null;
trackingInfo1.CleanupHandlerData = null;
2021-07-11 23:04:40 -05:00
if (this.m_alTracking.Count != 0)
return;
2021-07-11 23:07:04 -05:00
this.OnTrackerEmpty(this, EventArgs.Empty);
2021-07-11 23:04:40 -05:00
}
2021-07-11 23:07:04 -05:00
private void OnDataConsumed(object oSender, EventArgs args) => this.Release(oSender as DataBuffer, Users.Consumed);
2021-07-11 23:04:40 -05:00
2021-07-11 23:07:04 -05:00
private void OnReleaseLocalData(object oSender, EventArgs args) => this.Release(oSender as DataBuffer, Users.LocalData);
2021-07-11 23:04:40 -05:00
internal void DEBUG_SetDescription(string stDescription)
{
}
internal void DEBUG_DumpTrackingList()
{
}
[System.Flags]
internal enum Users : uint
{
Consumed = 1,
LocalData = 2,
Valid = LocalData | Consumed, // 0x00000003
}
internal class CleanupEventArgs : EventArgs
{
public object ContextData;
internal CleanupEventArgs(object contextData) => this.ContextData = contextData;
}
internal delegate void CleanupEventHandler(
object sender,
DataBufferTracker.CleanupEventArgs args);
private class TrackingInfo
{
private static uint s_idSeed;
internal DataBuffer DataBuffer;
internal DataBufferTracker.Users UserFlags;
internal uint Id;
internal DataBufferTracker.CleanupEventHandler CleanupHandler;
internal object CleanupHandlerData;
internal TrackingInfo(
DataBuffer dataBuffer,
DataBufferTracker.Users userFlags,
DataBufferTracker.CleanupEventHandler handler,
object contextData)
{
this.DataBuffer = dataBuffer;
this.UserFlags = userFlags;
2021-07-11 23:07:04 -05:00
this.Id = s_idSeed++;
2021-07-11 23:04:40 -05:00
this.CleanupHandler = handler;
this.CleanupHandlerData = contextData;
}
2021-07-11 22:59:29 -05:00
}
}
}