1 |
1181 |
sfurman |
@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 |
|
|
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 |
|
|
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 |
|
|
|