File: win32_processaffinity.xs

package info (click to toggle)
libsys-cpuaffinity-perl 1.13~03-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 252 kB
  • sloc: perl: 1,261; makefile: 3
file content (103 lines) | stat: -rw-r--r-- 2,219 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>

#include <windows.h>
#include <winbase.h>

=pod

Routines to manipulate CPU affinity of Win32 processes.
   
=cut

#if (_WIN32_WINNT < 0x0500) && (_WIN32_WINDOWS < 0x0490)
WINBASEAPI HANDLE WINAPI OpenThread(DWORD,BOOL,DWORD);
#endif

int win32_set_process_affinity(DWORD process_id, DWORD mask)
{
  HANDLE handle;
  BOOL result1;

  if (process_id <= 0) {
    process_id = GetCurrentProcessId();
  }
  handle = OpenProcess(0x0600, 0, process_id);

#ifdef DEBUG
	fprintf(stderr, "win32_set_process_affinity(%d,%d) called\n",
		process_id, mask);
	fprintf(stderr, "HANDLE(%d) IS %d.\n", (int) process_id, (int) handle);
#endif

  if (handle == NULL) {
    return 0;
  }
  result1 = SetProcessAffinityMask(handle, mask);

#ifdef DEBUG
	if (result1 == 0) {
		fprintf(stderr, "win32_set_process_affinity: Error %d\n", 
			GetLastError());
	}
	fprintf(stderr,"SetProcessAffinityMask(%d,0x%x) => %d\n",
		(int) handle, mask, (int) result1);
#endif

  CloseHandle(handle);
  return (int) result1;
}

int win32_get_process_affinity(DWORD process_id)
{
  DWORD_PTR procMask = 0;
  DWORD_PTR sysMask = 0;
  HANDLE handle;
  BOOL result1;

  if (process_id <= 0) {
    process_id = GetCurrentProcessId();
  }
  handle = OpenProcess(0x0400, 0, process_id);
  if (handle == NULL) {
    handle = OpenProcess(0x1000, 0, process_id);
  }
  if (handle == NULL) {
    return 0;
  }
  result1 = GetProcessAffinityMask(handle, &procMask, &sysMask);
#ifdef DEBUG
	fprintf(stderr, "win32_get_process_affinity(%d) called\n", process_id);
	fprintf(stderr, "HANDLE (%d) IS %d\n", (int) process_id, (int) handle);
	fprintf(stderr, "GetProcessAffinityMask(%d) => %d %d: %d\n",
		handle, procMask, sysMask, (int) result1);
	if (result1 == 0) {
		fprintf(stderr, "win32_get_process_affinity: %d\n", 
			GetLastError());
	}
#endif
  CloseHandle(handle);
  return (int) procMask;
}

MODULE = Sys::CpuAffinity        PACKAGE = Sys::CpuAffinity

int
xs_win32_getAffinity_proc(pid)
	int pid
	CODE:
		RETVAL = win32_get_process_affinity(pid);
	OUTPUT:
		RETVAL

int
xs_win32_setAffinity_proc(pid,mask)
	int pid
	int mask
	CODE:
		RETVAL = win32_set_process_affinity(pid,mask);
	OUTPUT:
		RETVAL