1/*
2 * sched_setscheduler.c
3 *
4 * Description:
5 * POSIX thread functions that deal with thread scheduling.
6 *
7 * --------------------------------------------------------------------------
8 *
9 *      Pthreads-win32 - POSIX Threads Library for Win32
10 *      Copyright(C) 1998 John E. Bossom
11 *      Copyright(C) 1999,2005 Pthreads-win32 contributors
12 *
13 *      Contact Email: rpj@callisto.canberra.edu.au
14 *
15 *      The current list of contributors is contained
16 *      in the file CONTRIBUTORS included with the source
17 *      code distribution. The list can also be seen at the
18 *      following World Wide Web location:
19 *      http://sources.redhat.com/pthreads-win32/contributors.html
20 *
21 *      This library is free software; you can redistribute it and/or
22 *      modify it under the terms of the GNU Lesser General Public
23 *      License as published by the Free Software Foundation; either
24 *      version 2 of the License, or (at your option) any later version.
25 *
26 *      This library is distributed in the hope that it will be useful,
27 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
28 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
29 *      Lesser General Public License for more details.
30 *
31 *      You should have received a copy of the GNU Lesser General Public
32 *      License along with this library in the file COPYING.LIB;
33 *      if not, write to the Free Software Foundation, Inc.,
34 *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
35 */
36
37#include "pthread.h"
38#include "implement.h"
39#include "sched.h"
40
41int
42sched_setscheduler (pid_t pid, int policy)
43{
44  /*
45   * Win32 only has one policy which we call SCHED_OTHER.
46   * However, we try to provide other valid side-effects
47   * such as EPERM and ESRCH errors. Choosing to check
48   * for a valid policy last allows us to get the most value out
49   * of this function.
50   */
51  if (0 != pid)
52    {
53      int selfPid = (int) GetCurrentProcessId ();
54
55      if (pid != selfPid)
56	{
57	  HANDLE h =
58	    OpenProcess (PROCESS_SET_INFORMATION, PTW32_FALSE, (DWORD) pid);
59
60	  if (NULL == h)
61	    {
62	      errno =
63		(GetLastError () ==
64		 (0xFF & ERROR_ACCESS_DENIED)) ? EPERM : ESRCH;
65	      return -1;
66	    }
67	  else
68	    CloseHandle(h);
69	}
70    }
71
72  if (SCHED_OTHER != policy)
73    {
74      errno = ENOSYS;
75      return -1;
76    }
77
78  /*
79   * Don't set anything because there is nothing to set.
80   * Just return the current (the only possible) value.
81   */
82  return SCHED_OTHER;
83}
84