Ejemplo n.º 1
0
        public static bool CpuIdTx(uint index, uint ecxValue, out uint eax, out uint ebx, out uint ecx, out uint edx, GroupAffinity affinity)
        {
            GroupAffinity previousAffinity = ThreadAffinity.Set(affinity);

            if (previousAffinity == GroupAffinity.Undefined)
            {
                eax = ebx = ecx = edx = 0;
                return(false);
            }

            CpuId(index, ecxValue, out eax, out ebx, out ecx, out edx);
            ThreadAffinity.Set(previousAffinity);
            return(true);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Sets the processor group affinity for the current thread.
        /// </summary>
        /// <param name="affinity">The processor group affinity.</param>
        /// <returns>The previous processor group affinity.</returns>
        public static GroupAffinity Set(GroupAffinity affinity)
        {
            if (affinity == GroupAffinity.Undefined)
            {
                return(GroupAffinity.Undefined);
            }


            if (Software.OperatingSystem.IsUnix)
            {
                if (affinity.Group > 0)
                {
                    throw new ArgumentOutOfRangeException(nameof(affinity));
                }


                ulong result = 0;
                if (LibC.sched_getaffinity(0, (IntPtr)8, ref result) != 0)
                {
                    return(GroupAffinity.Undefined);
                }


                ulong mask = affinity.Mask;
                if (LibC.sched_setaffinity(0, (IntPtr)8, ref mask) != 0)
                {
                    return(GroupAffinity.Undefined);
                }


                return(new GroupAffinity(0, result));
            }

            UIntPtr uIntPtrMask;

            try
            {
                uIntPtrMask = (UIntPtr)affinity.Mask;
            }
            catch (OverflowException)
            {
                throw new ArgumentOutOfRangeException(nameof(affinity));
            }

            var groupAffinity = new Kernel32.GROUP_AFFINITY {
                Group = affinity.Group, Mask = uIntPtrMask
            };

            IntPtr currentThread = Kernel32.GetCurrentThread();

            try
            {
                if (Kernel32.SetThreadGroupAffinity(currentThread,
                                                    ref groupAffinity,
                                                    out Kernel32.GROUP_AFFINITY previousGroupAffinity))
                {
                    return(new GroupAffinity(previousGroupAffinity.Group, (ulong)previousGroupAffinity.Mask));
                }

                return(GroupAffinity.Undefined);
            }
            catch (EntryPointNotFoundException)
            {
                if (affinity.Group > 0)
                {
                    throw new ArgumentOutOfRangeException(nameof(affinity));
                }


                ulong previous = (ulong)Kernel32.SetThreadAffinityMask(currentThread, uIntPtrMask);

                return(new GroupAffinity(0, previous));
            }
        }