| 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 |
|
|---|