4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-23 00:59:51 +08:00
Christian Franke efa5401ea9 Cygwin: /proc/<PID>/stat: set field (18) according to scheduling policy
If a realtime policy is selected, set the '(18) priority' field to the
negated sched_priority minus one.  If SCHED_IDLE is selected, set it to
the lowest priority 39.  Also set '(19) nice' to the originally requested
nice value.  Ensure consistence with the current Windows priority in all
cases.  Move the sched_priority from/to Windows priority mapping from
sched_get/setparam() to new functions in miscfuncs.cc.

Signed-off-by: Christian Franke <christian.franke@t-online.de>
2024-12-17 17:39:00 +01:00

110 lines
3.5 KiB
C++

/* miscfuncs.h: Internal functions not having a better home
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#ifndef _MISCFUNCS_H
#define _MISCFUNCS_H
#include <dinput.h>
#define likely(X) __builtin_expect (!!(X), 1)
#define unlikely(X) __builtin_expect (!!(X), 0)
/* Check for Alt+Numpad keys in a console input record. These are used to
enter codepoints not available in the current keyboard layout For details
see http://www.fileformat.info/tip/microsoft/enter_unicode.htm */
static inline bool
is_alt_numpad_key (PINPUT_RECORD pirec)
{
/* Remove lock key state from ControlKeyState. Do not remove enhanced key
state since it helps to distinguish between cursor (EK) and numpad keys
(non-EK). */
DWORD ctrl_state = pirec->Event.KeyEvent.dwControlKeyState
& ~(CAPSLOCK_ON | NUMLOCK_ON | SCROLLLOCK_ON);
return pirec->Event.KeyEvent.uChar.UnicodeChar == 0
&& ctrl_state == LEFT_ALT_PRESSED
&& pirec->Event.KeyEvent.wVirtualScanCode >= DIK_NUMPAD7
&& pirec->Event.KeyEvent.wVirtualScanCode <= DIK_NUMPAD0
&& pirec->Event.KeyEvent.wVirtualScanCode != DIK_SUBTRACT;
}
/* Event for left Alt, with a non-zero character, comes from Alt+Numpad
key sequence. e.g. <left-alt> 233 => &eacute; This is typically handled
as the key up event after releasing the Alt key. */
static inline bool
is_alt_numpad_event (PINPUT_RECORD pirec)
{
return pirec->Event.KeyEvent.uChar.UnicodeChar != 0
&& pirec->Event.KeyEvent.wVirtualKeyCode == VK_MENU
&& pirec->Event.KeyEvent.wVirtualScanCode == 0x38;
}
int winprio_to_nice (DWORD prio, bool batch = false);
DWORD nice_to_winprio (int &nice, bool batch = false);
int winprio_to_schedprio (DWORD prio);
DWORD schedprio_to_winprio (int schedprio);
bool set_and_check_winprio (HANDLE proc, DWORD prio, bool set = true);
bool create_pipe (PHANDLE, PHANDLE, LPSECURITY_ATTRIBUTES, DWORD);
BOOL CreatePipeOverlapped (PHANDLE read_handle, PHANDLE write_handle,
LPSECURITY_ATTRIBUTES sa);
BOOL ReadPipeOverlapped (HANDLE h, PVOID buf, DWORD len,
LPDWORD ret_len, DWORD timeout);
BOOL WritePipeOverlapped (HANDLE h, LPCVOID buf, DWORD len,
LPDWORD ret_len, DWORD timeout);
/* class for per-line reading using native functions. The caller provides
the file as an POBJECT_ATTRIBUTES, and the buffer space. */
class NT_readline
{
HANDLE fh;
PCHAR buf;
PCHAR got;
PCHAR end;
ULONG buflen;
ULONG len;
ULONG line;
public:
NT_readline () : fh (NULL) {}
bool init (POBJECT_ATTRIBUTES attr, char *buf, ULONG buflen);
PCHAR gets ();
void close () { if (fh) NtClose (fh); fh = NULL; }
~NT_readline () { close (); }
};
extern "C" void yield ();
void backslashify (const char *, char *, bool);
void slashify (const char *, char *, bool);
#define isslash(c) ((c) == '/')
extern void transform_chars (PWCHAR, PWCHAR);
extern inline void
transform_chars (PUNICODE_STRING upath, USHORT start_idx)
{
transform_chars (upath->Buffer + start_idx,
upath->Buffer + upath->Length / sizeof (WCHAR) - 1);
}
PWCHAR transform_chars_af_unix (PWCHAR, const char *, __socklen_t);
/* Get handle count of an object. */
ULONG get_obj_handle_count (HANDLE h);
ssize_t check_iovec (const struct iovec *, int, bool);
#define check_iovec_for_read(a, b) check_iovec ((a), (b), false)
#define check_iovec_for_write(a, b) check_iovec ((a), (b), true)
void SetThreadName (DWORD dwThreadID, const char* threadName);
WORD __get_cpus_per_group (void);
WORD __get_group_count (void);
#endif /*_MISCFUNCS_H*/