Example #1
0
        private void UpdateCPULimits()
        {
            NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION cpuRateControlLimit = new NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION();

            if (this.cpuPercentageLimit != 0)
            {
                cpuRateControlLimit.ControlFlags = (uint)(
                    NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION.CpuRateControlFlags.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE |
                    NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION.CpuRateControlFlags.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP
                    );

                cpuRateControlLimit.CpuRate = (uint)Math.Floor(this.cpuPercentageLimit * 100);

                int    cpuRateControlLimitLength = Marshal.SizeOf(typeof(NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION));
                IntPtr cpuRateControlLimitPtr    = Marshal.AllocHGlobal(cpuRateControlLimitLength);

                try
                {
                    Marshal.StructureToPtr(cpuRateControlLimit, cpuRateControlLimitPtr, false);

                    bool success = NativeMethods.SetInformationJobObject(this.jobHandle, NativeMethods.JobObjectInfoClass.JobObjectCpuRateControlInformation, cpuRateControlLimitPtr, (uint)cpuRateControlLimitLength);

                    if (success == false)
                    {
                        int error = Marshal.GetLastWin32Error();
                        throw new Win32Exception(error, "SetInformationJobObject failed for setting CPU limits.");
                    }
                }
                finally
                {
                    Marshal.FreeHGlobal(cpuRateControlLimitPtr);
                }
            }
        }
Example #2
0
        private void UpdateCPULimits()
        {
            NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION cpuRateControlLimit = new NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION();

            if (this.cpuPercentageLimit != 0)
            {
                cpuRateControlLimit.ControlFlags = (uint)(
                    NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION.CpuRateControlFlags.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE |
                    NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION.CpuRateControlFlags.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP
                    );

                cpuRateControlLimit.CpuRate = (uint)Math.Floor(this.cpuPercentageLimit * 100);

                int cpuRateControlLimitLength = Marshal.SizeOf(typeof(NativeMethods.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION));
                IntPtr cpuRateControlLimitPtr = Marshal.AllocHGlobal(cpuRateControlLimitLength);

                try
                {
                    Marshal.StructureToPtr(cpuRateControlLimit, cpuRateControlLimitPtr, false);

                    bool success = NativeMethods.SetInformationJobObject(this.jobHandle, NativeMethods.JobObjectInfoClass.JobObjectCpuRateControlInformation, cpuRateControlLimitPtr, (uint)cpuRateControlLimitLength);

                    if (success == false)
                    {
                        int error = Marshal.GetLastWin32Error();
                        throw new Win32Exception(error, "SetInformationJobObject failed for setting CPU limits.");
                    }
                }
                finally
                {
                    Marshal.FreeHGlobal(cpuRateControlLimitPtr);
                }
            }
        }