Prex Home / Browse Source - Prex Version: 0.9.0

root/usr/lib/posix/process/waitpid.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. waitpid

   1 /*
   2  * Copyright (c) 2005, Kohsuke Ohtani
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  * 1. Redistributions of source code must retain the above copyright
   9  *    notice, this list of conditions and the following disclaimer.
  10  * 2. Redistributions in binary form must reproduce the above copyright
  11  *    notice, this list of conditions and the following disclaimer in the
  12  *    documentation and/or other materials provided with the distribution.
  13  * 3. Neither the name of the author nor the names of any co-contributors
  14  *    may be used to endorse or promote products derived from this software
  15  *    without specific prior written permission.
  16  *
  17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27  * SUCH DAMAGE.
  28  */
  29 
  30 #include <sys/prex.h>
  31 #include <sys/posix.h>
  32 #include <ipc/proc.h>
  33 #include <ipc/ipc.h>
  34 #include <sys/wait.h>
  35 
  36 #include <stddef.h>
  37 #include <errno.h>
  38 
  39 /*
  40  * If the target child task calls exit() just after we
  41  * send PS_WAITPID message, a process server will send an
  42  * exception to us. But, we can not catch the exception
  43  * before calling exception_wait().
  44  */
  45 pid_t
  46 waitpid(pid_t pid, int *status, int options)
  47 {
  48         struct msg m;
  49         pid_t child;
  50         int sig, error;
  51         thread_t self;
  52         int pri;
  53 
  54         /* Boost current priority */
  55         self = thread_self();
  56         thread_getpri(self, &pri);
  57         thread_setpri(self, pri - 1);
  58         for (;;) {
  59                 m.hdr.code = PS_WAITPID;
  60                 m.data[0] = pid;
  61                 m.data[1] = options;
  62                 error = msg_send(__proc_obj, &m, sizeof(m));
  63                 if (error == EINTR)
  64                         continue;
  65 
  66                 if (m.hdr.status) {
  67                         errno = m.hdr.status;
  68                         return -1;
  69                 }
  70                 child = m.data[0];
  71                 if (child != 0 || options & WNOHANG)
  72                         break;
  73 
  74                 error = exception_wait(&sig);
  75                 if (error == EINTR) {
  76                         errno = EINTR;
  77                         break;
  78                 }
  79         }
  80         /* Restore priority */
  81         thread_setpri(self, pri);
  82         if (status != NULL)
  83                 *status = m.data[1];
  84         return child;
  85 }

/* [<][>][^][v][top][bottom][index][help] */