718 Commits

Author SHA1 Message Date
Alex Smith
5b0dc8f87f Merge pull request #95 from mdiluz/add-tests
Add integration tests
2019-01-28 18:09:20 +00:00
Marc Di Luzio
b4ba947255 Fix up calling screensaver, now appears to work 2019-01-28 16:36:56 +00:00
Marc Di Luzio
42dd7e6ea8 Add initial screensaver inhibiting code 2019-01-28 16:36:56 +00:00
Marc Di Luzio
f0816230d7 Correct error message when the initial query fails 2019-01-28 16:36:08 +00:00
Marc Di Luzio
5e705f3225 Correct help message 2019-01-28 16:36:08 +00:00
Marc Di Luzio
0eece55433 Improve the test output 2019-01-28 16:36:08 +00:00
Marc Di Luzio
b97182141f Properly handle quitting by request, and use that in the tests 2019-01-28 16:36:08 +00:00
Marc Di Luzio
c99e06ed9e Small refactor
Single and dual client tests split into functions
2019-01-28 16:36:08 +00:00
Marc Di Luzio
0b4e86651e 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
94cfa2de54 Add game_mode_run_tests function to trigger tests 2019-01-28 16:36:08 +00:00
Marc Di Luzio
951cf1f8b9 Add -t option to run tests on self
Right now only prints
2019-01-28 16:36:08 +00:00
Alex Smith
6544bfb99d Merge pull request #91 from suvayu/master
Configurable prefix path
2018-12-14 15:07:00 +00:00
Alex Smith
60c722d252 Merge pull request #85 from terencode/master
Add with-pam-group meson option
2018-12-10 09:53:29 +00:00
Térence Clastres
5f91922506 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
55a3dea992 bootstrap.sh: configurable prefix path 2018-12-02 09:22:06 +05:30
Alex Smith
2720711550 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
b2870671bd 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
5396370e5d refactor: Simplify the log hinter
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-09 00:33:46 +02:00
Kai Krakow
f4cd01f989 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
403ce122f6 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
edf9257de4 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
b9c9a5f120 refactor: Avoid exposing various internal types
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-09 00:33:46 +02:00
Kai Krakow
92967b135b 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
748808be7e 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
c4ff3d7250 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
9bbcc03c50 Merge pull request #84 from kakra/improve-scheduler-logging
gamemode-scheduler: Improve logging
2018-10-08 17:30:06 +01:00
Alex Smith
3c0bc9ef5c 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
29f8f0883c 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
fd4166279b 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
d023495a5d 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
4fd93ee30a 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
ba80a6cc3d 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
373fe5a8af 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
c2344f4387 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
47ea4514cd 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
3a6d258eae 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
81a52ddc4d 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
bd811c6646 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
8214f93630 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
2a0c6e7098 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
e6dd315123 dbus-messaging: Add missing trailing \n
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-05 19:45:30 +02:00
Kai Krakow
8a618a29fa 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
53f3d4b346 Merge pull request #81 from kakra/io-priorities
Adjust IO priorities of clients
2018-10-05 14:21:46 +01:00
Kai Krakow
62865b1e32 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
d20ac4cf82 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
ebf177bebe daemon-config: Add ioprio configuration option
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-10-01 19:34:46 +02:00
Kai Krakow
a91a2e7739 gamemode: Add a value clamping helper
Signed-off-by: Kai Krakow <kai@kaishome.de>
2018-09-30 17:36:34 +02:00
Kai Krakow
61a9ee9033 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
Alex Smith
c9031e4a75 Merge pull request #75 from kakra/dont-leak-scheduler-attributes
gamemode: Don't leak SCHED_ISO into children
2018-09-29 09:30:56 +01:00
Alex Smith
8172f05142 Merge pull request #77 from kakra/optimize-format-check
format-check: Optimize format-check.sh
2018-09-29 09:30:23 +01:00