File: Internal\Runtime\TypeLoader\LockFreeObjectInterner.cs
Web Access
Project: src\runtime\src\coreclr\nativeaot\System.Private.TypeLoader\src\System.Private.TypeLoader.csproj (System.Private.TypeLoader)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Runtime.InteropServices;

namespace Internal.TypeSystem
{
    public class LockFreeObjectInterner : LockFreeReaderHashtableOfPointers<object, GCHandle>
    {
        private static readonly LockFreeObjectInterner s_interner = new LockFreeObjectInterner();
        public static GCHandle GetInternedObjectHandle(object obj)
        {
            return s_interner.GetOrCreateValue(obj);
        }

        /// <summary>
        /// Given a key, compute a hash code. This function must be thread safe.
        /// </summary>
        protected override int GetKeyHashCode(object key)
        {
            return key.GetHashCode();
        }

        /// <summary>
        /// Given a value, compute a hash code which would be identical to the hash code
        /// for a key which should look up this value. This function must be thread safe.
        /// </summary>
        protected override int GetValueHashCode(GCHandle value)
        {
            return value.Target.GetHashCode();
        }

        /// <summary>
        /// Compare a key and value. If the key refers to this value, return true.
        /// This function must be thread safe.
        /// </summary>
        protected override bool CompareKeyToValue(object key, GCHandle value)
        {
            return key == value.Target;
        }

        /// <summary>
        /// Compare a value with another value. Return true if values are equal.
        /// This function must be thread safe.
        /// </summary>
        protected override bool CompareValueToValue(GCHandle value1, GCHandle value2)
        {
            return value1.Target == value2.Target;
        }

        /// <summary>
        /// Create a new value from a key. Must be threadsafe. Value may or may not be added
        /// to collection. Return value must not be null.
        /// </summary>
        protected override GCHandle CreateValueFromKey(object key)
        {
            return GCHandle.Alloc(key);
        }

        /// <summary>
        /// Convert a value to an IntPtr for storage into the hashtable
        /// </summary>
        protected override IntPtr ConvertValueToIntPtr(GCHandle value)
        {
            return GCHandle.ToIntPtr(value);
        }

        /// <summary>
        /// Convert an IntPtr into a value for comparisons, or for returning.
        /// </summary>
        protected override GCHandle ConvertIntPtrToValue(IntPtr pointer)
        {
            return GCHandle.FromIntPtr(pointer);
        }
    }
}