diff options
Diffstat (limited to 'bfd/cache.c')
-rw-r--r-- | bfd/cache.c | 177 |
1 files changed, 105 insertions, 72 deletions
diff --git a/bfd/cache.c b/bfd/cache.c index be85f2b..d0d3f23 100644 --- a/bfd/cache.c +++ b/bfd/cache.c @@ -18,34 +18,38 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/*doc* -@section File Caching -The file caching mechanism is embedded within BFD and allows the application to open as many -BFDs as it wants without regard to the underlying operating system's -file descriptor limit (often as low as 20 open files). - -The module in @code{cache.c} maintains a least recently used list of -@code{BFD_CACHE_MAX_OPEN} files, and exports the name -@code{bfd_cache_lookup} which runs around and makes sure that the -required BFD is open. If not, then it chooses a file to close, closes -it and opens the one wanted, returning its file handle. +/* +SECTION + File Caching + + The file caching mechanism is embedded within BFD and allows + the application to open as many BFDs as it wants without + regard to the underlying operating system's file descriptor + limit (often as low as 20 open files). The module in + <<cache.c>> maintains a least recently used list of + <<BFD_CACHE_MAX_OPEN>> files, and exports the name + <<bfd_cache_lookup>> which runs around and makes sure that + the required BFD is open. If not, then it chooses a file to + close, closes it and opens the one wanted, returning its file + handle. */ - - /* $Id$ */ -#include <sysdep.h> + #include "bfd.h" +#include "sysdep.h" #include "libbfd.h" +/* +INTERNAL_FUNCTION + BFD_CACHE_MAX_OPEN macro -/*proto-internal* BFD_CACHE_MAX_OPEN -The maxiumum number of files which the cache will keep open at one -time. -*+ -#define BFD_CACHE_MAX_OPEN 10 -*- +DESCRIPTION + The maxiumum number of files which the cache will keep open at + one time. + +.#define BFD_CACHE_MAX_OPEN 10 */ @@ -55,32 +59,38 @@ static int open_files; static bfd *cache_sentinel; /* Chain of BFDs with active fds we've opened */ -/*proto-internal* bfd_last_cache -Zero, or a pointer to the topmost BFD on the chain. This is used by -the @code{bfd_cache_lookup} macro in @file{libbfd.h} to determine when -it can avoid a function call. -*+ -extern bfd *bfd_last_cache; -*- +/* +INTERNAL_FUNCTION + bfd_last_cache + +SYNOPSIS + extern bfd *bfd_last_cache; +DESCRIPTION + Zero, or a pointer to the topmost BFD on the chain. This is + used by the <<bfd_cache_lookup>> macro in @file{libbfd.h} to + determine when it can avoid a function call. */ bfd *bfd_last_cache; -/*proto-internal* bfd_cache_lookup -Checks to see if the required BFD is the same as the last one looked -up. If so then it can use the iostream in the BFD with impunity, since -it can't have changed since the last lookup, otherwise it has to -perform the complicated lookup function -*+ -#define bfd_cache_lookup(x) \ - ((x)==bfd_last_cache? \ - (FILE*)(bfd_last_cache->iostream): \ - bfd_cache_lookup_worker(x)) - -*- - -*/ +/* + * INTERNAL_FUNCTION + * bfd_cache_lookup + * + * DESCRIPTION + * Checks to see if the required BFD is the same as the last one + * looked up. If so then it can use the iostream in the BFD with + * impunity, since it can't have changed since the last lookup, + * otherwise it has to perform the complicated lookup function + * + * .#define bfd_cache_lookup(x) \ + * . ((x)==bfd_last_cache? \ + * . (FILE*)(bfd_last_cache->iostream): \ + * . bfd_cache_lookup_worker(x)) + * + * + */ static void bfd_cache_delete(); @@ -144,11 +154,16 @@ DEFUN(insert,(x,y), } -/*proto-internal* -*i bfd_cache_init -Initialize a BFD by putting it on the cache LRU. -*; PROTO(void, bfd_cache_init, (bfd *)); -*-*/ +/* +INTERNAL_FUNCTION + bfd_cache_init + +SYNOPSIS + void bfd_cache_init (bfd *); + +DESCRIPTION + Initialize a BFD by putting it on the cache LRU. +*/ void DEFUN(bfd_cache_init,(abfd), @@ -158,11 +173,17 @@ DEFUN(bfd_cache_init,(abfd), } -/*proto-internal* -*i bfd_cache_close -Remove the BFD from the cache. If the attatched file is open, then close it too. -*; PROTO(void, bfd_cache_close, (bfd *)); -*-*/ +/* +INTERNAL_FUNCTION + bfd_cache_close + +DESCRIPTION + Remove the BFD from the cache. If the attached file is open, + then close it too. + +SYNOPSIS + void bfd_cache_close (bfd *); +*/ void DEFUN(bfd_cache_close,(abfd), bfd *abfd) @@ -174,15 +195,21 @@ DEFUN(bfd_cache_close,(abfd), } } -/*proto-internal* -*i bfd_open_file -Call the OS to open a file for this BFD. Returns the FILE * -(possibly null) that results from this operation. Sets up the -BFD so that future accesses know the file is open. If the FILE * -returned is null, then there is won't have been put in the cache, so -it won't have to be removed from it. -*; PROTO(FILE *, bfd_open_file, (bfd *)); -*-*/ +/* +INTERNAL_FUNCTION + bfd_open_file + +DESCRIPTION + Call the OS to open a file for this BFD. Returns the FILE * + (possibly null) that results from this operation. Sets up the + BFD so that future accesses know the file is open. If the FILE + * returned is null, then there is won't have been put in the + cache, so it won't have to be removed from it. + +SYNOPSIS + FILE* bfd_open_file(bfd *); +*/ + FILE * DEFUN(bfd_open_file, (abfd), bfd *abfd) @@ -194,18 +221,18 @@ DEFUN(bfd_open_file, (abfd), switch (abfd->direction) { case read_direction: case no_direction: - abfd->iostream = (char *) fopen(abfd->filename, "r"); + abfd->iostream = (char *) fopen(abfd->filename, "rb"); break; case both_direction: case write_direction: if (abfd->opened_once == true) { - abfd->iostream = (char *) fopen(abfd->filename, "r+"); + abfd->iostream = (char *) fopen(abfd->filename, "r+b"); if (!abfd->iostream) { - abfd->iostream = (char *) fopen(abfd->filename, "w+"); + abfd->iostream = (char *) fopen(abfd->filename, "w+b"); } } else { /*open for creat */ - abfd->iostream = (char *) fopen(abfd->filename, "w"); + abfd->iostream = (char *) fopen(abfd->filename, "wb"); abfd->opened_once = true; } break; @@ -218,15 +245,21 @@ DEFUN(bfd_open_file, (abfd), return (FILE *)(abfd->iostream); } -/*proto-internal* -*i bfd_cache_lookup_worker -Called when the macro @code{bfd_cache_lookup} fails to find a quick -answer. Finds a file descriptor for this BFD. If necessary, it open it. -If there are already more than BFD_CACHE_MAX_OPEN files open, it trys to close -one first, to avoid running out of file descriptors. -*; PROTO(FILE *, bfd_cache_lookup_worker, (bfd *)); +/* +INTERNAL_FUNCTION + bfd_cache_lookup_worker + +DESCRIPTION + Called when the macro <<bfd_cache_lookup>> fails to find a + quick answer. Finds a file descriptor for this BFD. If + necessary, it open it. If there are already more than + BFD_CACHE_MAX_OPEN files open, it trys to close one first, to + avoid running out of file descriptors. -*-*/ +SYNOPSIS + FILE *bfd_cache_lookup_worker(bfd *); + +*/ FILE * DEFUN(bfd_cache_lookup_worker,(abfd), |