sched_policy.c revision 503df2075991cd03ddf43d14e05768a2138b9028
10384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 2493dad966305a7fb555addd367532dd2af275a27San Mehat/* libs/cutils/sched_policy.c 3493dad966305a7fb555addd367532dd2af275a27San Mehat** 4493dad966305a7fb555addd367532dd2af275a27San Mehat** Copyright 2007, The Android Open Source Project 5493dad966305a7fb555addd367532dd2af275a27San Mehat** 6493dad966305a7fb555addd367532dd2af275a27San Mehat** Licensed under the Apache License, Version 2.0 (the "License"); 7493dad966305a7fb555addd367532dd2af275a27San Mehat** you may not use this file except in compliance with the License. 8493dad966305a7fb555addd367532dd2af275a27San Mehat** You may obtain a copy of the License at 9493dad966305a7fb555addd367532dd2af275a27San Mehat** 10493dad966305a7fb555addd367532dd2af275a27San Mehat** http://www.apache.org/licenses/LICENSE-2.0 11493dad966305a7fb555addd367532dd2af275a27San Mehat** 12493dad966305a7fb555addd367532dd2af275a27San Mehat** Unless required by applicable law or agreed to in writing, software 13493dad966305a7fb555addd367532dd2af275a27San Mehat** distributed under the License is distributed on an "AS IS" BASIS, 14493dad966305a7fb555addd367532dd2af275a27San Mehat** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15493dad966305a7fb555addd367532dd2af275a27San Mehat** See the License for the specific language governing permissions and 16493dad966305a7fb555addd367532dd2af275a27San Mehat** limitations under the License. 17493dad966305a7fb555addd367532dd2af275a27San Mehat*/ 18493dad966305a7fb555addd367532dd2af275a27San Mehat 19493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdio.h> 20493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdlib.h> 21493dad966305a7fb555addd367532dd2af275a27San Mehat#include <unistd.h> 22493dad966305a7fb555addd367532dd2af275a27San Mehat#include <string.h> 23493dad966305a7fb555addd367532dd2af275a27San Mehat#include <errno.h> 24493dad966305a7fb555addd367532dd2af275a27San Mehat#include <fcntl.h> 250384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 26d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#define LOG_TAG "SchedPolicy" 27d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#include "cutils/log.h" 28d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 290384a98d6f61fa47ffde01c15e552f738e88fb94Raphael#ifdef HAVE_SCHED_H 300384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 31493dad966305a7fb555addd367532dd2af275a27San Mehat#include <sched.h> 32493dad966305a7fb555addd367532dd2af275a27San Mehat 33493dad966305a7fb555addd367532dd2af275a27San Mehat#include <cutils/sched_policy.h> 34493dad966305a7fb555addd367532dd2af275a27San Mehat 353cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#ifndef SCHED_NORMAL 363cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat #define SCHED_NORMAL 0 373cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#endif 383cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 393cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#ifndef SCHED_BATCH 403cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat #define SCHED_BATCH 3 413cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#endif 423cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 43805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat#define POLICY_DEBUG 0 44d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 45c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatstatic int __sys_supports_schedgroups = -1; 46c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 47493dad966305a7fb555addd367532dd2af275a27San Mehatstatic int add_tid_to_cgroup(int tid, const char *grp_name) 48493dad966305a7fb555addd367532dd2af275a27San Mehat{ 49493dad966305a7fb555addd367532dd2af275a27San Mehat int fd; 50493dad966305a7fb555addd367532dd2af275a27San Mehat char path[255]; 51493dad966305a7fb555addd367532dd2af275a27San Mehat char text[64]; 52493dad966305a7fb555addd367532dd2af275a27San Mehat 53493dad966305a7fb555addd367532dd2af275a27San Mehat sprintf(path, "/dev/cpuctl/%s/tasks", grp_name); 54493dad966305a7fb555addd367532dd2af275a27San Mehat 55805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat if ((fd = open(path, O_WRONLY)) < 0) { 56c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat LOGE("add_tid_to_cgroup failed to open '%s' (%s)\n", path, 57c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat strerror(errno)); 58493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 59805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat } 60493dad966305a7fb555addd367532dd2af275a27San Mehat 61493dad966305a7fb555addd367532dd2af275a27San Mehat sprintf(text, "%d", tid); 62493dad966305a7fb555addd367532dd2af275a27San Mehat if (write(fd, text, strlen(text)) < 0) { 63493dad966305a7fb555addd367532dd2af275a27San Mehat close(fd); 64c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat /* 65c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat * If the thread is in the process of exiting, 66c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat * don't flag an error 67c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat */ 68c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat if (errno == ESRCH) 69c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat return 0; 70c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat LOGW("add_tid_to_cgroup failed to write '%s' (%s)\n", path, 71c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat strerror(errno)); 72493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 73493dad966305a7fb555addd367532dd2af275a27San Mehat } 74493dad966305a7fb555addd367532dd2af275a27San Mehat 75493dad966305a7fb555addd367532dd2af275a27San Mehat close(fd); 76493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 77493dad966305a7fb555addd367532dd2af275a27San Mehat} 78493dad966305a7fb555addd367532dd2af275a27San Mehat 79c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatstatic inline void initialize() 80493dad966305a7fb555addd367532dd2af275a27San Mehat{ 81493dad966305a7fb555addd367532dd2af275a27San Mehat if (__sys_supports_schedgroups < 0) { 82493dad966305a7fb555addd367532dd2af275a27San Mehat if (!access("/dev/cpuctl/tasks", F_OK)) { 83493dad966305a7fb555addd367532dd2af275a27San Mehat __sys_supports_schedgroups = 1; 84493dad966305a7fb555addd367532dd2af275a27San Mehat } else { 85493dad966305a7fb555addd367532dd2af275a27San Mehat __sys_supports_schedgroups = 0; 86493dad966305a7fb555addd367532dd2af275a27San Mehat } 87493dad966305a7fb555addd367532dd2af275a27San Mehat } 88c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 89c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 90c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat/* 91c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * Try to get the scheduler group. 92c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 93503df2075991cd03ddf43d14e05768a2138b9028San Mehat * The data from /proc/<pid>/cgroup looks (something) like: 94c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 2:cpu:/bg_non_interactive 95503df2075991cd03ddf43d14e05768a2138b9028San Mehat * 1:cpuacct:/ 96c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 97c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * We return the part after the "/", which will be an empty string for 98c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * the default cgroup. If the string is longer than "bufLen", the string 99c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * will be truncated. 100c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat */ 101c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatstatic int getSchedulerGroup(int tid, char* buf, size_t bufLen) 102c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 103c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#ifdef HAVE_ANDROID_OS 104c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat char pathBuf[32]; 105503df2075991cd03ddf43d14e05768a2138b9028San Mehat char lineBuf[256]; 106503df2075991cd03ddf43d14e05768a2138b9028San Mehat FILE *fp; 107c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 108c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid); 109503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(fp = fopen(pathBuf, "r"))) { 110c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 111c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 112c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 113503df2075991cd03ddf43d14e05768a2138b9028San Mehat while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) { 114503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *next = lineBuf; 115503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *subsys; 116503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *grp; 117503df2075991cd03ddf43d14e05768a2138b9028San Mehat size_t len; 118c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 119503df2075991cd03ddf43d14e05768a2138b9028San Mehat /* Junk the first field */ 120503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!strsep(&next, ":")) { 121503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 122503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 123c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 124503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(subsys = strsep(&next, ":"))) { 125503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 126503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 127503df2075991cd03ddf43d14e05768a2138b9028San Mehat 128503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (strcmp(subsys, "cpu")) { 129503df2075991cd03ddf43d14e05768a2138b9028San Mehat /* Not the subsys we're looking for */ 130503df2075991cd03ddf43d14e05768a2138b9028San Mehat continue; 131503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 132503df2075991cd03ddf43d14e05768a2138b9028San Mehat 133503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(grp = strsep(&next, ":"))) { 134503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 135503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 136503df2075991cd03ddf43d14e05768a2138b9028San Mehat grp++; /* Drop the leading '/' */ 137503df2075991cd03ddf43d14e05768a2138b9028San Mehat len = strlen(grp); 138503df2075991cd03ddf43d14e05768a2138b9028San Mehat grp[len-1] = '\0'; /* Drop the trailing '\n' */ 139503df2075991cd03ddf43d14e05768a2138b9028San Mehat 140503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (bufLen <= len) { 141503df2075991cd03ddf43d14e05768a2138b9028San Mehat len = bufLen - 1; 142503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 143503df2075991cd03ddf43d14e05768a2138b9028San Mehat strncpy(buf, grp, len); 144503df2075991cd03ddf43d14e05768a2138b9028San Mehat buf[len] = '\0'; 145503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 146503df2075991cd03ddf43d14e05768a2138b9028San Mehat return 0; 147c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 148c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 149503df2075991cd03ddf43d14e05768a2138b9028San Mehat LOGE("Failed to find cpu subsys"); 150503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 151503df2075991cd03ddf43d14e05768a2138b9028San Mehat return -1; 152503df2075991cd03ddf43d14e05768a2138b9028San Mehat out_bad_data: 153503df2075991cd03ddf43d14e05768a2138b9028San Mehat LOGE("Bad cgroup data {%s}", lineBuf); 154503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 155503df2075991cd03ddf43d14e05768a2138b9028San Mehat return -1; 156c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#else 157c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ENOSYS; 158c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 159c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#endif 160c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 161c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 162c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint get_sched_policy(int tid, SchedPolicy *policy) 163c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 164c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat initialize(); 165c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 166c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (__sys_supports_schedgroups) { 167c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat char grpBuf[32]; 168c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (getSchedulerGroup(tid, grpBuf, sizeof(grpBuf)) < 0) 169c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 170c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (grpBuf[0] == '\0') { 171c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_FOREGROUND; 172c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } else if (!strcmp(grpBuf, "bg_non_interactive")) { 173c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_BACKGROUND; 174c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } else { 175c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ERANGE; 176c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 177c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 178c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } else { 179c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat int rc = sched_getscheduler(tid); 180c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (rc < 0) 181c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 182c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat else if (rc == SCHED_NORMAL) 183c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_FOREGROUND; 184c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat else if (rc == SCHED_BATCH) 185c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_BACKGROUND; 186c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat else { 187c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ERANGE; 188c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 189c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 190c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 191c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return 0; 192c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 193c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 194c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint set_sched_policy(int tid, SchedPolicy policy) 195c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 196c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat initialize(); 197493dad966305a7fb555addd367532dd2af275a27San Mehat 198d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#if POLICY_DEBUG 199d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char statfile[64]; 200d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char statline[1024]; 201d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char thread_name[255]; 202d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat int fd; 203d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 204d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat sprintf(statfile, "/proc/%d/stat", tid); 205d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat memset(thread_name, 0, sizeof(thread_name)); 206d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 207d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat fd = open(statfile, O_RDONLY); 208d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat if (fd >= 0) { 209d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat int rc = read(fd, statline, 1023); 210d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat close(fd); 211d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat statline[rc] = 0; 212d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char *p = statline; 213d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char *q; 214d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 215d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat for (p = statline; *p != '('; p++); 216d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat p++; 217d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat for (q = p; *q != ')'; q++); 218d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 219d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat strncpy(thread_name, p, (q-p)); 220d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } 221d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat if (policy == SP_BACKGROUND) { 222d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat LOGD("vvv tid %d (%s)", tid, thread_name); 223d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } else if (policy == SP_FOREGROUND) { 224d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat LOGD("^^^ tid %d (%s)", tid, thread_name); 225d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } else { 226d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat LOGD("??? tid %d (%s)", tid, thread_name); 227d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } 228d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#endif 229d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 230493dad966305a7fb555addd367532dd2af275a27San Mehat if (__sys_supports_schedgroups) { 231805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat const char *grp = ""; 232493dad966305a7fb555addd367532dd2af275a27San Mehat 233493dad966305a7fb555addd367532dd2af275a27San Mehat if (policy == SP_BACKGROUND) { 234493dad966305a7fb555addd367532dd2af275a27San Mehat grp = "bg_non_interactive"; 235493dad966305a7fb555addd367532dd2af275a27San Mehat } 236493dad966305a7fb555addd367532dd2af275a27San Mehat 237493dad966305a7fb555addd367532dd2af275a27San Mehat if (add_tid_to_cgroup(tid, grp)) { 238493dad966305a7fb555addd367532dd2af275a27San Mehat if (errno != ESRCH && errno != ENOENT) 239493dad966305a7fb555addd367532dd2af275a27San Mehat return -errno; 240493dad966305a7fb555addd367532dd2af275a27San Mehat } 241493dad966305a7fb555addd367532dd2af275a27San Mehat } else { 242493dad966305a7fb555addd367532dd2af275a27San Mehat struct sched_param param; 243493dad966305a7fb555addd367532dd2af275a27San Mehat 244493dad966305a7fb555addd367532dd2af275a27San Mehat param.sched_priority = 0; 245493dad966305a7fb555addd367532dd2af275a27San Mehat sched_setscheduler(tid, 246493dad966305a7fb555addd367532dd2af275a27San Mehat (policy == SP_BACKGROUND) ? 247493dad966305a7fb555addd367532dd2af275a27San Mehat SCHED_BATCH : SCHED_NORMAL, 248493dad966305a7fb555addd367532dd2af275a27San Mehat ¶m); 249493dad966305a7fb555addd367532dd2af275a27San Mehat } 250493dad966305a7fb555addd367532dd2af275a27San Mehat 251493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 252493dad966305a7fb555addd367532dd2af275a27San Mehat} 2530384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 2540384a98d6f61fa47ffde01c15e552f738e88fb94Raphael#endif /* HAVE_SCHED_H */ 255