int set_cpuset_policy(int tid, SchedPolicy policy) { // in the absence of cpusets, use the old sched policy #ifndef USE_CPUSETS return set_sched_policy(tid, policy); #else if (tid == 0) { tid = gettid(); } policy = _policy(policy); pthread_once(&the_once, __initialize); int fd; switch (policy) { case SP_BACKGROUND: fd = bg_cpuset_fd; break; case SP_FOREGROUND: case SP_AUDIO_APP: case SP_AUDIO_SYS: fd = fg_cpuset_fd; break; default: fd = -1; break; } if (add_tid_to_cgroup(tid, fd) != 0) { if (errno != ESRCH && errno != ENOENT) return -errno; } return 0; #endif }
void post_event(typename Time::type t, const common::ExternalEvent < Time >& event) { #ifdef WITH_TRACE common::Trace < Time >::trace() << common::TraceElement < Time >(type::get_name(), t, common::POST_EVENT) << ": BEFORE => " << event.to_string(); common::Trace < Time >::trace().flush(); #endif if (t == type::_tn) { _graph_manager.post_event(t, event); } else { _policy(t, event, type::_tl, type::_tn); } #ifdef WITH_TRACE common::Trace < Time >::trace() << common::TraceElement < Time >(type::get_name(), t, common::POST_EVENT) << ": AFTER => " << event.to_string(); common::Trace < Time >::trace().flush(); #endif }
const char *get_sched_policy_name(SchedPolicy policy) { policy = _policy(policy); static const char * const strings[SP_CNT] = { [SP_BACKGROUND] = "bg", [SP_FOREGROUND] = "fg", [SP_SYSTEM] = " ", [SP_AUDIO_APP] = "aa", [SP_AUDIO_SYS] = "as", }; if ((policy < SP_CNT) && (strings[policy] != NULL)) return strings[policy]; else return "error"; }
int set_sched_policy(int tid, SchedPolicy policy) { if (tid == 0) { tid = gettid(); } policy = _policy(policy); pthread_once(&the_once, __initialize); #if POLICY_DEBUG char statfile[64]; char statline[1024]; char thread_name[255]; int fd; sprintf(statfile, "/proc/%d/stat", tid); memset(thread_name, 0, sizeof(thread_name)); fd = open(statfile, O_RDONLY); if (fd >= 0) { int rc = read(fd, statline, 1023); close(fd); statline[rc] = 0; char *p = statline; char *q; for (p = statline; *p != '('; p++); p++; for (q = p; *q != ')'; q++); strncpy(thread_name, p, (q-p)); } switch (policy) { case SP_BACKGROUND: SLOGD("vvv tid %d (%s)", tid, thread_name); break; case SP_FOREGROUND: case SP_AUDIO_APP: case SP_AUDIO_SYS: case SP_TOP_APP: SLOGD("^^^ tid %d (%s)", tid, thread_name); break; case SP_SYSTEM: SLOGD("/// tid %d (%s)", tid, thread_name); break; default: SLOGD("??? tid %d (%s)", tid, thread_name); break; } #endif if (__sys_supports_schedgroups) { int fd; switch (policy) { case SP_BACKGROUND: fd = bg_cgroup_fd; break; case SP_FOREGROUND: case SP_AUDIO_APP: case SP_AUDIO_SYS: case SP_TOP_APP: fd = fg_cgroup_fd; break; default: fd = -1; break; } if (add_tid_to_cgroup(tid, fd) != 0) { if (errno != ESRCH && errno != ENOENT) return -errno; } } else { struct sched_param param; param.sched_priority = 0; sched_setscheduler(tid, (policy == SP_BACKGROUND) ? SCHED_BATCH : SCHED_NORMAL, ¶m); } prctl(PR_SET_TIMERSLACK_PID, policy == SP_BACKGROUND ? TIMER_SLACK_BG : TIMER_SLACK_FG, tid); return 0; }