1 /* BFD library -- caching of file descriptors.
2 Copyright 1990, 91, 92, 93, 94, 95, 1996, 2000
3 Free Software Foundation, Inc.
4 Hacked by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
6 This file is part of BFD, the Binary File Descriptor library.
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 2 of the License, or
11 (at your option) any later version.
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.
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26 The file caching mechanism is embedded within BFD and allows
27 the application to open as many BFDs as it wants without
28 regard to the underlying operating system's file descriptor
29 limit (often as low as 20 open files). The module in
30 <<cache.c>> maintains a least recently used list of
31 <<BFD_CACHE_MAX_OPEN>> files, and exports the name
32 <<bfd_cache_lookup>>, which runs around and makes sure that
33 the required BFD is open. If not, then it chooses a file to
34 close, closes it and opens the one wanted, returning its file
43 static void insert
PARAMS ((bfd
*));
44 static void snip
PARAMS ((bfd
*));
45 static boolean close_one
PARAMS ((void));
46 static boolean bfd_cache_delete
PARAMS ((bfd
*));
50 BFD_CACHE_MAX_OPEN macro
53 The maximum number of files which the cache will keep open at
56 .#define BFD_CACHE_MAX_OPEN 10
60 /* The number of BFD files we have open. */
62 static int open_files
;
69 extern bfd *bfd_last_cache;
72 Zero, or a pointer to the topmost BFD on the chain. This is
73 used by the <<bfd_cache_lookup>> macro in @file{libbfd.h} to
74 determine when it can avoid a function call.
84 Check to see if the required BFD is the same as the last one
85 looked up. If so, then it can use the stream in the BFD with
86 impunity, since it can't have changed since the last lookup;
87 otherwise, it has to perform the complicated lookup function.
89 .#define bfd_cache_lookup(x) \
90 . ((x)==bfd_last_cache? \
91 . (FILE*)(bfd_last_cache->iostream): \
92 . bfd_cache_lookup_worker(x))
97 /* Insert a BFD into the cache. */
103 if (bfd_last_cache
== NULL
)
105 abfd
->lru_next
= abfd
;
106 abfd
->lru_prev
= abfd
;
110 abfd
->lru_next
= bfd_last_cache
;
111 abfd
->lru_prev
= bfd_last_cache
->lru_prev
;
112 abfd
->lru_prev
->lru_next
= abfd
;
113 abfd
->lru_next
->lru_prev
= abfd
;
115 bfd_last_cache
= abfd
;
118 /* Remove a BFD from the cache. */
124 abfd
->lru_prev
->lru_next
= abfd
->lru_next
;
125 abfd
->lru_next
->lru_prev
= abfd
->lru_prev
;
126 if (abfd
== bfd_last_cache
)
128 bfd_last_cache
= abfd
->lru_next
;
129 if (abfd
== bfd_last_cache
)
130 bfd_last_cache
= NULL
;
134 /* We need to open a new file, and the cache is full. Find the least
135 recently used cacheable BFD and close it. */
142 if (bfd_last_cache
== NULL
)
146 for (kill
= bfd_last_cache
->lru_prev
;
148 kill
= kill
->lru_prev
)
150 if (kill
== bfd_last_cache
)
160 /* There are no open cacheable BFD's. */
164 kill
->where
= ftell ((FILE *) kill
->iostream
);
166 return bfd_cache_delete (kill
);
169 /* Close a BFD and remove it from the cache. */
172 bfd_cache_delete (abfd
)
177 if (fclose ((FILE *) abfd
->iostream
) == 0)
182 bfd_set_error (bfd_error_system_call
);
187 abfd
->iostream
= NULL
;
198 boolean bfd_cache_init (bfd *abfd);
201 Add a newly opened BFD to the cache.
205 bfd_cache_init (abfd
)
208 BFD_ASSERT (abfd
->iostream
!= NULL
);
209 if (open_files
>= BFD_CACHE_MAX_OPEN
)
224 boolean bfd_cache_close (bfd *abfd);
227 Remove the BFD @var{abfd} from the cache. If the attached file is open,
231 <<false>> is returned if closing the file fails, <<true>> is
232 returned if all is well.
236 bfd_cache_close (abfd
)
239 if (abfd
->iostream
== NULL
240 || (abfd
->flags
& BFD_IN_MEMORY
) != 0)
243 return bfd_cache_delete (abfd
);
251 FILE* bfd_open_file(bfd *abfd);
254 Call the OS to open a file for @var{abfd}. Return the <<FILE *>>
255 (possibly <<NULL>>) that results from this operation. Set up the
256 BFD so that future accesses know the file is open. If the <<FILE *>>
257 returned is <<NULL>>, then it won't have been put in the
258 cache, so it won't have to be removed from it.
265 abfd
->cacheable
= true; /* Allow it to be closed later. */
267 if (open_files
>= BFD_CACHE_MAX_OPEN
)
273 switch (abfd
->direction
)
277 abfd
->iostream
= (PTR
) fopen (abfd
->filename
, FOPEN_RB
);
280 case write_direction
:
281 if (abfd
->opened_once
== true)
283 abfd
->iostream
= (PTR
) fopen (abfd
->filename
, FOPEN_RUB
);
284 if (abfd
->iostream
== NULL
)
285 abfd
->iostream
= (PTR
) fopen (abfd
->filename
, FOPEN_WUB
);
291 Some operating systems won't let us overwrite a running
292 binary. For them, we want to unlink the file first.
294 However, gcc 2.95 will create temporary files using
295 O_EXCL and tight permissions to prevent other users from
296 substituting other .o files during the compilation. gcc
297 will then tell the assembler to use the newly created
298 file as an output file. If we unlink the file here, we
299 open a brief window when another user could still
302 So we unlink the output file if and only if it has
305 /* Don't do this for MSDOS: it doesn't care about overwriting
306 a running binary, but if this file is already open by
307 another BFD, we will be in deep trouble if we delete an
308 open file. In fact, objdump does just that if invoked with
309 the --info option. */
312 if (stat (abfd
->filename
, &s
) == 0 && s
.st_size
!= 0)
313 unlink (abfd
->filename
);
315 abfd
->iostream
= (PTR
) fopen (abfd
->filename
, FOPEN_WB
);
316 abfd
->opened_once
= true;
321 if (abfd
->iostream
!= NULL
)
323 if (! bfd_cache_init (abfd
))
327 return (FILE *) abfd
->iostream
;
332 bfd_cache_lookup_worker
335 FILE *bfd_cache_lookup_worker(bfd *abfd);
338 Called when the macro <<bfd_cache_lookup>> fails to find a
339 quick answer. Find a file descriptor for @var{abfd}. If
340 necessary, it open it. If there are already more than
341 <<BFD_CACHE_MAX_OPEN>> files open, it tries to close one first, to
342 avoid running out of file descriptors.
346 bfd_cache_lookup_worker (abfd
)
349 if ((abfd
->flags
& BFD_IN_MEMORY
) != 0)
352 if (abfd
->my_archive
)
353 abfd
= abfd
->my_archive
;
355 if (abfd
->iostream
!= NULL
)
357 /* Move the file to the start of the cache. */
358 if (abfd
!= bfd_last_cache
)
366 if (bfd_open_file (abfd
) == NULL
)
368 if (fseek ((FILE *) abfd
->iostream
, abfd
->where
, SEEK_SET
) != 0)
372 return (FILE *) abfd
->iostream
;