Files
ReLibreHardwareMonitor/LibreHardwareMonitorLib/Hardware/ThreadAffinity.cs
T

43 lines
1.4 KiB
C#

// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Copyright (C) LibreHardwareMonitor and Contributors.
// Partial Copyright (C) Michael Möller <mmoeller@openhardwaremonitor.org> and Contributors.
// All Rights Reserved.
using System;
using System.Runtime.InteropServices;
namespace LibreHardwareMonitor.Hardware
{
internal static class ThreadAffinity
{
public static ulong Set(ulong mask)
{
if (mask == 0)
return 0;
if (Software.OperatingSystem.IsLinux)
{
ulong result = 0;
if (Interop.LibC.sched_getaffinity(0, (IntPtr)Marshal.SizeOf(result), ref result) != 0)
return 0;
return Interop.LibC.sched_setaffinity(0, (IntPtr)Marshal.SizeOf(mask), ref mask) != 0 ? (ulong) 0 : result;
}
UIntPtr uIntPtrMask;
try
{
uIntPtrMask = (UIntPtr)mask;
}
catch (OverflowException)
{
throw new ArgumentOutOfRangeException(nameof(mask));
}
return (ulong)Interop.Kernel32.SetThreadAffinityMask(Interop.Kernel32.GetCurrentThread(), uIntPtrMask);
}
}
}