Skip to content

Commit

Permalink
Added missing SetPriorityClass() and SetThreadPriority() to Kernel32 …
Browse files Browse the repository at this point in the history
…class.
  • Loading branch information
dEajL3kA committed Aug 11, 2023
1 parent 5deb581 commit c2ecd67
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 0 deletions.
47 changes: 47 additions & 0 deletions contrib/platform/src/com/sun/jna/platform/win32/Kernel32.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,35 @@ public interface Kernel32 extends StdCallLibrary, WinNT, Wincon {
*/
int LOAD_LIBRARY_AS_DATAFILE = 0x2;

/**
* Process priority classes
*/
DWORD NORMAL_PRIORITY_CLASS = new DWORD(0x00000020L);
DWORD IDLE_PRIORITY_CLASS = new DWORD(0x00000040L);
DWORD HIGH_PRIORITY_CLASS = new DWORD(0x00000080L);
DWORD REALTIME_PRIORITY_CLASS = new DWORD(0x00000100L);
DWORD BELOW_NORMAL_PRIORITY_CLASS = new DWORD(0x00004000L);
DWORD ABOVE_NORMAL_PRIORITY_CLASS = new DWORD(0x00008000L);
DWORD PROCESS_MODE_BACKGROUND_BEGIN = new DWORD(0x00100000L);
DWORD PROCESS_MODE_BACKGROUND_END = new DWORD(0x00200000L);

/**
* Thread priorities
*/
int THREAD_PRIORITY_IDLE = -15
int THREAD_PRIORITY_LOWEST = -2
int THREAD_PRIORITY_BELOW_NORMAL = -1
int THREAD_PRIORITY_NORMAL = 0
int THREAD_PRIORITY_ABOVE_NORMAL = 1
int THREAD_PRIORITY_HIGHEST = 2
int THREAD_PRIORITY_TIME_CRITICAL = 15

/**
* Thread mode flags
*/
int THREAD_MODE_BACKGROUND_BEGIN = 0x10000
int THREAD_MODE_BACKGROUND_END = 0x20000

/**
* Reads data from the specified file or input/output (I/O) device. Reads
* occur at the position specified by the file pointer if supported by the
Expand Down Expand Up @@ -4152,6 +4181,24 @@ Pointer VirtualAllocEx(HANDLE hProcess, Pointer lpAddress, SIZE_T dwSize,
*/
boolean GetExitCodeThread(HANDLE hThread, IntByReference exitCode);

/**
* Sets the priority class for the specified process.
*
* @param hProcess A handle to the process.
* @param dwPriorityClass The priority class for the process.
* @return If the function succeeds, the return value is nonzero.
*/
boolean SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass);

/**
* Sets the priority value for the specified thread.
*
* @param hThread A handle to the thread whose priority value is to be set.
* @param nPriority The priority value for the thread.
* @return If the function succeeds, the return value is nonzero.
*/
boolean SetThreadPriority(HANDLE hThread, int nPriority);

/**
* Releases, decommits, or releases and decommits a region of memory within
* the virtual address space of a specified process.
Expand Down
74 changes: 74 additions & 0 deletions contrib/platform/src/com/sun/jna/platform/win32/Kernel32Util.java
Original file line number Diff line number Diff line change
Expand Up @@ -1258,6 +1258,80 @@ public static String expandEnvironmentStrings(String input) {
}
}

/**
* Sets the priority class for the current process.
*
* @param dwPriorityClass The priority class for the process.
* @throws Win32Exception if an error occurs.
*/
public static void setCurrentProcessPriority(final DWORD dwPriorityClass) {
if (!Kernel32.INSTANCE.SetPriorityClass(Kernel32.INSTANCE.GetCurrentProcess(), dwPriorityClass)) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
}

/**
* Sets the priority value for the current thread.
*
* @param nPriority The priority value for the thread.
* @throws Win32Exception if an error occurs.
*/
public static void setCurrentThreadPriority(final int nPriority) {
if (!Kernel32.INSTANCE.SetThreadPriority(Kernel32.INSTANCE.GetCurrentThread(), nPriority)) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
}

/**
* Sets the priority class for the specified process.
*
* @param pid Identifier for the running process.
* @param dwPriorityClass The priority class for the process.
* @throws Win32Exception if an error occurs.
*/
public static final void setProcessPriority(final int pid, final DWORD dwPriorityClass) {
final HANDLE hProcess = Kernel32.INSTANCE.OpenProcess(WinNT.PROCESS_SET_INFORMATION, false, pid);
if (hProcess == null) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}

Win32Exception we = null;
try {
if (!Kernel32.INSTANCE.SetPriorityClass(hProcess, dwPriorityClass)) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
} catch (final Win32Exception e) {
we = e;
} finally {
cleanUp(hProcess, we);
}
}

/**
* Sets the priority value for the specified thread.
*
* @param tid Identifier for the running thread.
* @param nPriority The priority value for the thread.
* @throws Win32Exception if an error occurs.
*/
public static void setThreadPriority(final int tid, final int nPriority) {
final HANDLE hThread = Kernel32.INSTANCE.OpenThread(WinNT.THREAD_SET_INFORMATION, false, pid);
if (hThread == null) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}

Win32Exception we = null;
try {
if (!Kernel32.INSTANCE.SetThreadPriority(hThread, nPriority)) {
throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
}
} catch (final Win32Exception e) {
we = e;
} finally {
cleanUp(hThread, we);
}
}

private static void cleanUp(final HANDLE h, Win32Exception we) {
try {
closeHandle(h);
Expand Down

0 comments on commit c2ecd67

Please sign in to comment.