This simply tests the current functionality of the gamemode_client tools by calling each function in turn and checking the values return correctly.
Requires the gamemode service to currently be running and installed on the system.
This adds 10-gamemode.conf as a limits.d configuration file and with-pam-group meson option to allow renicing as an unpriviledged user being part of the specified group.
Signed-off-by: Térence Clastres <t.clastres@gmail.com>
Signed-off-by: Kai Krakow <kai@kaishome.de>
If the internet connection is down, the default timeout of wget is
unreasonably long. If formatcheck is used as a pre-commit hook, this
blocks usage of git for a long time although we probably have
git-clang-format available.
Signed-off-by: Kai Krakow <kai@kaishome.de>
Testing showed that wine processes may provoke some concerning logs
multiple times. Let's explain this a little more so no questions from
worried users show up.
Signed-off-by: Kai Krakow <kai@kaishome.de>
Returning a bool is not useful if we want to create some log information
from this. It now returns NULL or a client pointer which is compatible
with all of the current users.
When dereferencing the returned pointer, a read lock must be acquired
around using the returned result as the client may be deallocated from
heap otherwise.
Signed-off-by: Kai Krakow <kai@kaishome.de>
Be careful using this as it may introduce some non-obvious pitfalls.
This saves us from a heap allocation in some code locations.
Signed-off-by: Kai Krakow <kai@kaishome.de>
This function can look up arbitrary environment variables from a running
PID (given we have access permissions which should be usually true).
Signed-off-by: Kai Krakow <kai@kaishome.de>
Let's use our new safe_snprintf() helper. It's designed to make
thread-safe usage easy and will also be used by the next commits.
Reported-by: Alex Smith <alex@alex-smith.me.uk>
Signed-off-by: Kai Krakow <kai@kaishome.de>
GameMode can do a pretty expensive lookup function now for the exe.
Let's spare some CPU cycles by detecting a duplicate PID early. Nothing
makes use of the exe path at this stage.
Signed-off-by: Kai Krakow <kai@kaishome.de>
When running wine games, there's good chance the executable is already
gone when GameMode decided to add it to the list. Let's silently bail
out here. It probably grabs a non-matching PID anyway in this moment.
Signed-off-by: Kai Krakow <kai@kaishome.de>
During finding the cause of an issue, we discovered bad interactions
with other resource management daemon that may be running at the same
time and may interfere with GameMode's ability to properly set
scheduling parameters of the process. Usually, this results in EPERM
(instead of EINVAL for lacking kernel support). It also means that the
other daemon is leaking wrong scheduling settings into the games with
negative performance impacts (quite the opposite of what the user wanted
to achieve). So we should give some valuable hints.
This commit improves logging by detecting the error situation and giving
context-based hints on what to do next. To keep logging verbosity low,
the hint is only logged once per error code.
Closes: https://github.com/FeralInteractive/gamemode/issues/68
Signed-off-by: Kai Krakow <kai@kaishome.de>
This commit allows changing the io priority of the client to a value
specified in the configuration file. That can possibly reduce lags or
latency when a game has to load assets on demand and you have background
IO activity running (or other concurrent IO).
Signed-off-by: Kai Krakow <kai@kaishome.de>
Fix what was reported by valgrind:
```
==8458==
==8458== HEAP SUMMARY:
==8458== in use at exit: 11,677 bytes in 27 blocks
==8458== total heap usage: 768 allocs, 741 frees, 397,008 bytes
allocated
==8458==
==8458== Searching for pointers to 27 not-freed blocks
==8458== Checked 206,624 bytes
==8458==
==8458== LEAK SUMMARY:
==8458== definitely lost: 0 bytes in 0 blocks
==8458== indirectly lost: 0 bytes in 0 blocks
==8458== possibly lost: 0 bytes in 0 blocks
==8458== still reachable: 11,677 bytes in 27 blocks
==8458== suppressed: 0 bytes in 0 blocks
==8458== Reachable blocks (those to which a pointer was found) are not
shown.
==8458== To see them, rerun with: --leak-check=full
--show-leak-kinds=all
==8458==
==8458== Use --track-origins=yes to see where uninitialised values come
from
==8458== ERROR SUMMARY: 200 errors from 10 contexts (suppressed: 0 from
0)
==8458==
==8458== 20 errors in context 1 of 10:
==8458== Conditional jump or move depends on uninitialised value(s)
==8458== at 0x10BD18: game_mode_apply_scheduler (gamemode.c:237)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458==
==8458== 20 errors in context 2 of 10:
==8458== Conditional jump or move depends on uninitialised value(s)
==8458== at 0x4A0C4DC: strcmp (vg_replace_strmem.c:846)
==8458== by 0x10BD15: game_mode_apply_scheduler (gamemode.c:237)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458==
==8458== 20 errors in context 3 of 10:
==8458== Conditional jump or move depends on uninitialised value(s)
==8458== at 0x10BCDB: game_mode_apply_scheduler (gamemode.c:232)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458==
==8458== 20 errors in context 4 of 10:
==8458== Conditional jump or move depends on uninitialised value(s)
==8458== at 0x4A0C4DC: strcmp (vg_replace_strmem.c:846)
==8458== by 0x10BCD8: game_mode_apply_scheduler (gamemode.c:232)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458==
==8458== 20 errors in context 5 of 10:
==8458== Conditional jump or move depends on uninitialised value(s)
==8458== at 0x53AB44C: vfprintf (vfprintf.c:1642)
==8458== by 0x53B2C5D: printf (printf.c:33)
==8458== by 0x10BBA2: game_mode_apply_scheduler (gamemode.c:201)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458==
==8458== 20 errors in context 6 of 10:
==8458== Conditional jump or move depends on uninitialised value(s)
==8458== at 0x53AA9DA: vfprintf (vfprintf.c:1642)
==8458== by 0x53B2C5D: printf (printf.c:33)
==8458== by 0x10BBA2: game_mode_apply_scheduler (gamemode.c:201)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458==
==8458== 20 errors in context 7 of 10:
==8458== Conditional jump or move depends on uninitialised value(s)
==8458== at 0x53A6FF5: _itoa_word (_itoa.c:179)
==8458== by 0x53AA922: vfprintf (vfprintf.c:1642)
==8458== by 0x53B2C5D: printf (printf.c:33)
==8458== by 0x10BBA2: game_mode_apply_scheduler (gamemode.c:201)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458==
==8458== 20 errors in context 8 of 10:
==8458== Use of uninitialised value of size 8
==8458== at 0x53A6FE8: _itoa_word (_itoa.c:179)
==8458== by 0x53AA922: vfprintf (vfprintf.c:1642)
==8458== by 0x53B2C5D: printf (printf.c:33)
==8458== by 0x10BBA2: game_mode_apply_scheduler (gamemode.c:201)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458==
==8458== 20 errors in context 9 of 10:
==8458== Conditional jump or move depends on uninitialised value(s)
==8458== at 0x53AB20A: vfprintf (vfprintf.c:1642)
==8458== by 0x53B2C5D: printf (printf.c:33)
==8458== by 0x10BBA2: game_mode_apply_scheduler (gamemode.c:201)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458==
==8458== 20 errors in context 10 of 10:
==8458== Conditional jump or move depends on uninitialised value(s)
==8458== at 0x10BB44: game_mode_apply_scheduler (gamemode.c:200)
==8458== by 0x10C7D7: game_mode_context_register (gamemode.c:445)
==8458== by 0x10D4E6: method_register_game (dbus_messaging.c:79)
==8458== by 0x4CB795B: method_callbacks_run (bus-objects.c:404)
==8458== by 0x4CB795B: object_find_and_run (bus-objects.c:1262)
==8458== by 0x4CB8D38: bus_process_object (bus-objects.c:1378)
==8458== by 0x4CC9251: process_message (sd-bus.c:2663)
==8458== by 0x4CC9251: process_running (sd-bus.c:2705)
==8458== by 0x4CC9251: bus_process_internal (sd-bus.c:2924)
==8458== by 0x10D8B9: game_mode_context_loop (dbus_messaging.c:173)
==8458== by 0x10B7C4: main (main.c:186)
==8458==
==8458== ERROR SUMMARY: 200 errors from 10 contexts (suppressed: 0 from
0)
```
Signed-off-by: Kai Krakow <kai@kaishome.de>