mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-04 23:50:27 +00:00
Add a timeout parameter to kse_release.
This commit is contained in:
parent
344c6212b8
commit
eb117d5cb0
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=111169
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* $FreeBSD$
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.140 2003/01/04 11:41:12 davidxu Exp
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.143 2003/01/26 20:09:34 alfred Exp
|
||||
*/
|
||||
|
||||
#include "opt_compat.h"
|
||||
|
@ -411,7 +411,7 @@ struct sysent sysent[] = {
|
|||
{ SYF_MPSAFE | AS(kse_wakeup_args), (sy_call_t *)kse_wakeup }, /* 380 = kse_wakeup */
|
||||
{ AS(kse_create_args), (sy_call_t *)kse_create }, /* 381 = kse_create */
|
||||
{ SYF_MPSAFE | AS(kse_thr_interrupt_args), (sy_call_t *)kse_thr_interrupt }, /* 382 = kse_thr_interrupt */
|
||||
{ SYF_MPSAFE | 0, (sy_call_t *)kse_release }, /* 383 = kse_release */
|
||||
{ SYF_MPSAFE | AS(kse_release_args), (sy_call_t *)kse_release }, /* 383 = kse_release */
|
||||
{ SYF_MPSAFE | AS(__mac_get_proc_args), (sy_call_t *)__mac_get_proc }, /* 384 = __mac_get_proc */
|
||||
{ SYF_MPSAFE | AS(__mac_set_proc_args), (sy_call_t *)__mac_set_proc }, /* 385 = __mac_set_proc */
|
||||
{ SYF_MPSAFE | AS(__mac_get_fd_args), (sy_call_t *)__mac_get_fd }, /* 386 = __mac_get_fd */
|
||||
|
|
|
@ -465,7 +465,7 @@ kse_exit(struct thread *td, struct kse_exit_args *uap)
|
|||
*/
|
||||
/*
|
||||
struct kse_release_args {
|
||||
register_t dummy;
|
||||
struct timespec *timeout;
|
||||
};
|
||||
*/
|
||||
int
|
||||
|
@ -473,6 +473,9 @@ kse_release(struct thread *td, struct kse_release_args *uap)
|
|||
{
|
||||
struct proc *p;
|
||||
struct ksegrp *kg;
|
||||
struct timespec ts, ts2, ts3, timeout;
|
||||
struct timeval tv;
|
||||
int error;
|
||||
|
||||
p = td->td_proc;
|
||||
kg = td->td_ksegrp;
|
||||
|
@ -483,25 +486,38 @@ kse_release(struct thread *td, struct kse_release_args *uap)
|
|||
if ((td->td_mailbox != NULL) || (td->td_ksegrp->kg_numupcalls == 0))
|
||||
return (EINVAL);
|
||||
KASSERT((td->td_upcall != NULL), ("%s: not own an upcall", __func__));
|
||||
|
||||
PROC_LOCK(p);
|
||||
if (uap->timeout != NULL) {
|
||||
if ((error = copyin(uap->timeout, &timeout, sizeof(timeout))))
|
||||
return (error);
|
||||
getnanouptime(&ts);
|
||||
timespecadd(&ts, &timeout);
|
||||
TIMESPEC_TO_TIMEVAL(&tv, &timeout);
|
||||
}
|
||||
mtx_lock_spin(&sched_lock);
|
||||
/* Change OURSELF to become an upcall. */
|
||||
td->td_flags = TDF_UPCALLING;
|
||||
if (p->p_sflag & PS_NEEDSIGCHK)
|
||||
td->td_flags |= TDF_ASTPENDING;
|
||||
if ((td->td_upcall->ku_flags & KUF_DOUPCALL) == 0 &&
|
||||
(kg->kg_completed == NULL)) {
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
PROC_LOCK(p);
|
||||
while ((td->td_upcall->ku_flags & KUF_DOUPCALL) == 0 &&
|
||||
(kg->kg_completed == NULL)) {
|
||||
kg->kg_upsleeps++;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
msleep(&kg->kg_completed, &p->p_mtx, PPAUSE|PCATCH, "ksepause",
|
||||
NULL);
|
||||
error = msleep(&kg->kg_completed, &p->p_mtx, PPAUSE|PCATCH,
|
||||
"kse_rel", (uap->timeout ? tvtohz(&tv) : 0));
|
||||
kg->kg_upsleeps--;
|
||||
PROC_UNLOCK(p);
|
||||
} else {
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
PROC_UNLOCK(p);
|
||||
if (uap->timeout == NULL || error != EWOULDBLOCK)
|
||||
return (0);
|
||||
getnanouptime(&ts2);
|
||||
if (timespeccmp(&ts2, &ts, >=))
|
||||
return (0);
|
||||
ts3 = ts;
|
||||
timespecsub(&ts3, &ts2);
|
||||
TIMESPEC_TO_TIMEVAL(&tv, &ts3);
|
||||
PROC_LOCK(p);
|
||||
}
|
||||
PROC_UNLOCK(p);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
|
@ -465,7 +465,7 @@ kse_exit(struct thread *td, struct kse_exit_args *uap)
|
|||
*/
|
||||
/*
|
||||
struct kse_release_args {
|
||||
register_t dummy;
|
||||
struct timespec *timeout;
|
||||
};
|
||||
*/
|
||||
int
|
||||
|
@ -473,6 +473,9 @@ kse_release(struct thread *td, struct kse_release_args *uap)
|
|||
{
|
||||
struct proc *p;
|
||||
struct ksegrp *kg;
|
||||
struct timespec ts, ts2, ts3, timeout;
|
||||
struct timeval tv;
|
||||
int error;
|
||||
|
||||
p = td->td_proc;
|
||||
kg = td->td_ksegrp;
|
||||
|
@ -483,25 +486,38 @@ kse_release(struct thread *td, struct kse_release_args *uap)
|
|||
if ((td->td_mailbox != NULL) || (td->td_ksegrp->kg_numupcalls == 0))
|
||||
return (EINVAL);
|
||||
KASSERT((td->td_upcall != NULL), ("%s: not own an upcall", __func__));
|
||||
|
||||
PROC_LOCK(p);
|
||||
if (uap->timeout != NULL) {
|
||||
if ((error = copyin(uap->timeout, &timeout, sizeof(timeout))))
|
||||
return (error);
|
||||
getnanouptime(&ts);
|
||||
timespecadd(&ts, &timeout);
|
||||
TIMESPEC_TO_TIMEVAL(&tv, &timeout);
|
||||
}
|
||||
mtx_lock_spin(&sched_lock);
|
||||
/* Change OURSELF to become an upcall. */
|
||||
td->td_flags = TDF_UPCALLING;
|
||||
if (p->p_sflag & PS_NEEDSIGCHK)
|
||||
td->td_flags |= TDF_ASTPENDING;
|
||||
if ((td->td_upcall->ku_flags & KUF_DOUPCALL) == 0 &&
|
||||
(kg->kg_completed == NULL)) {
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
PROC_LOCK(p);
|
||||
while ((td->td_upcall->ku_flags & KUF_DOUPCALL) == 0 &&
|
||||
(kg->kg_completed == NULL)) {
|
||||
kg->kg_upsleeps++;
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
msleep(&kg->kg_completed, &p->p_mtx, PPAUSE|PCATCH, "ksepause",
|
||||
NULL);
|
||||
error = msleep(&kg->kg_completed, &p->p_mtx, PPAUSE|PCATCH,
|
||||
"kse_rel", (uap->timeout ? tvtohz(&tv) : 0));
|
||||
kg->kg_upsleeps--;
|
||||
PROC_UNLOCK(p);
|
||||
} else {
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
PROC_UNLOCK(p);
|
||||
if (uap->timeout == NULL || error != EWOULDBLOCK)
|
||||
return (0);
|
||||
getnanouptime(&ts2);
|
||||
if (timespeccmp(&ts2, &ts, >=))
|
||||
return (0);
|
||||
ts3 = ts;
|
||||
timespecsub(&ts3, &ts2);
|
||||
TIMESPEC_TO_TIMEVAL(&tv, &ts3);
|
||||
PROC_LOCK(p);
|
||||
}
|
||||
PROC_UNLOCK(p);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* $FreeBSD$
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.140 2003/01/04 11:41:12 davidxu Exp
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.143 2003/01/26 20:09:34 alfred Exp
|
||||
*/
|
||||
|
||||
const char *syscallnames[] = {
|
||||
|
|
|
@ -555,7 +555,7 @@
|
|||
381 STD BSD { int kse_create(struct kse_mailbox *mbx, \
|
||||
int newgroup); }
|
||||
382 MSTD BSD { int kse_thr_interrupt(struct kse_thr_mailbox *tmbx); }
|
||||
383 MSTD BSD { int kse_release(void); }
|
||||
383 MSTD BSD { int kse_release(struct timespec *timeout); }
|
||||
384 MSTD BSD { int __mac_get_proc(struct mac *mac_p); }
|
||||
385 MSTD BSD { int __mac_set_proc(struct mac *mac_p); }
|
||||
386 MSTD BSD { int __mac_get_fd(int fd, struct mac *mac_p); }
|
||||
|
|
|
@ -86,7 +86,7 @@ struct kse_mailbox {
|
|||
#ifndef _KERNEL
|
||||
int kse_create(struct kse_mailbox *, int);
|
||||
int kse_exit(void);
|
||||
int kse_release(void);
|
||||
int kse_release(struct timespec *);
|
||||
int kse_thr_interrupt(struct kse_thr_mailbox *);
|
||||
int kse_wakeup(struct kse_mailbox *);
|
||||
#endif /* !_KERNEL */
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* $FreeBSD$
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.140 2003/01/04 11:41:12 davidxu Exp
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.143 2003/01/26 20:09:34 alfred Exp
|
||||
*/
|
||||
|
||||
#define SYS_syscall 0
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# FreeBSD system call names.
|
||||
# DO NOT EDIT-- this file is automatically generated.
|
||||
# $FreeBSD$
|
||||
# created from FreeBSD: src/sys/kern/syscalls.master,v 1.140 2003/01/04 11:41:12 davidxu Exp
|
||||
# created from FreeBSD: src/sys/kern/syscalls.master,v 1.143 2003/01/26 20:09:34 alfred Exp
|
||||
MIASM = \
|
||||
syscall.o \
|
||||
exit.o \
|
||||
|
|
|
@ -1061,7 +1061,7 @@ struct kse_thr_interrupt_args {
|
|||
char tmbx_l_[PADL_(struct kse_thr_mailbox *)]; struct kse_thr_mailbox * tmbx; char tmbx_r_[PADR_(struct kse_thr_mailbox *)];
|
||||
};
|
||||
struct kse_release_args {
|
||||
register_t dummy;
|
||||
char timeout_l_[PADL_(struct timespec *)]; struct timespec * timeout; char timeout_r_[PADR_(struct timespec *)];
|
||||
};
|
||||
struct __mac_get_proc_args {
|
||||
char mac_p_l_[PADL_(struct mac *)]; struct mac * mac_p; char mac_p_r_[PADR_(struct mac *)];
|
||||
|
|
Loading…
Reference in a new issue