newlib-cygwin/winsup/cygwin/sched.cc

446 lines
9.5 KiB
C++
Raw Normal View History

2001-03-21 22:00:29 +08:00
/* sched.cc: scheduler interface for Cygwin
Copyright 2001 Red Hat, Inc.
Written by Robert Collins <rbtcollins@hotmail.com>
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "winsup.h"
#include <limits.h>
#include <errno.h>
#include "cygerrno.h"
#include <assert.h>
#include <stdlib.h>
#include <syslog.h>
#include <sched.h>
#include "sigproc.h"
#include "pinfo.h"
/* for getpid */
#include <unistd.h>
/* Win32 priority to UNIX priority Mapping.
For now, I'm just following the spec: any range of priorities is ok.
There are probably many many issues with this...
We don't want process's going realtime. Well, they probably could, but the issues
2001-03-21 22:00:29 +08:00
with avoiding the priority values 17-22 and 27-30 (not supported before win2k)
make that inefficient.
2001-03-21 22:00:29 +08:00
However to complicate things most unixes use lower is better priorities.
So we map -14 to 15, and 15 to 1 via (16- ((n+16) >> 1))
2001-03-21 22:00:29 +08:00
we then map 1 to 15 to various process class and thread priority combinations
Then we need to look at the threads vi process priority. As win95 98 and NT 4
2001-03-21 22:00:29 +08:00
Don't support opening threads cross-process (unless a thread HANDLE is passed around)
for now, we'll just use the priority class.
2001-03-21 22:00:29 +08:00
The code and logic are present to calculate the priority for thread
, if a thread handle can be obtained. Alternatively, if the symbols wouldn't be
2001-03-21 22:00:29 +08:00
resolved until they are used
we could support this on windows 2000 and ME now, and just fall back to the
2001-03-21 22:00:29 +08:00
class only on pre win2000 machines.
2001-03-21 22:00:29 +08:00
Lastly, because we can't assume that the pid we're given are Windows pids, we can't
alter non-cygwin started programs.
2001-03-21 22:00:29 +08:00
*/
extern "C"
{
/* max priority for policy */
int
sched_get_priority_max (int policy)
{
if (policy < 1 || policy > 3)
{
set_errno (EINVAL);
return -1;
}
return -14;
}
/* min priority for policy */
int
sched_get_priority_min (int policy)
{
if (policy < 1 || policy > 3)
{
set_errno (EINVAL);
return -1;
}
return 15;
}
* configure.in: Remove PTH_ALLOW. * cygwin.din: Remove @PTH_ALLOW@ prefixes to pthread functions. Add new pthread exports. * pthread.cc: New wrapper functions for the above new exports. * sched.cc (valid_sched_parameters): New function. (sched_setparam): Use it. (sched_set_thread_priority): New function. Used by pthread_sched*. * thread.cc (pthread_key_destructor::InsertAfter): New function. (pthread_key_destructor::UnlinkNext): New function. (pthread_key_destructor::Next): New function. (pthread_key_destructor_list::Insert): New function. (pthread_key_destructor_list::Remove): New function. (pthread_key_destructor_list::Pop): New function. (pthread_key_destructor::pthread_key_destructor): New function. (pthread_key_destructor_list::IterateNull): New function. (MTinterface::Init): Initialise new member. (pthread::pthread): Initialise new members. (pthread::create): Copy new attributes. Set the new thread priority. (pthread_attr::pthread_attr): Initialise new members. (pthread_key::pthread_key): Setup destructor function. (pthread_key::~pthread_key): Remove destructor function. (pthread_mutexattr::pthread_mutexattr): New function. (pthread_mutexattr::~pthread_mutexattr): New function. (__pthread_once): New function. (__pthread_cleanup): New function. (__pthread_cancel): New function. (__pthread_setcancelstate): New function. (__pthread_setcanceltype): New function. (__pthread_testcancel): New function. (__pthread_attr_getinheritsched): New function. (__pthread_attr_getschedparam): New function. (__pthread_attr_getschedpolicy): New function. (__pthread_attr_getscope): New function. (__pthread_attr_setinheritsched): New function. (__pthread_attr_setschedparam): New function. (__pthread_attr_setschedpolicy): New function. (__pthread_attr_setscope): New function. (__pthread_exit): Call any key destructors on thread exit. (__pthread_join): Use the embedded attr values. (__pthread_detach): Use the embedded attr values. (__pthread_getconcurrency): New function. (__pthread_getschedparam): New function. (__pthread_key_create): Pass the destructor on object creation. (__pthread_key_delete): Correct incorrect prototype. (__pthread_setconcurrency): New function. (__pthread_setschedparam): New function. (__pthread_cond_timedwait): Support static mutex initialisers. (__pthread_cond_wait): Ditto. (__pthread_mutex_getprioceiling): New function. (__pthread_mutex_lock): Support static mutex initialisers. (__pthread_mutex_trylock): Ditto. (__pthread_mutex_unlock): Ditto. (__pthread_mutex_destroy): Ditto. (__pthread_mutex_setprioceiling): New function. (__pthread_mutexattr_getprotocol): New function. (__pthread_mutexattr_getpshared): New function. (__pthread_mutexattr_gettype): New function. (__pthread_mutexattr_init): New function. (__pthread_mutexattr_destroy): New function. (__pthread_mutexattr_setprotocol): New function. (__pthread_mutexattr_setprioceiling): New function. (__pthread_mutexattr_getprioceiling): New function. (__pthread_mutexattr_setpshared): New function. (__pthread_mutexattr_settype): New function. Remove stubs for non MT_SAFE compilation. * thread.h: Remove duplicate #defines. Add prototypes for new functions in thread.cc. (pthread_key_destructor): New class. (pthread_key_destructor_list): New class. (pthread_attr): Add new members. (pthread): Remove members that are duplicated in the pthread_attr class. (pthread_mutex_attr): Add new members. (pthread_once): New class. * include/pthread.h: Add prototypes for new functions exported from cygwin1.dll. Remove typedefs. * include/sched.h: Add prototypes for new functions in sched.cc. * include/cygwin/types.h: Add typedefs from pthread.h
2001-04-12 12:04:53 +08:00
/* Check a scheduler parameter struct for valid settings */
int
valid_sched_parameters(const struct sched_param *param)
{
if (param->sched_priority < -14 || param->sched_priority > 15)
{
return 0;
}
return -1;
}
2001-03-21 22:00:29 +08:00
/* get sched params for process
Note, I'm never returning EPERM,
2001-03-21 22:00:29 +08:00
Always ESRCH. This is by design (If cygwin ever looks at paranoid security
Walking the pid values is a known hole in some os's)
2001-03-21 22:00:29 +08:00
*/
int
sched_getparam (pid_t pid, struct sched_param *param)
{
pid_t localpid;
int winpri;
if (!param || pid < 0)
{
set_errno (EINVAL);
return -1;
}
localpid = pid ? pid : getpid ();
DWORD Class;
int ThreadPriority;
HANDLE process;
pinfo p (localpid);
/* get the class */
if (!p)
{
set_errno (ESRCH);
return -1;
}
process = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, p->dwProcessId);
if (!process)
{
set_errno (ESRCH);
return -1;
}
Class = GetPriorityClass (process);
CloseHandle (process);
if (!Class)
{
set_errno (ESRCH);
return -1;
}
ThreadPriority = THREAD_PRIORITY_NORMAL;
/* calculate the unix priority.
FIXME: windows 2000 supports ABOVE_NORMAL and BELOW_NORMAL class's
So this logic just defaults those class factors to NORMAL in the calculations */
switch (Class)
{
case IDLE_PRIORITY_CLASS:
switch (ThreadPriority)
{
case THREAD_PRIORITY_IDLE:
winpri = 1;
break;
case THREAD_PRIORITY_LOWEST:
winpri = 2;
break;
case THREAD_PRIORITY_BELOW_NORMAL:
winpri = 3;
break;
case THREAD_PRIORITY_NORMAL:
winpri = 4;
break;
case THREAD_PRIORITY_ABOVE_NORMAL:
winpri = 5;
break;
case THREAD_PRIORITY_HIGHEST:
default:
winpri = 6;
break;
}
break;
case HIGH_PRIORITY_CLASS:
switch (ThreadPriority)
{
case THREAD_PRIORITY_IDLE:
winpri = 1;
break;
case THREAD_PRIORITY_LOWEST:
winpri = 11;
break;
case THREAD_PRIORITY_BELOW_NORMAL:
winpri = 12;
break;
case THREAD_PRIORITY_NORMAL:
winpri = 13;
break;
case THREAD_PRIORITY_ABOVE_NORMAL:
winpri = 14;
break;
case THREAD_PRIORITY_HIGHEST:
default:
winpri = 15;
break;
}
break;
case NORMAL_PRIORITY_CLASS:
default:
switch (ThreadPriority)
{
case THREAD_PRIORITY_IDLE:
winpri = 1;
break;
case THREAD_PRIORITY_LOWEST:
winpri = 7;
break;
case THREAD_PRIORITY_BELOW_NORMAL:
winpri = 8;
break;
case THREAD_PRIORITY_NORMAL:
winpri = 9;
break;
case THREAD_PRIORITY_ABOVE_NORMAL:
winpri = 10;
break;
case THREAD_PRIORITY_HIGHEST:
default:
winpri = 11;
break;
}
break;
}
/* reverse out winpri = (16- ((unixpri+16) >> 1)) */
/*
2001-03-21 22:00:29 +08:00
winpri-16 = - (unixpri +16 ) >> 1
-(winpri-16) = unixpri +16 >> 1
(-(winpri-16)) << 1 = unixpri+16
((-(winpri - 16)) << 1) - 16 = unixpri
*/
param->sched_priority = ((-(winpri - 16)) << 1) - 16;
return 0;
}
/* get the scheduler for pid
All process's on WIN32 run with SCHED_FIFO.
So we just give an answer.
2001-03-21 22:00:29 +08:00
(WIN32 uses a multi queue FIFO).
*/
int
sched_getscheduler (pid_t pid)
{
if (pid < 0)
return ESRCH;
else
return SCHED_FIFO;
}
/* get the time quantum for pid
We can't return -11, errno ENOSYS, because that implies that
sched_get_priority_max & min are also not supported (according to the spec)
so some spec-driven autoconf tests will likely assume they aren't present either
returning ESRCH might confuse some applications (if they assumed that when
rr_get_interval is called on pid 0 it always works).
If someone knows the time quanta for the various win32 platforms, then a
2001-03-21 22:00:29 +08:00
simple check for the os we're running on will finish this function
*/
int
sched_rr_get_interval (pid_t pid, struct timespec *interval)
{
set_errno (ESRCH);
return -1;
}
/* set the scheduling parameters */
int
sched_setparam (pid_t pid, const struct sched_param *param)
{
pid_t localpid;
int winpri;
DWORD Class;
int ThreadPriority;
HANDLE process;
if (!param || pid < 0)
{
set_errno (EINVAL);
return -1;
}
* configure.in: Remove PTH_ALLOW. * cygwin.din: Remove @PTH_ALLOW@ prefixes to pthread functions. Add new pthread exports. * pthread.cc: New wrapper functions for the above new exports. * sched.cc (valid_sched_parameters): New function. (sched_setparam): Use it. (sched_set_thread_priority): New function. Used by pthread_sched*. * thread.cc (pthread_key_destructor::InsertAfter): New function. (pthread_key_destructor::UnlinkNext): New function. (pthread_key_destructor::Next): New function. (pthread_key_destructor_list::Insert): New function. (pthread_key_destructor_list::Remove): New function. (pthread_key_destructor_list::Pop): New function. (pthread_key_destructor::pthread_key_destructor): New function. (pthread_key_destructor_list::IterateNull): New function. (MTinterface::Init): Initialise new member. (pthread::pthread): Initialise new members. (pthread::create): Copy new attributes. Set the new thread priority. (pthread_attr::pthread_attr): Initialise new members. (pthread_key::pthread_key): Setup destructor function. (pthread_key::~pthread_key): Remove destructor function. (pthread_mutexattr::pthread_mutexattr): New function. (pthread_mutexattr::~pthread_mutexattr): New function. (__pthread_once): New function. (__pthread_cleanup): New function. (__pthread_cancel): New function. (__pthread_setcancelstate): New function. (__pthread_setcanceltype): New function. (__pthread_testcancel): New function. (__pthread_attr_getinheritsched): New function. (__pthread_attr_getschedparam): New function. (__pthread_attr_getschedpolicy): New function. (__pthread_attr_getscope): New function. (__pthread_attr_setinheritsched): New function. (__pthread_attr_setschedparam): New function. (__pthread_attr_setschedpolicy): New function. (__pthread_attr_setscope): New function. (__pthread_exit): Call any key destructors on thread exit. (__pthread_join): Use the embedded attr values. (__pthread_detach): Use the embedded attr values. (__pthread_getconcurrency): New function. (__pthread_getschedparam): New function. (__pthread_key_create): Pass the destructor on object creation. (__pthread_key_delete): Correct incorrect prototype. (__pthread_setconcurrency): New function. (__pthread_setschedparam): New function. (__pthread_cond_timedwait): Support static mutex initialisers. (__pthread_cond_wait): Ditto. (__pthread_mutex_getprioceiling): New function. (__pthread_mutex_lock): Support static mutex initialisers. (__pthread_mutex_trylock): Ditto. (__pthread_mutex_unlock): Ditto. (__pthread_mutex_destroy): Ditto. (__pthread_mutex_setprioceiling): New function. (__pthread_mutexattr_getprotocol): New function. (__pthread_mutexattr_getpshared): New function. (__pthread_mutexattr_gettype): New function. (__pthread_mutexattr_init): New function. (__pthread_mutexattr_destroy): New function. (__pthread_mutexattr_setprotocol): New function. (__pthread_mutexattr_setprioceiling): New function. (__pthread_mutexattr_getprioceiling): New function. (__pthread_mutexattr_setpshared): New function. (__pthread_mutexattr_settype): New function. Remove stubs for non MT_SAFE compilation. * thread.h: Remove duplicate #defines. Add prototypes for new functions in thread.cc. (pthread_key_destructor): New class. (pthread_key_destructor_list): New class. (pthread_attr): Add new members. (pthread): Remove members that are duplicated in the pthread_attr class. (pthread_mutex_attr): Add new members. (pthread_once): New class. * include/pthread.h: Add prototypes for new functions exported from cygwin1.dll. Remove typedefs. * include/sched.h: Add prototypes for new functions in sched.cc. * include/cygwin/types.h: Add typedefs from pthread.h
2001-04-12 12:04:53 +08:00
if (!valid_sched_parameters(param))
2001-03-21 22:00:29 +08:00
{
set_errno (EINVAL);
return -1;
}
/* winpri = (16- ((unixpri+16) >> 1)) */
winpri = 16 - ((param->sched_priority + 16) >> 1);
/* calculate our desired priority class and thread priority */
if (winpri < 7)
Class = IDLE_PRIORITY_CLASS;
else if (winpri > 10)
Class = HIGH_PRIORITY_CLASS;
else
Class = NORMAL_PRIORITY_CLASS;
switch (Class)
{
case IDLE_PRIORITY_CLASS:
switch (winpri)
{
case 1:
ThreadPriority = THREAD_PRIORITY_IDLE;
break;
case 2:
ThreadPriority = THREAD_PRIORITY_LOWEST;
break;
case 3:
ThreadPriority = THREAD_PRIORITY_BELOW_NORMAL;
break;
case 4:
ThreadPriority = THREAD_PRIORITY_NORMAL;
break;
case 5:
ThreadPriority = THREAD_PRIORITY_ABOVE_NORMAL;
break;
case 6:
ThreadPriority = THREAD_PRIORITY_HIGHEST;
break;
}
break;
case NORMAL_PRIORITY_CLASS:
switch (winpri)
{
case 7:
ThreadPriority = THREAD_PRIORITY_LOWEST;
break;
case 8:
ThreadPriority = THREAD_PRIORITY_BELOW_NORMAL;
break;
case 9:
ThreadPriority = THREAD_PRIORITY_NORMAL;
break;
case 10:
ThreadPriority = THREAD_PRIORITY_ABOVE_NORMAL;
break;
case 11:
ThreadPriority = THREAD_PRIORITY_HIGHEST;
break;
}
break;
case HIGH_PRIORITY_CLASS:
switch (winpri)
{
case 12:
ThreadPriority = THREAD_PRIORITY_BELOW_NORMAL;
break;
case 13:
ThreadPriority = THREAD_PRIORITY_NORMAL;
break;
case 14:
ThreadPriority = THREAD_PRIORITY_ABOVE_NORMAL;
break;
case 15:
ThreadPriority = THREAD_PRIORITY_HIGHEST;
break;
}
break;
}
localpid = pid ? pid : getpid ();
pinfo p (localpid);
/* set the class */
if (!p)
{
set_errno (1); //ESRCH);
return -1;
}
process =
OpenProcess (PROCESS_SET_INFORMATION, FALSE, (DWORD) p->dwProcessId);
if (!process)
{
set_errno (2); //ESRCH);
return -1;
}
if (!SetPriorityClass (process, Class))
{
CloseHandle (process);
set_errno (EPERM);
return -1;
}
CloseHandle (process);
return 0;
}
* configure.in: Remove PTH_ALLOW. * cygwin.din: Remove @PTH_ALLOW@ prefixes to pthread functions. Add new pthread exports. * pthread.cc: New wrapper functions for the above new exports. * sched.cc (valid_sched_parameters): New function. (sched_setparam): Use it. (sched_set_thread_priority): New function. Used by pthread_sched*. * thread.cc (pthread_key_destructor::InsertAfter): New function. (pthread_key_destructor::UnlinkNext): New function. (pthread_key_destructor::Next): New function. (pthread_key_destructor_list::Insert): New function. (pthread_key_destructor_list::Remove): New function. (pthread_key_destructor_list::Pop): New function. (pthread_key_destructor::pthread_key_destructor): New function. (pthread_key_destructor_list::IterateNull): New function. (MTinterface::Init): Initialise new member. (pthread::pthread): Initialise new members. (pthread::create): Copy new attributes. Set the new thread priority. (pthread_attr::pthread_attr): Initialise new members. (pthread_key::pthread_key): Setup destructor function. (pthread_key::~pthread_key): Remove destructor function. (pthread_mutexattr::pthread_mutexattr): New function. (pthread_mutexattr::~pthread_mutexattr): New function. (__pthread_once): New function. (__pthread_cleanup): New function. (__pthread_cancel): New function. (__pthread_setcancelstate): New function. (__pthread_setcanceltype): New function. (__pthread_testcancel): New function. (__pthread_attr_getinheritsched): New function. (__pthread_attr_getschedparam): New function. (__pthread_attr_getschedpolicy): New function. (__pthread_attr_getscope): New function. (__pthread_attr_setinheritsched): New function. (__pthread_attr_setschedparam): New function. (__pthread_attr_setschedpolicy): New function. (__pthread_attr_setscope): New function. (__pthread_exit): Call any key destructors on thread exit. (__pthread_join): Use the embedded attr values. (__pthread_detach): Use the embedded attr values. (__pthread_getconcurrency): New function. (__pthread_getschedparam): New function. (__pthread_key_create): Pass the destructor on object creation. (__pthread_key_delete): Correct incorrect prototype. (__pthread_setconcurrency): New function. (__pthread_setschedparam): New function. (__pthread_cond_timedwait): Support static mutex initialisers. (__pthread_cond_wait): Ditto. (__pthread_mutex_getprioceiling): New function. (__pthread_mutex_lock): Support static mutex initialisers. (__pthread_mutex_trylock): Ditto. (__pthread_mutex_unlock): Ditto. (__pthread_mutex_destroy): Ditto. (__pthread_mutex_setprioceiling): New function. (__pthread_mutexattr_getprotocol): New function. (__pthread_mutexattr_getpshared): New function. (__pthread_mutexattr_gettype): New function. (__pthread_mutexattr_init): New function. (__pthread_mutexattr_destroy): New function. (__pthread_mutexattr_setprotocol): New function. (__pthread_mutexattr_setprioceiling): New function. (__pthread_mutexattr_getprioceiling): New function. (__pthread_mutexattr_setpshared): New function. (__pthread_mutexattr_settype): New function. Remove stubs for non MT_SAFE compilation. * thread.h: Remove duplicate #defines. Add prototypes for new functions in thread.cc. (pthread_key_destructor): New class. (pthread_key_destructor_list): New class. (pthread_attr): Add new members. (pthread): Remove members that are duplicated in the pthread_attr class. (pthread_mutex_attr): Add new members. (pthread_once): New class. * include/pthread.h: Add prototypes for new functions exported from cygwin1.dll. Remove typedefs. * include/sched.h: Add prototypes for new functions in sched.cc. * include/cygwin/types.h: Add typedefs from pthread.h
2001-04-12 12:04:53 +08:00
/* we map -14 to 15, and 15 to 1 via (16- ((n+16) >> 1)). This lines up with the allowed
* valueswe return elsewhere in the sched* functions. We then map in groups of three to
* allowed thread priority's. The reason for dropping accuracy while still returning
* a wide range of values is to allow more flexible code in the future.
*/
int
sched_set_thread_priority(HANDLE thread, int priority)
{
int real_pri;
real_pri = 16 - ((priority + 16) >> 1);
if (real_pri <1 || real_pri > 15)
return EINVAL;
if (real_pri < 4)
* configure.in: Remove PTH_ALLOW. * cygwin.din: Remove @PTH_ALLOW@ prefixes to pthread functions. Add new pthread exports. * pthread.cc: New wrapper functions for the above new exports. * sched.cc (valid_sched_parameters): New function. (sched_setparam): Use it. (sched_set_thread_priority): New function. Used by pthread_sched*. * thread.cc (pthread_key_destructor::InsertAfter): New function. (pthread_key_destructor::UnlinkNext): New function. (pthread_key_destructor::Next): New function. (pthread_key_destructor_list::Insert): New function. (pthread_key_destructor_list::Remove): New function. (pthread_key_destructor_list::Pop): New function. (pthread_key_destructor::pthread_key_destructor): New function. (pthread_key_destructor_list::IterateNull): New function. (MTinterface::Init): Initialise new member. (pthread::pthread): Initialise new members. (pthread::create): Copy new attributes. Set the new thread priority. (pthread_attr::pthread_attr): Initialise new members. (pthread_key::pthread_key): Setup destructor function. (pthread_key::~pthread_key): Remove destructor function. (pthread_mutexattr::pthread_mutexattr): New function. (pthread_mutexattr::~pthread_mutexattr): New function. (__pthread_once): New function. (__pthread_cleanup): New function. (__pthread_cancel): New function. (__pthread_setcancelstate): New function. (__pthread_setcanceltype): New function. (__pthread_testcancel): New function. (__pthread_attr_getinheritsched): New function. (__pthread_attr_getschedparam): New function. (__pthread_attr_getschedpolicy): New function. (__pthread_attr_getscope): New function. (__pthread_attr_setinheritsched): New function. (__pthread_attr_setschedparam): New function. (__pthread_attr_setschedpolicy): New function. (__pthread_attr_setscope): New function. (__pthread_exit): Call any key destructors on thread exit. (__pthread_join): Use the embedded attr values. (__pthread_detach): Use the embedded attr values. (__pthread_getconcurrency): New function. (__pthread_getschedparam): New function. (__pthread_key_create): Pass the destructor on object creation. (__pthread_key_delete): Correct incorrect prototype. (__pthread_setconcurrency): New function. (__pthread_setschedparam): New function. (__pthread_cond_timedwait): Support static mutex initialisers. (__pthread_cond_wait): Ditto. (__pthread_mutex_getprioceiling): New function. (__pthread_mutex_lock): Support static mutex initialisers. (__pthread_mutex_trylock): Ditto. (__pthread_mutex_unlock): Ditto. (__pthread_mutex_destroy): Ditto. (__pthread_mutex_setprioceiling): New function. (__pthread_mutexattr_getprotocol): New function. (__pthread_mutexattr_getpshared): New function. (__pthread_mutexattr_gettype): New function. (__pthread_mutexattr_init): New function. (__pthread_mutexattr_destroy): New function. (__pthread_mutexattr_setprotocol): New function. (__pthread_mutexattr_setprioceiling): New function. (__pthread_mutexattr_getprioceiling): New function. (__pthread_mutexattr_setpshared): New function. (__pthread_mutexattr_settype): New function. Remove stubs for non MT_SAFE compilation. * thread.h: Remove duplicate #defines. Add prototypes for new functions in thread.cc. (pthread_key_destructor): New class. (pthread_key_destructor_list): New class. (pthread_attr): Add new members. (pthread): Remove members that are duplicated in the pthread_attr class. (pthread_mutex_attr): Add new members. (pthread_once): New class. * include/pthread.h: Add prototypes for new functions exported from cygwin1.dll. Remove typedefs. * include/sched.h: Add prototypes for new functions in sched.cc. * include/cygwin/types.h: Add typedefs from pthread.h
2001-04-12 12:04:53 +08:00
real_pri = THREAD_PRIORITY_LOWEST;
else if (real_pri < 7)
real_pri = THREAD_PRIORITY_BELOW_NORMAL;
else if (real_pri < 10)
real_pri = THREAD_PRIORITY_NORMAL;
else if (real_pri < 13)
real_pri = THREAD_PRIORITY_ABOVE_NORMAL;
else
real_pri = THREAD_PRIORITY_HIGHEST;
if (!SetThreadPriority(thread, real_pri))
/* invalid handle, no access are the only expected errors. */
return EPERM;
return 0;
}
2001-03-21 22:00:29 +08:00
/* set the scheduler */
int
sched_setscheduler (pid_t pid, int policy,
const struct sched_param *param)
{
/* on win32, you can't change the scheduler. Doh! */
set_errno (ENOSYS);
return -1;
}
/* yield the cpu */
int
sched_yield (void)
{
Sleep (0);
return 0;
}
}