diff options
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_fork.c | 2 | ||||
-rw-r--r-- | sys/kern/kern_synch.c | 25 | ||||
-rw-r--r-- | sys/kern/kern_threads.c | 162 | ||||
-rw-r--r-- | sys/kern/syscalls.master | 4 | ||||
-rw-r--r-- | sys/kern/vfs_aio.c | 2 |
5 files changed, 28 insertions, 167 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index e9cf587..6caa1d2 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -276,8 +276,6 @@ fork1(p1, flags, procp) newproc->p_leader = newproc; } - newproc->p_wakeup = 0; - newproc->p_vmspace = NULL; /* diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c index a14abb2..7c9b50b 100644 --- a/sys/kern/kern_synch.c +++ b/sys/kern/kern_synch.c @@ -52,6 +52,7 @@ #include <sys/resourcevar.h> #include <sys/vmmeter.h> #include <sys/sysctl.h> +#include <sys/sysproto.h> #include <vm/vm.h> #include <vm/vm_extern.h> #ifdef KTRACE @@ -1076,3 +1077,27 @@ schedclock(p) p->p_priority = p->p_usrpri; } } + +/* + * General purpose yield system call + */ +int +yield(struct proc *p, struct yield_args *uap) +{ + int s; + + p->p_retval[0] = 0; + + s = splhigh(); + mtx_enter(&sched_lock, MTX_SPIN); + DROP_GIANT_NOSWITCH(); + p->p_priority = MAXPRI; + setrunqueue(p); + p->p_stats->p_ru.ru_nvcsw++; + mi_switch(); + mtx_exit(&sched_lock, MTX_SPIN); + PICKUP_GIANT(); + splx(s); + + return (0); +} diff --git a/sys/kern/kern_threads.c b/sys/kern/kern_threads.c deleted file mode 100644 index 3e06abc..0000000 --- a/sys/kern/kern_threads.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * - * Portions of this code was derived from the file kern_fork.c and as such - * is subject to the copyrights below. - * - * Copyright (c) 1982, 1986, 1989, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Copyright (c) 1996 Douglas Santry - * - * This code is subject to the beer copyright. If I chance to meet you in a - * bar and this code helped you in some way, you owe me a beer. Only - * in Germany will I accept domestic beer. This code may or may not work - * and I certainly make no claims as to its fitness for *any* purpose. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/ktr.h> -#include <sys/mutex.h> -#include <sys/proc.h> -#include <sys/resourcevar.h> -#include <sys/sysproto.h> - -/* - * Low level support for sleep/wakeup paradigm - * If a timeout is specified: - * returns 0 if wakeup - * returns EAGAIN if timed out - * returns EINVAL if error - * - * If a timeout is not specified: - * - * returns time waiting in ticks. - */ -int -thr_sleep(struct proc *p, struct thr_sleep_args *uap) { - int sleepstart; - struct timespec ts; - struct timeval atv; - int error, timo; - - timo = 0; - if (uap->timeout != 0) { - /* - * Get timespec struct - */ - if ((error = copyin(uap->timeout, &ts, sizeof(ts))) != 0) { - p->p_wakeup = 0; - return error; - } - if (ts.tv_nsec < 0 || ts.tv_nsec >= 1000000000) { - p->p_wakeup = 0; - return (EINVAL); - } - TIMESPEC_TO_TIMEVAL(&atv, &ts); - if (itimerfix(&atv)) { - p->p_wakeup = 0; - return (EINVAL); - } - timo = tvtohz(&atv); - } - - p->p_retval[0] = 0; - if (p->p_wakeup == 0) { - sleepstart = ticks; - p->p_flag |= P_SINTR; - error = tsleep(p, PRIBIO, "thrslp", timo); - p->p_flag &= ~P_SINTR; - if (error == EWOULDBLOCK) { - p->p_wakeup = 0; - p->p_retval[0] = EAGAIN; - return 0; - } - if (uap->timeout == 0) - p->p_retval[0] = ticks - sleepstart; - } - p->p_wakeup = 0; - return (0); -} - -int -thr_wakeup(struct proc *p, struct thr_wakeup_args *uap) { - struct proc *pSlave = p->p_leader; - - while(pSlave && (pSlave->p_pid != uap->pid)) - pSlave = pSlave->p_peers; - - if(pSlave == 0) { - p->p_retval[0] = ESRCH; - return(0); - } - - pSlave->p_wakeup++; - if((pSlave->p_stat == SSLEEP) && (pSlave->p_wchan == pSlave)) { - wakeup(pSlave); - return(0); - } - - p->p_retval[0] = EAGAIN; - return 0; -} - -/* - * General purpose yield system call - */ -int -yield(struct proc *p, struct yield_args *uap) { - int s; - - p->p_retval[0] = 0; - - s = splhigh(); - mtx_enter(&sched_lock, MTX_SPIN); - DROP_GIANT_NOSWITCH(); - p->p_priority = MAXPRI; - setrunqueue(p); - p->p_stats->p_ru.ru_nvcsw++; - mi_switch(); - mtx_exit(&sched_lock, MTX_SPIN); - PICKUP_GIANT(); - splx(s); - - return(0); -} - diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 9a33b8a..2c54df2 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -461,8 +461,8 @@ 319 STD BSD { int aio_write(struct aiocb *aiocbp); } 320 STD BSD { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } 321 STD BSD { int yield(void); } -322 STD BSD { int thr_sleep(const struct timespec *timeout); } -323 STD BSD { int thr_wakeup(pid_t pid); } +322 OBSOL NOHIDE thr_sleep +323 OBSOL NOHIDE thr_wakeup 324 STD BSD { int mlockall(int how); } 325 STD BSD { int munlockall(void); } 326 STD BSD { int __getcwd(u_char *buf, u_int buflen); } diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 8758ebd..65f4fbf 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -691,7 +691,7 @@ aio_daemon(void *uproc) enterpgrp(mycp, mycp->p_pid, 1); /* Mark special process type. */ - mycp->p_flag |= P_SYSTEM | P_KTHREADP; + mycp->p_flag |= P_SYSTEM; /* * Wakeup parent process. (Parent sleeps to keep from blasting away |