The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kern/kern_threads.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  *
    3  * Portions of this code was derived from the file kern_fork.c and as such
    4  * is subject to the copyrights below.
    5  *
    6  * Copyright (c) 1982, 1986, 1989, 1991, 1993
    7  *      The Regents of the University of California.  All rights reserved.
    8  * (c) UNIX System Laboratories, Inc.
    9  * All or some portions of this file are derived from material licensed
   10  * to the University of California by American Telephone and Telegraph
   11  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
   12  * the permission of UNIX System Laboratories, Inc.
   13  *
   14  * Redistribution and use in source and binary forms, with or without
   15  * modification, are permitted provided that the following conditions
   16  * are met:
   17  * 1. Redistributions of source code must retain the above copyright
   18  *    notice, this list of conditions and the following disclaimer.
   19  * 2. Redistributions in binary form must reproduce the above copyright
   20  *    notice, this list of conditions and the following disclaimer in the
   21  *    documentation and/or other materials provided with the distribution.
   22  * 3. All advertising materials mentioning features or use of this software
   23  *    must display the following acknowledgement:
   24  *      This product includes software developed by the University of
   25  *      California, Berkeley and its contributors.
   26  * 4. Neither the name of the University nor the names of its contributors
   27  *    may be used to endorse or promote products derived from this software
   28  *    without specific prior written permission.
   29  *
   30  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   31  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   32  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   33  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   34  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   35  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   36  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   37  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   38  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   39  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   40  * SUCH DAMAGE.
   41  *
   42  * Copyright (c) 1996 Douglas Santry
   43  *
   44  * This code is subject to the beer copyright.  If I chance to meet you in a
   45  * bar and this code helped you in some way, you owe me a beer.  Only
   46  * in Germany will I accept domestic beer.  This code may or may not work
   47  * and I certainly make no claims as to its fitness for *any* purpose.
   48  * 
   49  * $FreeBSD$
   50  */
   51 
   52 #include <sys/param.h>
   53 #include <sys/systm.h>
   54 #include <sys/kernel.h>
   55 #include <sys/proc.h>
   56 #include <sys/resourcevar.h>
   57 #include <sys/sysproto.h>
   58 
   59 /*
   60  * Low level support for sleep/wakeup paradigm
   61  * If a timeout is specified:
   62  *      returns 0 if wakeup
   63  *      returns EAGAIN if timed out
   64  *      returns EINVAL if error
   65  *
   66  * If a timeout is not specified:
   67  *
   68  *      returns time waiting in ticks.
   69  */
   70 int
   71 thr_sleep(struct proc *p, struct thr_sleep_args *uap) {
   72         int sleepstart;
   73         struct timespec ts;
   74         struct timeval atv;
   75         int error, timo;
   76 
   77         timo = 0;
   78         if (uap->timeout != 0) {
   79                 /*
   80                  * Get timespec struct
   81                  */
   82                 if ((error = copyin(uap->timeout, &ts, sizeof(ts))) != 0) {
   83                         p->p_wakeup = 0;
   84                         return error;
   85                 }
   86                 if (ts.tv_nsec < 0 || ts.tv_nsec >= 1000000000) {
   87                         p->p_wakeup = 0;
   88                         return (EINVAL);
   89                 }
   90                 TIMESPEC_TO_TIMEVAL(&atv, &ts);
   91                 if (itimerfix(&atv)) {
   92                         p->p_wakeup = 0;
   93                         return (EINVAL);
   94                 }
   95                 timo = tvtohz(&atv);
   96         }
   97 
   98         p->p_retval[0] = 0;
   99         if (p->p_wakeup == 0) {
  100                 sleepstart = ticks;
  101                 p->p_flag |= P_SINTR;
  102                 error = tsleep(p, PRIBIO, "thrslp", timo);
  103                 p->p_flag &= ~P_SINTR;
  104                 if (error == EWOULDBLOCK) {
  105                         p->p_wakeup = 0;
  106                         p->p_retval[0] = EAGAIN;
  107                         return 0;
  108                 }
  109                 if (uap->timeout == 0)
  110                         p->p_retval[0] = ticks - sleepstart;
  111         }
  112         p->p_wakeup = 0;
  113         return (0);
  114 }
  115 
  116 int
  117 thr_wakeup(struct proc *p, struct thr_wakeup_args *uap) {
  118         struct proc *pSlave = p->p_leader;
  119 
  120         while(pSlave && (pSlave->p_pid != uap->pid))
  121                 pSlave = pSlave->p_peers;
  122 
  123         if(pSlave == 0) {
  124                 p->p_retval[0] = ESRCH;
  125                 return(0);
  126         }
  127 
  128         pSlave->p_wakeup++;
  129         if((pSlave->p_stat == SSLEEP) && (pSlave->p_wchan == pSlave)) {
  130                 wakeup(pSlave);
  131                 return(0);
  132         }
  133 
  134         p->p_retval[0] = EAGAIN;
  135         return 0;
  136 }
  137 
  138 /*
  139  * General purpose yield system call
  140  */
  141 int
  142 yield(struct proc *p, struct yield_args *uap) {
  143         int s;
  144 
  145         p->p_retval[0] = 0;
  146 
  147         s = splhigh();
  148         p->p_priority = MAXPRI;
  149         setrunqueue(p);
  150         p->p_stats->p_ru.ru_nvcsw++;
  151         mi_switch();
  152         splx(s);
  153 
  154         return(0);
  155 }
  156 

Cache object: fd740deb6016e17e4448c1303a57546b


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.