File: Core\NativeSafeHandle.cs
Web Access
Project: src\src\Servers\IIS\IIS\src\Microsoft.AspNetCore.Server.IIS.csproj (Microsoft.AspNetCore.Server.IIS)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Runtime.InteropServices;
using System.Threading.Tasks.Sources;
 
namespace Microsoft.AspNetCore.Server.IIS.Core;
 
internal sealed class NativeSafeHandle : SafeHandle, IValueTaskSource<object?>
{
    private ManualResetValueTaskSourceCore<object?> _core; // mutable struct; do not make this readonly
 
    public override bool IsInvalid => handle == IntPtr.Zero;
    public short Version => _core.Version;
 
    public NativeSafeHandle(IntPtr handle) : base(IntPtr.Zero, ownsHandle: true)
    {
        this.handle = handle;
    }
 
    protected override bool ReleaseHandle()
    {
        handle = IntPtr.Zero;
 
        // Complete the ManualResetValueTaskSourceCore
        if (_core.GetStatus(_core.Version) == ValueTaskSourceStatus.Pending)
        {
            _core.SetResult(null);
        }
 
        return true;
    }
 
    public object? GetResult(short token)
    {
        return _core.GetResult(token);
    }
 
    public ValueTaskSourceStatus GetStatus(short token)
    {
        return _core.GetStatus(token);
    }
 
    public void OnCompleted(Action<object?> continuation, object? state, short token, ValueTaskSourceOnCompletedFlags flags)
    {
        _core.OnCompleted(continuation, state, token, flags);
    }
}