diff options
author | Martijn Coenen <maco@google.com> | 2017-04-21 16:21:31 -0700 |
---|---|---|
committer | Martijn Coenen <maco@google.com> | 2017-05-03 15:59:08 -0700 |
commit | 81ef4da81353cf86d185e90239e4f06d2930c2ba (patch) | |
tree | 613224b87c537c38ad255a72d12756bfa8dd243e /transport/HidlTransportSupport.cpp | |
parent | 81e25c13192462a60eda925413302d0f8c6a936e (diff) | |
download | libhidl-81ef4da81353cf86d185e90239e4f06d2930c2ba.tar.gz |
Allow setting a minimum scheduler policy for a service.
The binder kernel driver supports priority inheritance
at a node (service)-basis, that makes sure all transactions
into that service are executed at a specified minimum
scheduler policy and priority.
This change allows users of HIDL interfaces to set
such a policy for their interface.
Bug: 37293077
Test: verified min_prio in /d/binder output
Change-Id: If72dd8322381246832b460c386dda44fbd225757
Diffstat (limited to 'transport/HidlTransportSupport.cpp')
-rw-r--r-- | transport/HidlTransportSupport.cpp | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp index a5ec8e2..ea2e32c 100644 --- a/transport/HidlTransportSupport.cpp +++ b/transport/HidlTransportSupport.cpp @@ -14,7 +14,6 @@ * limitations under the License. */ #include <hidl/HidlTransportSupport.h> - #include <hidl/HidlBinderSupport.h> namespace android { @@ -29,5 +28,30 @@ void joinRpcThreadpool() { joinBinderRpcThreadpool(); } +bool setMinSchedulerPolicy(const sp<::android::hidl::base::V1_0::IBase>& service, + int policy, int priority) { + if (service->isRemote()) { + ALOGE("Can't set scheduler policy on remote service."); + return false; + } + + if (policy != SCHED_NORMAL && policy != SCHED_FIFO && policy != SCHED_RR) { + ALOGE("Invalid scheduler policy %d", policy); + return false; + } + + if (policy == SCHED_NORMAL && (priority < -20 || priority > 19)) { + ALOGE("Invalid priority for SCHED_NORMAL: %d", priority); + return false; + } else if (priority < 1 || priority > 99) { + ALOGE("Invalid priority for real-time policy: %d", priority); + return false; + } + + details::gServicePrioMap.set(service, { policy, priority }); + + return true; +} + +} } -}
\ No newline at end of file |