43 lines
1.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
|