Optimize set_sched_policy(), which gets called in every binder call.

- use static /dev/cpuctl filenames, rather than sprintf() on the fly
- use a custom formatter instead of sprintf() for the tid number

This is a simplified version of Dan's original
Ifc9c81f74fe65f0695ead53b30194bc6adf00da0 to be less risky for Froyo.

Bug: 2660235
Change-Id: I744bbc2ec01fd2569612c814a497df40a933b622
diff --git a/libcutils/sched_policy.c b/libcutils/sched_policy.c
index 3a18b0b..6d2727b 100644
--- a/libcutils/sched_policy.c
+++ b/libcutils/sched_policy.c
@@ -44,22 +44,27 @@
 
 static int __sys_supports_schedgroups = -1;
 
-static int add_tid_to_cgroup(int tid, const char *grp_name)
+/* Add tid to the group defined by dev_path ("/dev/cpuctl/.../tasks") */
+static int add_tid_to_cgroup(int tid, const char *dev_path)
 {
     int fd;
-    char path[255];
-    char text[64];
-
-    sprintf(path, "/dev/cpuctl/%s/tasks", grp_name);
-
-    if ((fd = open(path, O_WRONLY)) < 0) {
-        SLOGE("add_tid_to_cgroup failed to open '%s' (%s)\n", path,
+    if ((fd = open(dev_path, O_WRONLY)) < 0) {
+        SLOGE("add_tid_to_cgroup failed to open '%s' (%s)\n", dev_path,
              strerror(errno));
         return -1;
     }
 
-    sprintf(text, "%d", tid);
-    if (write(fd, text, strlen(text)) < 0) {
+    // specialized itoa -- works for tid > 0
+    char text[22];
+    char *end = text + sizeof(text) - 1;
+    char *ptr = end;
+    *ptr = '\0';
+    while (tid > 0) {
+        *--ptr = '0' + (tid % 10);
+        tid = tid / 10;
+    }
+
+    if (write(fd, ptr, end - ptr) < 0) {
         close(fd);
 	/*
 	 * If the thread is in the process of exiting,
@@ -67,8 +72,8 @@
 	 */
 	if (errno == ESRCH)
 		return 0;
-        SLOGW("add_tid_to_cgroup failed to write '%s' (%s)\n", path,
-             strerror(errno));
+        SLOGW("add_tid_to_cgroup failed to write '%s' to '%s' (%s)\n",
+             ptr, dev_path, strerror(errno));
         return -1;
     }
 
@@ -228,13 +233,14 @@
 #endif
 
     if (__sys_supports_schedgroups) {
-        const char *grp = "";
-
+        const char *dev_path;
         if (policy == SP_BACKGROUND) {
-            grp = "bg_non_interactive";
+            dev_path = "/dev/cpuctl/bg_non_interactive/tasks";
+        } else {
+            dev_path = "/dev/cpuctl/tasks";
         }
 
-        if (add_tid_to_cgroup(tid, grp)) {
+        if (add_tid_to_cgroup(tid, dev_path)) {
             if (errno != ESRCH && errno != ENOENT)
                 return -errno;
         }