15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Module: sched.h
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Purpose:
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Provides an implementation of POSIX realtime extensions
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      as defined in
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *              POSIX 1003.1b-1993      (POSIX.1b)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * --------------------------------------------------------------------------
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Pthreads-win32 - POSIX Threads Library for Win32
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Copyright(C) 1998 John E. Bossom
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Copyright(C) 1999,2005 Pthreads-win32 contributors
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Contact Email: rpj@callisto.canberra.edu.au
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      The current list of contributors is contained
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      in the file CONTRIBUTORS included with the source
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      code distribution. The list can also be seen at the
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      following World Wide Web location:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      http://sources.redhat.com/pthreads-win32/contributors.html
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      This library is free software; you can redistribute it and/or
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      modify it under the terms of the GNU Lesser General Public
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      License as published by the Free Software Foundation; either
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      version 2 of the License, or (at your option) any later version.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      This library is distributed in the hope that it will be useful,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      but WITHOUT ANY WARRANTY; without even the implied warranty of
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Lesser General Public License for more details.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      You should have received a copy of the GNU Lesser General Public
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      License along with this library in the file COPYING.LIB;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      if not, write to the Free Software Foundation, Inc.,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_SCHED_H)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _SCHED_H
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SCHED_LEVEL
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_POSIX_SOURCE)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SCHED_LEVEL 0
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Early POSIX */
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SCHED_LEVEL
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SCHED_LEVEL 1
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Include 1b, 1c and 1d */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(INCLUDE_NP)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SCHED_LEVEL
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SCHED_LEVEL 2
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Include Non-Portable extensions */
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SCHED_LEVEL_MAX 3
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 )  || !defined(PTW32_SCHED_LEVEL)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Include everything */
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__) && !defined(__declspec)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# error Please upgrade your GNU compiler to one that supports __declspec.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When building the library, you should define PTW32_BUILD so that
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the variables/functions are exported correctly. When using the library,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * do NOT define PTW32_BUILD, and then the variables/functions will
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be imported correctly.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PTW32_STATIC_LIB)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  if defined(PTW32_BUILD)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define PTW32_DLLPORT __declspec (dllexport)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  else
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define PTW32_DLLPORT __declspec (dllimport)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define PTW32_DLLPORT
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is a duplicate of what is in the autoconf config.h,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which is only used when building the pthread-win32 libraries.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(PTW32_CONFIG_H)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  if defined(WINCE)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define NEED_ERRNO
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define NEED_SEM
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  if defined(__MINGW64__)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define HAVE_STRUCT_TIMESPEC
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define HAVE_MODE_T
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  elif defined(_UWIN) || defined(__MINGW32__)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    define HAVE_MODE_T
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  endif
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NEED_ERRNO)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "need_errno.h"
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h>
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX */
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(__MINGW64__) || defined(__MINGW32__)) || defined(_UWIN)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* For pid_t */
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include <sys/types.h>
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Required by Unix 98 */
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  include <time.h>
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# else
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   typedef int pid_t;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef int pid_t;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Thread scheduling policies */
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCHED_OTHER = 0,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCHED_FIFO,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCHED_RR,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCHED_MIN   = SCHED_OTHER,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCHED_MAX   = SCHED_RR
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct sched_param {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sched_priority;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C"
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif                          /* __cplusplus */
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sched_yield (void);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sched_get_priority_min (int policy);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sched_get_priority_max (int policy);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that this macro returns ENOTSUP rather than
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ENOSYS as might be expected. However, returning ENOSYS
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * should mean that sched_get_priority_{min,max} are
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * not implemented as well as sched_rr_get_interval.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is not the case, since we just don't support
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * round-robin scheduling. Therefore I have chosen to
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * return the same value as sched_setscheduler when
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SCHED_RR is passed to it.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define sched_rr_get_interval(_pid, _interval) \
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ( errno = ENOTSUP, (int) -1 )
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__cplusplus)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}                               /* End of extern "C" */
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif                          /* __cplusplus */
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SCHED_LEVEL
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef PTW32_SCHED_LEVEL_MAX
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif                          /* !_SCHED_H */
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
184