Hardware/ThreadAffinity.cs
author sl
Sun, 03 Feb 2013 18:01:50 +0100
changeset 391 ca4c0e7ae75d
parent 238 bddc6e01840a
permissions -rwxr-xr-x
Converted project to VisualStudio 2012.
Adding SoundGraphDisplay and SensorFrontView classes.
They were respectively based on SystemTray and SensorNotifyIcon.
SoundGraphDisplay is now able to load iMONDisplay.dll providing it lives on your PATH.
Adding option to sensor context menu for adding it into FrontView.
moel@344
     1
/*
moel@344
     2
 
moel@344
     3
  This Source Code Form is subject to the terms of the Mozilla Public
moel@344
     4
  License, v. 2.0. If a copy of the MPL was not distributed with this
moel@344
     5
  file, You can obtain one at http://mozilla.org/MPL/2.0/.
moel@344
     6
 
moel@344
     7
  Copyright (C) 2010 Michael Möller <mmoeller@openhardwaremonitor.org>
moel@344
     8
	
moel@238
     9
*/
moel@238
    10
moel@238
    11
using System;
moel@238
    12
using System.Runtime.InteropServices;
moel@238
    13
moel@238
    14
namespace OpenHardwareMonitor.Hardware {
moel@238
    15
  
moel@238
    16
  internal static class ThreadAffinity {
moel@238
    17
  
moel@238
    18
    public static ulong Set(ulong mask) { 
moel@238
    19
      if (mask == 0)
moel@238
    20
        return 0;
moel@238
    21
        
moel@238
    22
      int p = (int)Environment.OSVersion.Platform;
moel@238
    23
      if ((p == 4) || (p == 128)) { // Unix
moel@238
    24
        ulong result = 0;
moel@238
    25
        if (NativeMethods.sched_getaffinity(0, (IntPtr)Marshal.SizeOf(result), 
moel@238
    26
          ref result) != 0)          
moel@238
    27
          return 0;
moel@238
    28
        if (NativeMethods.sched_setaffinity(0, (IntPtr)Marshal.SizeOf(mask), 
moel@238
    29
          ref mask) != 0)
moel@238
    30
          return 0;
moel@238
    31
        return result;
moel@238
    32
      } else { // Windows      
moel@238
    33
        return (ulong)NativeMethods.SetThreadAffinityMask(
moel@238
    34
          NativeMethods.GetCurrentThread(), (UIntPtr)mask);
moel@238
    35
      }
moel@238
    36
    }
moel@238
    37
  
moel@238
    38
    private static class NativeMethods {      
moel@238
    39
      private const string KERNEL = "kernel32.dll";
moel@238
    40
moel@238
    41
      [DllImport(KERNEL, CallingConvention = CallingConvention.Winapi)]
moel@238
    42
      public static extern UIntPtr
moel@238
    43
        SetThreadAffinityMask(IntPtr handle, UIntPtr mask);
moel@238
    44
moel@238
    45
      [DllImport(KERNEL, CallingConvention = CallingConvention.Winapi)]
moel@238
    46
      public static extern IntPtr GetCurrentThread();       
moel@238
    47
      
moel@238
    48
      private const string LIBC = "libc";
moel@238
    49
      
moel@238
    50
      [DllImport(LIBC)]
moel@238
    51
      public static extern int sched_getaffinity(int pid, IntPtr maskSize,
moel@238
    52
        ref ulong mask);
moel@238
    53
      
moel@238
    54
      [DllImport(LIBC)]
moel@238
    55
      public static extern int sched_setaffinity(int pid, IntPtr maskSize,
moel@238
    56
        ref ulong mask);  
moel@238
    57
    }  
moel@238
    58
  }
moel@238
    59
}
moel@238
    60