Make BT HAL audio threads RT

Bluetooth threads that are used in audio have deadline
requirements for glitchless playback.  Those threads need to be
scheduled as RT tasks to ensure that they can meet the deadline even if
there is high system load.  Use schedulerservice to request RT
scheduling.

Bug 37518404
Test:  play Bluetooth audio, check for RT with systrace
Change-Id: I043a97df3d2801922b54dcbf7c700ae11a48c217
diff --git a/bluetooth/1.0/default/Android.bp b/bluetooth/1.0/default/Android.bp
index fec2264..46a4987 100644
--- a/bluetooth/1.0/default/Android.bp
+++ b/bluetooth/1.0/default/Android.bp
@@ -24,6 +24,7 @@
         "vendor_interface.cc",
     ],
     shared_libs: [
+        "android.frameworks.schedulerservice@1.0",
         "android.hardware.bluetooth@1.0",
         "libbase",
         "libcutils",
@@ -48,6 +49,7 @@
     ],
     export_include_dirs: ["."],
     shared_libs: [
+        "android.frameworks.schedulerservice@1.0",
         "liblog",
     ],
 }
@@ -84,9 +86,11 @@
         "test",
     ],
     shared_libs: [
+        "android.frameworks.schedulerservice@1.0",
         "libbase",
         "libhidlbase",
         "liblog",
+        "libutils",
     ],
     static_libs: [
         "android.hardware.bluetooth-async",
diff --git a/bluetooth/1.0/default/Android.mk b/bluetooth/1.0/default/Android.mk
index 38294c7..2dcb067 100644
--- a/bluetooth/1.0/default/Android.mk
+++ b/bluetooth/1.0/default/Android.mk
@@ -35,5 +35,6 @@
   libhidlbase \
   libhidltransport \
   android.hardware.bluetooth@1.0 \
+  android.frameworks.schedulerservice@1.0\
 
 include $(BUILD_EXECUTABLE)
diff --git a/bluetooth/1.0/default/async_fd_watcher.cc b/bluetooth/1.0/default/async_fd_watcher.cc
index 05ac537..ab8d555 100644
--- a/bluetooth/1.0/default/async_fd_watcher.cc
+++ b/bluetooth/1.0/default/async_fd_watcher.cc
@@ -14,6 +14,8 @@
 // limitations under the License.
 //
 
+#define LOG_TAG "android.hardware.bluetooth@1.0-impl"
+
 #include "async_fd_watcher.h"
 
 #include <algorithm>
@@ -22,13 +24,18 @@
 #include <map>
 #include <mutex>
 #include <thread>
+#include <utils/Log.h>
 #include <vector>
 #include "fcntl.h"
 #include "sys/select.h"
 #include "unistd.h"
 
+#include <android/frameworks/schedulerservice/1.0/ISchedulingPolicyService.h>
+
 static const int INVALID_FD = -1;
 
+static const int BT_RT_PRIORITY = 1;
+
 namespace android {
 namespace hardware {
 namespace bluetooth {
@@ -112,6 +119,21 @@
 }
 
 void AsyncFdWatcher::ThreadRoutine() {
+  using ::android::frameworks::schedulerservice::V1_0::ISchedulingPolicyService;
+  using ::android::hardware::Return;
+  sp<ISchedulingPolicyService> manager = ISchedulingPolicyService::getService();
+  if (manager == nullptr) {
+    ALOGE("%s: Couldn't get scheduler manager to set SCHED_FIFO.", __func__);
+  } else {
+    Return<bool> ret = manager->requestPriority(getpid(),
+                                                gettid(),
+                                                BT_RT_PRIORITY);
+    if (!ret.isOk() || !ret) {
+      ALOGE("%s unable to set SCHED_FIFO for pid %d, tid %d", __func__,
+            getpid(), gettid());
+    }
+  }
+
   while (running_) {
     fd_set read_fds;
     FD_ZERO(&read_fds);