1 | @section File caching
|
---|
2 | The file caching mechanism is embedded within BFD and allows
|
---|
3 | the application to open as many BFDs as it wants without
|
---|
4 | regard to the underlying operating system's file descriptor
|
---|
5 | limit (often as low as 20 open files). The module in
|
---|
6 | @code{cache.c} maintains a least recently used list of
|
---|
7 | @code{BFD_CACHE_MAX_OPEN} files, and exports the name
|
---|
8 | @code{bfd_cache_lookup}, which runs around and makes sure that
|
---|
9 | the required BFD is open. If not, then it chooses a file to
|
---|
10 | close, closes it and opens the one wanted, returning its file
|
---|
11 | handle.
|
---|
12 |
|
---|
13 | @findex BFD_CACHE_MAX_OPEN macro
|
---|
14 | @subsubsection @code{BFD_CACHE_MAX_OPEN macro}
|
---|
15 | @strong{Description}@*
|
---|
16 | The maximum number of files which the cache will keep open at
|
---|
17 | one time.
|
---|
18 | @example
|
---|
19 | #define BFD_CACHE_MAX_OPEN 10
|
---|
20 | @end example
|
---|
21 |
|
---|
22 | @findex bfd_last_cache
|
---|
23 | @subsubsection @code{bfd_last_cache}
|
---|
24 | @strong{Synopsis}
|
---|
25 | @example
|
---|
26 | extern bfd *bfd_last_cache;
|
---|
27 | @end example
|
---|
28 | @strong{Description}@*
|
---|
29 | Zero, or a pointer to the topmost BFD on the chain. This is
|
---|
30 | used by the @code{bfd_cache_lookup} macro in @file{libbfd.h} to
|
---|
31 | determine when it can avoid a function call.
|
---|
32 |
|
---|
33 | @findex bfd_cache_lookup
|
---|
34 | @subsubsection @code{bfd_cache_lookup}
|
---|
35 | @strong{Description}@*
|
---|
36 | Check to see if the required BFD is the same as the last one
|
---|
37 | looked up. If so, then it can use the stream in the BFD with
|
---|
38 | impunity, since it can't have changed since the last lookup;
|
---|
39 | otherwise, it has to perform the complicated lookup function.
|
---|
40 | @example
|
---|
41 | #define bfd_cache_lookup(x) \
|
---|
42 | ((x)==bfd_last_cache? \
|
---|
43 | (FILE*) (bfd_last_cache->iostream): \
|
---|
44 | bfd_cache_lookup_worker(x))
|
---|
45 | @end example
|
---|
46 |
|
---|
47 | @findex bfd_cache_init
|
---|
48 | @subsubsection @code{bfd_cache_init}
|
---|
49 | @strong{Synopsis}
|
---|
50 | @example
|
---|
51 | bfd_boolean bfd_cache_init (bfd *abfd);
|
---|
52 | @end example
|
---|
53 | @strong{Description}@*
|
---|
54 | Add a newly opened BFD to the cache.
|
---|
55 |
|
---|
56 | @findex bfd_cache_close
|
---|
57 | @subsubsection @code{bfd_cache_close}
|
---|
58 | @strong{Synopsis}
|
---|
59 | @example
|
---|
60 | bfd_boolean bfd_cache_close (bfd *abfd);
|
---|
61 | @end example
|
---|
62 | @strong{Description}@*
|
---|
63 | Remove the BFD @var{abfd} from the cache. If the attached file is open,
|
---|
64 | then close it too.
|
---|
65 |
|
---|
66 | @strong{Returns}@*
|
---|
67 | @code{FALSE} is returned if closing the file fails, @code{TRUE} is
|
---|
68 | returned if all is well.
|
---|
69 |
|
---|
70 | @findex bfd_open_file
|
---|
71 | @subsubsection @code{bfd_open_file}
|
---|
72 | @strong{Synopsis}
|
---|
73 | @example
|
---|
74 | FILE* bfd_open_file(bfd *abfd);
|
---|
75 | @end example
|
---|
76 | @strong{Description}@*
|
---|
77 | Call the OS to open a file for @var{abfd}. Return the @code{FILE *}
|
---|
78 | (possibly @code{NULL}) that results from this operation. Set up the
|
---|
79 | BFD so that future accesses know the file is open. If the @code{FILE *}
|
---|
80 | returned is @code{NULL}, then it won't have been put in the
|
---|
81 | cache, so it won't have to be removed from it.
|
---|
82 |
|
---|
83 | @findex bfd_cache_lookup_worker
|
---|
84 | @subsubsection @code{bfd_cache_lookup_worker}
|
---|
85 | @strong{Synopsis}
|
---|
86 | @example
|
---|
87 | FILE *bfd_cache_lookup_worker(bfd *abfd);
|
---|
88 | @end example
|
---|
89 | @strong{Description}@*
|
---|
90 | Called when the macro @code{bfd_cache_lookup} fails to find a
|
---|
91 | quick answer. Find a file descriptor for @var{abfd}. If
|
---|
92 | necessary, it open it. If there are already more than
|
---|
93 | @code{BFD_CACHE_MAX_OPEN} files open, it tries to close one first, to
|
---|
94 | avoid running out of file descriptors.
|
---|
95 |
|
---|