PageRenderTime 35ms CodeModel.GetById 24ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/contrib/cvs/lib/waitpid.c

https://bitbucket.org/freebsd/freebsd-head/
C | 80 lines | 69 code | 10 blank | 1 comment | 18 complexity | 21992f9d37417e8d3541185c63f09f0d MD5 | raw file
 1#ifdef HAVE_CONFIG_H
 2#include "config.h"
 3#endif
 4
 5#include "system.h"
 6#include "wait.h"
 7
 8#include <stdio.h>
 9
10struct unreaped {
11  pid_t pid;
12  int status;
13};
14static struct unreaped *unreaped;
15static int n;
16
17static struct unreaped *ualloc (oldptr, n)
18     struct unreaped *oldptr;
19     int n;
20{
21  n *= sizeof (struct unreaped);
22  if (n == 0)
23    n = 1;
24  if (oldptr)
25    oldptr = (struct unreaped *) realloc ((char *) oldptr, n);
26  else
27    oldptr = (struct unreaped *) malloc (n);
28  if (oldptr == 0)
29    {
30      fprintf (stderr, "cannot allocate %d bytes\n", n);
31      exit (1);
32    }
33  return oldptr;
34}
35
36pid_t waitpid (pid, status, options)
37     pid_t pid;
38     int *status;
39     int options;
40{
41  int i;
42
43  /* initialize */
44  if (unreaped == 0)
45    {
46      unreaped = ualloc (unreaped, 1);
47      unreaped[0].pid = 0;
48      n = 1;
49    }
50
51  for (i = 0; unreaped[i].pid; i++)
52    if (unreaped[i].pid == pid)
53      {
54	*status = unreaped[i].status;
55	while (unreaped[i].pid)
56	  {
57	    unreaped[i] = unreaped[i+1];
58	    i++;
59	  }
60	n--;
61	return pid;
62      }
63
64  while (1)
65    {
66#ifdef HAVE_WAIT3
67      pid_t p = wait3 (status, options, (struct rusage *) 0);
68#else
69      pid_t p = wait (status);
70#endif
71
72      if (p == 0 || p == -1 || p == pid)
73	return p;
74
75      n++;
76      unreaped = ualloc (unreaped, n);
77      unreaped[n-1].pid = p;
78      unreaped[n-1].status = *status;
79    }
80}