Initial revision
[kopensolaris-gnu/glibc.git] / hurd / dtable.c
1 /* Copyright (C) 1991 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 Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 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 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 #include <hurd.h>
20 #include <gnu-stabs.h>
21 #include <stdlib.h>
22 #include <limits.h>
23
24 struct _hurd_dtable _hurd_dtable;
25 text_set_element (_hurd_dtable_set, _hurd_dtable);
26
27 static void
28 init_dtable (void)
29 {
30   register size_t i;
31
32   __mutex_init (&_hurd_dtable.lock);
33
34   /* The initial size of the descriptor table is that of the passed-in
35      table, rounded up to a multiple of OPEN_MAX descriptors.  */
36   _hurd_dtable.size
37     = (_hurd_init_dtablesize + OPEN_MAX - 1) / OPEN_MAX * OPEN_MAX;
38
39   _hurd_dtable.d = malloc (_hurd_init_dtablesize * sizeof (*_hurd_dtable.d));
40   if (_hurd_dtable.d == NULL)
41     __libc_fatal ("hurd: Can't allocate descriptor table\n");
42
43   for (i = 0; i < _hurd_init_dtablesize; ++i)
44     {
45       _hurd_dtable.d[i] = _hurd_init_dtable[i];
46       __spin_lock_init (&_hurd_dtable.d[i].reflock);
47       _hurd_dtable.d[i].refs = 0;
48       __condition_init (&_hurd_dtable.d[i].free);
49     }
50   for (; i < _hurd_dtable.size; ++i)
51     {
52       _hurd_dtable.d[i].server = MACH_PORT_NULL;
53       __spin_lock_init (&_hurd_dtable.d[i].reflock);
54       _hurd_dtable.d[i].refs = 0;
55       __condition_init (&_hurd_dtable.d[i].free);
56     }
57
58   _hurd_init_dtable = NULL;
59   _hurd_init_dtablesize = 0;
60 }
61
62 text_set_element (__libc_subinit, init_dtable);
63 \f
64 /* Called on fork to install the dtable in NEWTASK.  */
65
66 static error_t
67 fork_dtable (task_t newtask)
68 {
69   int i;
70   __mutex_lock (&_hurd_dtable.lock);
71   for (i = 0; i < _hurd_dtable.size; ++i)
72     if (err = __mach_port_insert_right (newtask, _hurd_dtable.d[i].server,
73                                         _hurd_dtable.d[i].server,
74                                         MACH_PORT_COPY_SEND))
75       {
76         /* XXX for each fd with a cntlmap, reauth and re-map_cntl.  */
77         __mutex_unlock (&_hurd_dtable.lock);
78         return 1;
79       }
80   __mutex_unlock (&_hurd_dtable.lock);
81   return 0;
82 }
83
84 text_set_element (_hurd_fork_hook, fork_dtable);