static T GetOrRegisterHolder()
        {
            if (ms_key == null)
            {
                return(default(T));
            }

            var funcPtr = default(IntPtr);

            if (InstanceGetters.TryGet(ms_key, out funcPtr))
            {
                using (InstanceGetters.DisableProcessing())
                    return(GetHolderCore(ms_t, funcPtr));
            }
            else
            {
                var funcPtrTmp = default(IntPtr);
                using (InstanceGetters.DisableProcessing())
                    funcPtrTmp = GetFunctionPointerCore(ms_t);

                while (!InstanceGetters.GetOrAdd(ms_key, funcPtrTmp, out funcPtr))
                {
                    ;
                }

                using (InstanceGetters.DisableProcessing())
                    return(GetHolderCore(ms_t, funcPtr));
            }
        }
        static bool TryGetHolder(out T holder)
        {
            holder = default(T);
            if (ms_key == null)
            {
                return(false);
            }

            var funcPtr = default(IntPtr);

            if (!InstanceGetters.TryGet(ms_key, out funcPtr))
            {
                holder = null;
                return(false);
            }
            else
            {
                using (InstanceGetters.DisableProcessing())
                    holder = GetHolderCore(ms_t, funcPtr);
                return(true);
            }
        }