Allows application-specific event handling (XCC)
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.11.1-ros / sysdeps / ros / fork.c
1 /* Copyright (C) 1991, 1995, 1996, 1997, 2002 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <errno.h>
20 #include <unistd.h>
21 #include <stdlib.h>
22 #include <bits/libc-lock.h>
23 #include <ros/syscall.h>
24
25 __libc_lock_define(,__fork_lock);
26 int* child_list = NULL;
27 int  child_list_capacity = 0;
28 int  child_list_size = 0;
29
30 /* Clone the calling process, creating an exact copy.
31    Return -1 for errors, 0 to the new process,
32    and the process ID of the new process to the old process.  */
33 int
34 __fork ()
35 {
36   int ret = -1;
37   __libc_lock_lock(__fork_lock);
38
39   if(child_list_size == child_list_capacity)
40   {
41     int newcap = child_list_capacity ? 2*child_list_capacity : 1;
42     int* tmp = realloc(child_list,newcap*sizeof(int));
43     if(!tmp)
44       goto out;
45     child_list_capacity = newcap;
46     child_list = tmp;
47   }
48
49   ret = ros_syscall(SYS_fork, 0, 0, 0, 0, 0, 0);
50   if(ret > 0)
51     child_list[child_list_size++] = ret;
52
53 out:
54   __libc_lock_unlock(__fork_lock);
55   return ret;
56 }
57 libc_hidden_def (__fork)
58 weak_alias (__fork, fork)