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));
            }
        }