Commit | Line | Data |
---|---|---|
2a00e4fb ILT |
1 | // descriptors.h -- manage file descriptors for gold -*- C++ -*- |
2 | ||
6f2750fe | 3 | // Copyright (C) 2008-2016 Free Software Foundation, Inc. |
2a00e4fb ILT |
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 | ||
7f055c20 ILT |
28 | #include "gold-threads.h" |
29 | ||
2a00e4fb ILT |
30 | namespace gold |
31 | { | |
32 | ||
2a00e4fb ILT |
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 | ||
20e2a8aa ILT |
59 | // Close all the descriptors open for reading. |
60 | void | |
61 | close_all(); | |
62 | ||
2a00e4fb ILT |
63 | private: |
64 | // Information kept for a descriptor. | |
65 | struct Open_descriptor | |
66 | { | |
67 | // File name currently associated with descriptor. This is empty | |
68 | // if none. | |
69 | const char* name; | |
70 | // Index of next descriptor on stack of released descriptors. | |
71 | int stack_next; | |
72 | // Whether the descriptor is currently in use. | |
73 | bool inuse; | |
74 | // Whether this is a write descriptor. | |
75 | bool is_write; | |
61edd21f ILT |
76 | // Whether the descriptor is on the stack. |
77 | bool is_on_stack; | |
2a00e4fb ILT |
78 | }; |
79 | ||
80 | bool | |
81 | close_some_descriptor(); | |
82 | ||
83 | // We need to lock before accessing any fields. | |
84 | Lock* lock_; | |
7f055c20 ILT |
85 | // Used to initialize the lock_ field exactly once. |
86 | Initialize_lock initialize_lock_; | |
2a00e4fb ILT |
87 | // Information for descriptors. |
88 | std::vector<Open_descriptor> open_descriptors_; | |
89 | // Top of stack. | |
90 | int stack_top_; | |
91 | // The current number of file descriptors open. | |
92 | int current_; | |
93 | // The maximum number of file descriptors we open. | |
94 | int limit_; | |
95 | }; | |
96 | ||
97 | // File descriptors are a centralized data structure, and we use a | |
98 | // global variable rather than passing the data structure into every | |
99 | // routine that does file I/O. | |
100 | ||
101 | extern Descriptors descriptors; | |
102 | ||
103 | inline int | |
104 | open_descriptor(int descriptor, const char* name, int flags, int mode = 0) | |
105 | { return descriptors.open(descriptor, name, flags, mode); } | |
106 | ||
107 | inline void | |
108 | release_descriptor(int descriptor, bool permanent) | |
109 | { descriptors.release(descriptor, permanent); } | |
110 | ||
20e2a8aa ILT |
111 | inline void |
112 | close_all_descriptors() | |
113 | { descriptors.close_all(); } | |
114 | ||
2a00e4fb ILT |
115 | } // End namespace gold. |
116 | ||
117 | #endif // !defined(GOLD_DESCRIPTORS_H) |