diff --git a/include/mbgl/util/platform.hpp b/include/mbgl/util/platform.hpp index 354465974..917b98483 100644 --- a/include/mbgl/util/platform.hpp +++ b/include/mbgl/util/platform.hpp @@ -22,5 +22,9 @@ void setCurrentThreadName(const std::string& name); // Makes the current thread low priority. void makeThreadLowPriority(); +// Sets priority of a current thread. Platform implementation +// must validate provided value. +void setCurrentThreadPriority(double priority); + } // namespace platform } // namespace mbgl diff --git a/platform/android/src/thread.cpp b/platform/android/src/thread.cpp index cd0a72306..f480fc5d4 100644 --- a/platform/android/src/thread.cpp +++ b/platform/android/src/thread.cpp @@ -40,6 +40,14 @@ void makeThreadLowPriority() { setpriority(PRIO_PROCESS, 0, 19); } +void setCurrentThreadPriority(double priority) { + if (priority < -20 || priority > 19) { + Log::Warning(Event::General, "Couldn't set thread priority"); + return; + } + setpriority(PRIO_PROCESS, 0, int(priority)); +} + void attachThread() { using namespace android; assert(env == nullptr); diff --git a/platform/darwin/src/nsthread.mm b/platform/darwin/src/nsthread.mm index f7edcdf5d..9af9cf3cc 100644 --- a/platform/darwin/src/nsthread.mm +++ b/platform/darwin/src/nsthread.mm @@ -1,5 +1,6 @@ #import +#include #include #include @@ -24,6 +25,15 @@ void makeThreadLowPriority() { [[NSThread currentThread] setThreadPriority:0.0]; } +void setCurrentThreadPriority(double priority) { + if (priority > 1.0 || priority < 0.0) { + Log::Warning(Event::General, "Invalid thread priority was provided"); + return; + } + + [[NSThread currentThread] setThreadPriority:priority]; +} + void attachThread() { } diff --git a/platform/default/src/mbgl/util/thread.cpp b/platform/default/src/mbgl/util/thread.cpp index 58a7c12bc..1ee5b1211 100644 --- a/platform/default/src/mbgl/util/thread.cpp +++ b/platform/default/src/mbgl/util/thread.cpp @@ -6,6 +6,7 @@ #include #include +#include namespace mbgl { namespace platform { @@ -40,11 +41,23 @@ void makeThreadLowPriority() { #endif } -void attachThread() { +void setCurrentThreadPriority(double priority) { + if (setpriority(PRIO_PROCESS, 0, int(priority)) < 0) { + Log::Warning(Event::General, "Couldn't set thread priority"); + } + +#ifdef SCHED_OTHER + struct sched_param param; + param.sched_priority = 0; + if (sched_setscheduler(0, SCHED_OTHER, ¶m) != 0) { + Log::Warning(Event::General, "Couldn't set thread scheduling policy"); + } +#endif } -void detachThread() { -} +void attachThread() {} + +void detachThread() {} } // namespace platform } // namespace mbgl diff --git a/platform/qt/src/thread.cpp b/platform/qt/src/thread.cpp index 103b6d74f..6c7d14042 100644 --- a/platform/qt/src/thread.cpp +++ b/platform/qt/src/thread.cpp @@ -16,6 +16,8 @@ void setCurrentThreadName(const std::string&) { void makeThreadLowPriority() { } +void setCurrentThreadPriority(double) {} + void attachThread() { }