#include #include #include #include #include #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