diff options
author | Max Kellermann <max@duempel.org> | 2014-01-30 18:37:30 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-01-30 18:43:40 +0100 |
commit | a31738f6f1473f4f621bc16513ed0c6024749389 (patch) | |
tree | 9a97fe23e91de211a545173f3d90bebef1b043c5 /src/thread/Slack.hxx | |
parent | 39a2867ea806682922a5bc8b0057bd4ddcbb4dcb (diff) | |
download | mpd-a31738f6f1473f4f621bc16513ed0c6024749389.tar.gz mpd-a31738f6f1473f4f621bc16513ed0c6024749389.tar.xz mpd-a31738f6f1473f4f621bc16513ed0c6024749389.zip |
Main, OutputThread: increase kernel timer slack (Linux)
Allows the kernel to combine timer wakeups with other processes,
reducing power usage.
Diffstat (limited to '')
-rw-r--r-- | src/thread/Slack.hxx | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/thread/Slack.hxx b/src/thread/Slack.hxx new file mode 100644 index 000000000..66b2254a4 --- /dev/null +++ b/src/thread/Slack.hxx @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2003-2014 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_THREAD_SLACK_HXX +#define MPD_THREAD_SLACK_HXX + +#ifdef HAVE_PRCTL +#include <sys/prctl.h> +#endif + +/** + * Set the current thread's timer slack to the specified number of + * nanoseconds (requires Linux 2.6.28). This allows the kernel to + * merge multiple wakeups, which is a trick to save energy. + */ +static inline void +SetThreadTimerSlackNS(unsigned long slack_ns) +{ +#if defined(HAVE_PRCTL) && defined(PR_SET_TIMERSLACK) + prctl(PR_SET_TIMERSLACK, slack_ns, 0, 0, 0); +#else + (void)slack_ns; +#endif +} + +static inline void +SetThreadTimerSlackUS(unsigned long slack_us) +{ + SetThreadTimerSlackNS(slack_us * 1000ul); +} + +static inline void +SetThreadTimerSlackMS(unsigned long slack_ms) +{ + SetThreadTimerSlackNS(slack_ms * 1000000ul); +} + +#endif |