Fix race condition causing assert in Eh_frame_hdr::do_sized_write().
[external/binutils.git] / gold / dirsearch.h
1 // dirsearch.h -- directory searching for gold  -*- C++ -*-
2
3 // Copyright (C) 2006-2014 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_DIRSEARCH_H
24 #define GOLD_DIRSEARCH_H
25
26 #include <string>
27 #include <list>
28
29 #include "options.h"
30 #include "token.h"
31
32 namespace gold
33 {
34
35 class General_options;
36 class Workqueue;
37
38 // A simple interface to manage directories to be searched for
39 // libraries.
40
41 class Dirsearch
42 {
43  public:
44   Dirsearch()
45     : directories_(NULL), token_(true)
46   { }
47
48   // Set the list of directories to search.
49   void
50   initialize(Workqueue*, const General_options::Dir_list*);
51
52   // Search for a file, giving one or two names to search for (the
53   // second one may be empty).  Return a full path name for the file,
54   // or the empty string if it could not be found.  This may only be
55   // called if the token is not blocked.  Set *IS_IN_SYSROOT if the
56   // file was found in a directory which is in the sysroot.  *PINDEX
57   // should be set to zero the first time this is called; it will be
58   // updated with the index of the directory where the file is found,
59   // and that value plus one may be used to find the next file with
60   // the same name(s).
61   std::string
62   find(const std::vector<std::string>& names, bool* is_in_sysroot,
63        int* pindex, std::string *found_name) const;
64
65   // Return the blocker token which controls access.
66   Task_token*
67   token()
68   { return &this->token_; }
69
70   // Search for a file in a directory list.  This is a low-level function and
71   // therefore can be used before options and parameters are set.
72   static std::string
73   find_file_in_dir_list(const std::string& name,
74                         const General_options::Dir_list& directories,
75                         const std::string& extra_search_dir);
76
77  private:
78   // We can not copy this class.
79   Dirsearch(const Dirsearch&);
80   Dirsearch& operator=(const Dirsearch&);
81
82   // Directories to search.
83   const General_options::Dir_list* directories_;
84   // Blocker token to control access from tasks.
85   Task_token token_;
86 };
87
88 } // End namespace gold.
89
90 #endif // !defined(GOLD_DIRSEARCH_H)