/* reset scheduler from real-time to normal scheduling */ void reset_scheduler(void) { #ifdef _AIX_ #if HAVE_THREAD_SETSCHED struct thrdentry64 te; tid64_t ti; ti = 0ULL; if (getthrds64(getpid(), &te, sizeof(te), &ti, 1) != 1) { DEBUG(DEBUG_ERR, ("Unable to get thread information\n")); } if (thread_setsched(te.ti_tid, 0, SCHED_OTHER) == -1) { DEBUG(DEBUG_ERR, ("Unable to set scheduler to SCHED_OTHER\n")); } #endif #else /* no AIX */ #if HAVE_SCHED_SETSCHEDULER #ifndef SCHED_RESET_ON_FORK struct sched_param p; p.sched_priority = 0; if (sched_setscheduler(0, SCHED_OTHER, &p) == -1) { DEBUG(DEBUG_ERR, ("Unable to set scheduler to SCHED_OTHER\n")); } #endif #endif #endif }
/* if possible, make this task real time */ bool set_scheduler(void) { #ifdef _AIX_ #if HAVE_THREAD_SETSCHED struct thrdentry64 te; tid64_t ti; ti = 0ULL; if (getthrds64(getpid(), &te, sizeof(te), &ti, 1) != 1) { DEBUG(DEBUG_ERR, ("Unable to get thread information\n")); return false; } if (thread_setsched(te.ti_tid, 0, SCHED_RR) == -1) { DEBUG(DEBUG_ERR, ("Unable to set scheduler to SCHED_RR (%s)\n", strerror(errno))); return false; } else { return true; } #endif #else /* no AIX */ #if HAVE_SCHED_SETSCHEDULER struct sched_param p; int policy = SCHED_FIFO; p.sched_priority = 1; #ifdef SCHED_RESET_ON_FORK policy |= SCHED_RESET_ON_FORK; #endif if (sched_setscheduler(0, policy, &p) == -1) { DEBUG(DEBUG_CRIT,("Unable to set scheduler to SCHED_FIFO (%s)\n", strerror(errno))); return false; } else { return true; } #endif #endif DEBUG(DEBUG_CRIT,("No way to set real-time priority.\n")); return false; }