/* * sched_setscheduler.c * * Description: * POSIX thread functions that deal with thread scheduling. * * -------------------------------------------------------------------------- * * Pthreads4w - POSIX Threads Library for Win32 * Copyright(C) 1998 John E. Bossom * Copyright(C) 1999-2018, Pthreads4w contributors * * Homepage: https://sourceforge.net/projects/pthreads4w/ * * The current list of contributors is contained * in the file CONTRIBUTORS included with the source * code distribution. The list can also be seen at the * following World Wide Web location: * https://sourceforge.net/p/pthreads4w/wiki/Contributors/ * * This file is part of Pthreads4w. * * Pthreads4w is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Pthreads4w is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Pthreads4w. If not, see . * */ #ifdef HAVE_CONFIG_H # include #endif #include "pthread.h" #include "implement.h" #include "sched.h" int sched_setscheduler (pid_t pid, int policy) { /* * Win32 only has one policy which we call SCHED_OTHER. * However, we try to provide other valid side-effects * such as EPERM and ESRCH errors. Choosing to check * for a valid policy last allows us to get the most value out * of this function. */ if (0 != pid) { int selfPid = (int) GetCurrentProcessId (); if (pid != selfPid) { HANDLE h = OpenProcess (PROCESS_SET_INFORMATION, PTW32_FALSE, (DWORD) pid); if (NULL == h) { PTW32_SET_ERRNO((GetLastError () == (0xFF & ERROR_ACCESS_DENIED)) ? EPERM : ESRCH); return -1; } else CloseHandle(h); } } if (SCHED_OTHER != policy) { PTW32_SET_ERRNO(ENOSYS); return -1; } /* * Don't set anything because there is nothing to set. * Just return the current (the only possible) value. */ return SCHED_OTHER; }