Commit | Line | Data |
---|---|---|
2a00e4fb ILT |
1 | // descriptors.h -- manage file descriptors for gold -*- C++ -*- |
2 | ||
3 | // Copyright 2008 Free Software Foundation, Inc. | |
4 | // Written by Ian Lance Taylor <iant@google.com>. | |
5 | ||
6 | // This file is part of gold. | |
7 | ||
8 | // This program is free software; you can redistribute it and/or modify | |
9 | // it under the terms of the GNU General Public License as published by | |
10 | // the Free Software Foundation; either version 3 of the License, or | |
11 | // (at your option) any later version. | |
12 | ||
13 | // This program is distributed in the hope that it will be useful, | |
14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | // GNU General Public License for more details. | |
17 | ||
18 | // You should have received a copy of the GNU General Public License | |
19 | // along with this program; if not, write to the Free Software | |
20 | // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | |
21 | // MA 02110-1301, USA. | |
22 | ||
23 | #ifndef GOLD_DESCRIPTORS_H | |
24 | #define GOLD_DESCRIPTORS_H | |
25 | ||
26 | #include <vector> | |
27 | ||
28 | namespace gold | |
29 | { | |
30 | ||
31 | class Lock; | |
32 | ||
33 | // This class manages file descriptors for gold. | |
34 | ||
35 | class Descriptors | |
36 | { | |
37 | public: | |
38 | Descriptors(); | |
39 | ||
40 | // Get a file descriptor for a file. The DESCRIPTOR parameter is | |
41 | // the descriptor the last time the file was used; this will be -1 | |
42 | // if this is the first time the file is being opened. The NAME, | |
43 | // FLAGS, and MODE parameters are as for ::open. NAME must be in | |
44 | // permanent storage. This returns the descriptor to use, which may | |
45 | // or may not be the same as DESCRIPTOR. If there is an error | |
46 | // opening the file, this will return -1 with errno set | |
47 | // appropriately. | |
48 | int | |
49 | open(int descriptor, const char* name, int flags, int mode = 0); | |
50 | ||
51 | // Release the file descriptor DESCRIPTOR. If PERMANENT is true, it | |
52 | // will be closed, and the caller may not reopen it. If PERMANENT | |
53 | // is false this doesn't necessarily close the descriptor, but it | |
54 | // makes it available to be closed; the descriptor must not be used | |
55 | // again except as an argument to Descriptor::open. | |
56 | void | |
57 | release(int descriptor, bool permanent); | |
58 | ||
59 | private: | |
60 | // Information kept for a descriptor. | |
61 | struct Open_descriptor | |
62 | { | |
63 | // File name currently associated with descriptor. This is empty | |
64 | // if none. | |
65 | const char* name; | |
66 | // Index of next descriptor on stack of released descriptors. | |
67 | int stack_next; | |
68 | // Whether the descriptor is currently in use. | |
69 | bool inuse; | |
70 | // Whether this is a write descriptor. | |
71 | bool is_write; | |
72 | }; | |
73 | ||
74 | bool | |
75 | close_some_descriptor(); | |
76 | ||
77 | // We need to lock before accessing any fields. | |
78 | Lock* lock_; | |
79 | // Information for descriptors. | |
80 | std::vector<Open_descriptor> open_descriptors_; | |
81 | // Top of stack. | |
82 | int stack_top_; | |
83 | // The current number of file descriptors open. | |
84 | int current_; | |
85 | // The maximum number of file descriptors we open. | |
86 | int limit_; | |
87 | }; | |
88 | ||
89 | // File descriptors are a centralized data structure, and we use a | |
90 | // global variable rather than passing the data structure into every | |
91 | // routine that does file I/O. | |
92 | ||
93 | extern Descriptors descriptors; | |
94 | ||
95 | inline int | |
96 | open_descriptor(int descriptor, const char* name, int flags, int mode = 0) | |
97 | { return descriptors.open(descriptor, name, flags, mode); } | |
98 | ||
99 | inline void | |
100 | release_descriptor(int descriptor, bool permanent) | |
101 | { descriptors.release(descriptor, permanent); } | |
102 | ||
103 | } // End namespace gold. | |
104 | ||
105 | #endif // !defined(GOLD_DESCRIPTORS_H) |