2 * Copyright (c) 2005 David Xu <davidxu@freebsd.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice unmodified, this list of conditions, and the following
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 * $DragonFly: src/lib/libthread_xu/thread/thr_kern.c,v 1.5 2008/09/30 16:57:06 swildner Exp $
29 #include <sys/cdefs.h>
30 #include <sys/types.h>
31 #include <sys/signalvar.h>
32 #include <sys/rtprio.h>
34 #include "thr_private.h"
36 /*#define DEBUG_THREAD_KERN */
37 #ifdef DEBUG_THREAD_KERN
38 #define DBG_MSG stdout_debug
44 * This is called when the first thread (other than the initial
48 _thr_setthreaded(int threaded
)
50 if (((threaded
== 0) ^ (__isthreaded
== 0)) == 0)
53 __isthreaded
= threaded
;
65 _thr_signal_block(struct pthread
*curthread
)
69 if (curthread
->sigblock
> 0) {
70 curthread
->sigblock
++;
74 SIGDELSET(set
, SIGBUS
);
75 SIGDELSET(set
, SIGILL
);
76 SIGDELSET(set
, SIGFPE
);
77 SIGDELSET(set
, SIGSEGV
);
78 SIGDELSET(set
, SIGTRAP
);
79 __sys_sigprocmask(SIG_BLOCK
, &set
, &curthread
->sigmask
);
80 curthread
->sigblock
++;
84 _thr_signal_unblock(struct pthread
*curthread
)
86 if (--curthread
->sigblock
== 0)
87 __sys_sigprocmask(SIG_SETMASK
, &curthread
->sigmask
, NULL
);
91 _thr_assert_lock_level(void)
93 PANIC("locklevel <= 0");
97 _thr_send_sig(struct pthread
*thread
, int sig
)
99 return (lwp_kill(-1, thread
->tid
, sig
));
105 return (lwp_gettid());
109 * We don't use the priority for SCHED_OTHER, but
110 * some programs may depend on getting an error when
111 * setting a priority that is out of the range returned
112 * by sched_get_priority_{min,max}. Not sure if this
113 * falls into implementation defined behavior or not.
116 _thr_set_sched_other_prio(struct pthread
*pth
, int prio
)
118 static int max
, min
, init_status
;
121 * switch (init_status) {
122 * case 0: need initialization
123 * case 1: initialization successful
124 * case 2: initialization failed. can't happen, but if
125 * it does, accept all and hope for the best.
126 * It's not like we use it anyway.
133 if (((min
= sched_get_priority_min(SCHED_OTHER
)) == -1) &&
136 if (((max
= sched_get_priority_max(SCHED_OTHER
)) == -1) &&
141 if ((init_status
== 2) || ((prio
>= min
) && (prio
<= max
))) {
149 _rtp_to_schedparam(const struct rtprio
*rtp
, int *policy
,
150 struct sched_param
*param
)
153 case RTP_PRIO_REALTIME
:
155 param
->sched_priority
= RTP_PRIO_MAX
- rtp
->prio
;
158 *policy
= SCHED_FIFO
;
159 param
->sched_priority
= RTP_PRIO_MAX
- rtp
->prio
;
162 *policy
= SCHED_OTHER
;
163 param
->sched_priority
= 0;
170 _schedparam_to_rtp(int policy
, const struct sched_param
*param
,
175 rtp
->type
= RTP_PRIO_REALTIME
;
176 rtp
->prio
= RTP_PRIO_MAX
- param
->sched_priority
;
179 rtp
->type
= RTP_PRIO_FIFO
;
180 rtp
->prio
= RTP_PRIO_MAX
- param
->sched_priority
;
184 rtp
->type
= RTP_PRIO_NORMAL
;
192 _thr_getscheduler(lwpid_t lwpid
, int *policy
, struct sched_param
*param
)
194 struct pthread
*curthread
= tls_get_curthread();
198 if (lwpid
== curthread
->tid
)
200 ret
= lwp_rtprio(RTP_LOOKUP
, 0, lwpid
, &rtp
);
203 _rtp_to_schedparam(&rtp
, policy
, param
);
208 _thr_setscheduler(lwpid_t lwpid
, int policy
, const struct sched_param
*param
)
210 struct pthread
*curthread
= tls_get_curthread();
213 if (lwpid
== curthread
->tid
)
215 _schedparam_to_rtp(policy
, param
, &rtp
);
216 return (lwp_rtprio(RTP_SET
, 0, lwpid
, &rtp
));