Commit Graph

170 Commits

Author SHA1 Message Date
Marc Di Luzio
94f47372d7 Upgrade the travis docker image to use xenial
Fix clang-format package name
2019-01-28 18:50:12 +00:00
Alex Smith
020ff9ad7c Merge pull request #96 from mdiluz/disable-screensaver
Add code to disable the screensaver during Game Mode
2019-01-28 18:13:08 +00:00
Alex Smith
60dd174acc Merge pull request #95 from mdiluz/add-tests
Add integration tests
2019-01-28 18:09:20 +00:00
Marc Di Luzio
868ed27b43 Fix up calling screensaver, now appears to work 2019-01-28 16:36:56 +00:00
Marc Di Luzio
c25fc285ee Add initial screensaver inhibiting code 2019-01-28 16:36:56 +00:00
Marc Di Luzio
a0d737f9db Correct error message when the initial query fails 2019-01-28 16:36:08 +00:00
Marc Di Luzio
b60ba6c00c Correct help message 2019-01-28 16:36:08 +00:00
Marc Di Luzio
12bc45398f Improve the test output 2019-01-28 16:36:08 +00:00
Marc Di Luzio
8de3600984 Properly handle quitting by request, and use that in the tests 2019-01-28 16:36:08 +00:00
Marc Di Luzio
f83d4d26d8 Small refactor
Single and dual client tests split into functions
2019-01-28 16:36:08 +00:00
Marc Di Luzio
c83fca408b Add a preliminary client test suite
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.
2019-01-28 16:36:08 +00:00
Marc Di Luzio
825b077f6d Add game_mode_run_tests function to trigger tests 2019-01-28 16:36:08 +00:00
Marc Di Luzio
1206826cea Add -t option to run tests on self
Right now only prints
2019-01-28 16:36:08 +00:00
Alex Smith
56e083eb60 Merge pull request #91 from suvayu/master
Configurable prefix path
2018-12-14 15:07:00 +00:00
Alex Smith
b64e143753 Merge pull request #85 from terencode/master
Add with-pam-group meson option
2018-12-10 09:53:29 +00:00
Térence Clastres
06ec97f968 Add with-pam-group meson option
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>
2018-12-07 21:50:58 +01:00
Suvayu Ali
5c87d798e1 bootstrap.sh: configurable prefix path 2018-12-02 09:22:06 +05:30
Alex Smith
ef8c4c7341 Merge pull request #86 from kakra/modular-refactor
Tidy up the code and refactor into modules
2018-10-10 08:55:58 +01:00
Kai Krakow
89b970b8d2 formatcheck: Use a shorter timeout
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>
2018-10-09 00:49:58 +02:00
Kai Krakow
fb3e3d0caf refactor: Simplify the log hinter
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-09 00:33:46 +02:00
Kai Krakow
ab9b45ac15 refactor: Break wine API functions out of the main daemon source
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-09 00:33:46 +02:00
Kai Krakow
ce50992236 refactor: Break ioprio API functions out of the main daemon source
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-09 00:33:46 +02:00
Kai Krakow
f9ad4ca1ef refactor: Break sched API functions out of the main daemon source
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-09 00:33:46 +02:00
Kai Krakow
c51f9f5003 refactor: Avoid exposing various internal types
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-09 00:33:46 +02:00
Kai Krakow
a8780b7e03 refactor: Break env API functions out of the main daemon source
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-09 00:33:46 +02:00
Kai Krakow
6e272db1aa refactor: Break proc API functions out of the main daemon source
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-09 00:33:46 +02:00
Kai Krakow
4943126321 refactor: Break helpers out of the main daemon source
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-08 20:53:04 +02:00
Alex Smith
39a145773a Merge pull request #84 from kakra/improve-scheduler-logging
gamemode-scheduler: Improve logging
2018-10-08 17:30:06 +01:00
Alex Smith
61fc64c8dc Merge pull request #79 from kakra/identify-wine-exe
Identify original wine exe by PID
2018-10-08 17:28:01 +01:00
Kai Krakow
1c57f28a84 gamemode: Explain the concerning logs a little better
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>
2018-10-05 20:03:17 +02:00
Kai Krakow
f23b57af12 gamemode: Convert game_mode_context_has_client() to return the client
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>
2018-10-05 20:03:17 +02:00
Kai Krakow
5a6ea9598c gamemode: Add a tiny buffered snprintf helper
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>
2018-10-05 20:03:17 +02:00
Kai Krakow
3c309d1334 gamemode: Map wine preloaders to original exe
This commit hooks game_mode_resolve_wine_preloader() into the function
to lookup the exe from a PID.

Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-05 19:54:40 +02:00
Kai Krakow
e89503719c gamemode: Add function to resolve the wine preloader executable
This commit adds a function to resolve a wine preloader binary into its
original windows binary.

Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-05 19:54:40 +02:00
Kai Krakow
f917b4a29c gamemode: Add a helper to compare string tails
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-05 19:54:40 +02:00
Kai Krakow
7b98c9ada2 gamemode: Add function to search environment of a PID
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>
2018-10-05 19:54:40 +02:00
Kai Krakow
e7c2ad2f30 gamemode: Add function to lookup user home directory
We first try to use `$HOME`, and only then fall back to passwd lookup.

Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-05 19:54:40 +02:00
Kai Krakow
a2bad640a3 gamemode: Make game_mode_context_find_exe() thread-safe
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>
2018-10-05 19:54:40 +02:00
Kai Krakow
046cb8a50f gamemode: Add a tiny safe snprintf helper
Give it a buffer, it returns an allocated string respecting the buffer
size.

Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-05 19:54:23 +02:00
Kai Krakow
055cc0e729 gamemode: Add executable to initializer
This allows to initialize the GameModeClient later and cleans up the
error path.

Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-05 19:45:31 +02:00
Kai Krakow
7101e8cd8f gamemode: Optimize detection of dupe registers
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>
2018-10-05 19:45:31 +02:00
Kai Krakow
56803d6b66 gamemode: Never add NULL to the client list
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>
2018-10-05 19:45:31 +02:00
Kai Krakow
1d2048dd93 dbus-messaging: Add missing trailing \n
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-05 19:45:30 +02:00
Kai Krakow
d950d0e47a gamemode-scheduler: Improve logging
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>
2018-10-05 19:44:58 +02:00
Alex Smith
26dc7b650d Merge pull request #81 from kakra/io-priorities
Adjust IO priorities of clients
2018-10-05 14:21:46 +01:00
Kai Krakow
6759b5653e gamemode: Apply io priority to clients
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>
2018-10-03 04:24:56 +02:00
Alex Smith
a7c838d2fe Merge pull request #80 from kakra/fix-valgrind-checks
Fix access to uninitialized values (valgrind)
2018-10-02 13:31:51 +01:00
Kai Krakow
a99670f442 daemon-config: Add ioprio configuration option
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-01 19:34:46 +02:00
Kai Krakow
57b4f6afcf gamemode: Add a value clamping helper
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-09-30 17:36:34 +02:00
Kai Krakow
1e2ea30eda Fix access to uninitialized values (valgrind)
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>
2018-09-30 00:01:38 +02:00