1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 2008, The Android Open Source Project 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * All rights reserved. 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met: 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Redistributions of source code must retain the above copyright 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * notice, this list of conditions and the following disclaimer in 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * the documentation and/or other materials provided with the 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * distribution. 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * * Neither the name of Google, Inc. nor the names of its contributors 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * may be used to endorse or promote products derived from this 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * software without specific prior written permission. 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE. 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/time.h> 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/resource.h> 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sched.h> 384db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt#include <getopt.h> 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectusage(const char *s) 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 434db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt fprintf(stderr, "USAGE: %s [[-r] [-t TYPE] priority pids ...] [-g pid]\n", s); 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid print_prio(pid_t pid) 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sched; 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct sched_param sp; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("pid %d's priority: %d\n", pid, getpriority(PRIO_PROCESS, pid)); 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("scheduling class: "); 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sched = sched_getscheduler(pid); 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (sched) { 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SCHED_FIFO: 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("FIFO\n"); 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SCHED_RR: 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("RR\n"); 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case SCHED_OTHER: 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Normal\n"); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case -1: 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("sched_getscheduler"); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project default: 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Unknown\n"); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sched_getparam(pid, &sp); 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("RT prio: %d (of %d to %d)\n", sp.sched_priority, 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sched_get_priority_min(sched), sched_get_priority_max(sched)); 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 784db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidtint get_sched(char *str) 794db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt{ 804db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt if (strcasecmp(str, "RR") == 0) 814db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt return SCHED_RR; 824db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt else if (strcasecmp(str, "FIFO") == 0) 834db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt return SCHED_FIFO; 844db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt else if (strcasecmp(str, "NORMAL") == 0) 854db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt return SCHED_OTHER; 864db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt else if (strcasecmp(str, "OTHER") == 0) 874db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt return SCHED_OTHER; 884db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt return SCHED_RR; 894db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt} 904db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint renice_main(int argc, char *argv[]) 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int prio; 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int realtime = 0; 954db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt int opt; 964db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt int sched = SCHED_RR; 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *cmd = argv[0]; 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 994db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt do { 1004db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt opt = getopt(argc, argv, "rt:g:"); 1014db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt if (opt == -1) 1024db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt break; 1034db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt switch (opt) { 1044db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt case 'r': 1054db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt // do realtime priority adjustment 1064db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt realtime = 1; 1074db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt break; 1084db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt case 't': 1094db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt sched = get_sched(optarg); 1104db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt break; 1114db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt case 'g': 1124db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt print_prio(atoi(optarg)); 1134db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt return 0; 1144db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt default: 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(cmd); 1164db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt } 1174db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt } while (1); 1184db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt 1194db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt argc -= optind; 1204db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt argv += optind; 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 1) 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(cmd); 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project prio = atoi(argv[0]); 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc < 1) 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project usage(cmd); 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc) { 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid_t pid; 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pid = atoi(argv[0]); 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (realtime) { 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct sched_param sp = { .sched_priority = prio }; 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1434db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt ret = sched_setscheduler(pid, sched, &sp); 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret) { 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("sched_set_scheduler"); 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int ret; 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ret = setpriority(PRIO_PROCESS, pid, prio); 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ret) { 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror("setpriority"); 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(EXIT_FAILURE); 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1584db7df71da5641dfa6c89543b9843dca1999d78eDmitry Shmidt 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 161