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 104 105 106 107 108 109 110 111
|
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
#include <windows.h>
#include <winbase.h>
=pod
Routines to manipulate CPU affinity of Win32 threads, including the
I<pseudo-processes> created by a C<fork> call on MSWin32.
=cut
#if (_WIN32_WINNT < 0x0500) && (_WIN32_WINDOWS < 0x0490)
WINBASEAPI HANDLE WINAPI OpenThread(DWORD,BOOL,DWORD);
#endif
int win32_set_thread_affinity(DWORD thread_id, DWORD mask)
{
HANDLE handle;
DWORD result1, result2;
if (thread_id <= 0) {
thread_id = GetCurrentThreadId();
}
handle = OpenThread(0x0060, 0, thread_id);
#ifdef DEBUG
fprintf(stderr, "win32_set_thread_affinity(%d,%d) called\n",
thread_id, mask);
fprintf(stderr, "HANDLE (%d) IS %d.\n", (int) thread_id, (int) handle);
#endif
if (handle == NULL) {
return 0;
}
result1 = SetThreadAffinityMask(handle, mask);
result2 = SetThreadAffinityMask(handle, mask);
#ifdef DEBUG
fprintf(stderr,"SetThreadAffinityMask(%d,0x%x) => %d %d\n",
(int) handle, mask, (int) result1, (int) result2);
if (result1 == 0 || result2 == 0) {
fprintf(stderr, "win32_set_thread_affinity: Error %d\n",
GetLastError());
}
#endif
CloseHandle(handle);
return (int) result1;
}
int win32_get_thread_affinity(DWORD thread_id)
{
DWORD mask = 1;
HANDLE handle;
DWORD result1, result2, result3;
if (thread_id <= 0) {
thread_id = GetCurrentThreadId();
}
handle = OpenThread(0x0040, 0, thread_id);
if (handle == NULL) {
handle = OpenThread(0x0200, 0, thread_id);
}
if (handle == NULL) {
fprintf(stderr, "could not obtain handle for thread id %d\n",
thread_id);
return 0;
}
result1 = SetThreadAffinityMask(handle, mask);
result2 = SetThreadAffinityMask(handle, result1);
result3 = SetThreadAffinityMask(handle, result1);
#ifdef DEBUG
fprintf(stderr, "win32_get_thread_affinity(%d) called\n", thread_id);
fprintf(stderr, "HANDLE (%d) IS %d\n", (int) thread_id, (int) handle);
fprintf(stderr,
"SetThreadAffinityMask(%d,[0x%x,0x%x,0x%x]) => 0x%x, 0x%x, 0x%x\n",
(int) handle, mask, result1, result1, result1, result2, result3);
if (result1 == 0 || result2 == 0 || result3 == 0) {
fprintf(stderr, "win32_get_thread_affinity: %d\n", GetLastError());
}
if (result3 != result1) {
fprintf(stderr, "win32_get_thread_affinity: %d != %d\n",
result1, result3);
}
#endif
CloseHandle(handle);
return (int) result1;
}
MODULE = Sys::CpuAffinity PACKAGE = Sys::CpuAffinity
int
xs_win32_getAffinity_thread(pid)
int pid
CODE:
RETVAL = win32_get_thread_affinity(pid);
OUTPUT:
RETVAL
int
xs_win32_setAffinity_thread(pid,mask)
int pid
int mask
CODE:
RETVAL = win32_set_thread_affinity(pid,mask);
OUTPUT:
RETVAL
|