diff options
author | Yao Qi <yao@codesourcery.com> | 2013-10-31 22:18:10 +0800 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2013-11-20 12:41:26 +0800 |
commit | b26dfc9ab352692e0bb8b005b9ca58eb1bc8c026 (patch) | |
tree | c8efc49902d6c2df9e87424ef7eb4dd8d9567b6b /gdb/target-dcache.c | |
parent | 3a8356ffac809056cb3650c50a00f4adb30cc147 (diff) | |
download | gdb-b26dfc9ab352692e0bb8b005b9ca58eb1bc8c026.zip gdb-b26dfc9ab352692e0bb8b005b9ca58eb1bc8c026.tar.gz gdb-b26dfc9ab352692e0bb8b005b9ca58eb1bc8c026.tar.bz2 |
Associate target_dcache to address_space.
Hi,
Nowadays, 'target_dcache' is a global variable in GDB, which is not
necessary. It can be a per-address-space variable. In this patch, we
associate target_dcache to address_space.
gdb/doc:
2013-11-20 Yao Qi <yao@codesourcery.com>
* gdb.texinfo (Caching Target Data): Update doc for
per-address-space dcache.
gdb:
2013-11-20 Yao Qi <yao@codesourcery.com>
* progspace.h (struct address_space_data): Declare.
* target-dcache.c: Include "progspace.h".
(target_dache): Remove.
(target_dcache_aspace_key): New.
(target_dcache_cleanup): New function.
(target_dcache_init_p): Get data through
target_dcache_aspace_key.
(target_dcache_invalidate): Likewise.
(target_dcache_get): Likewise.
(target_dcache_get_or_init): Likewise.
(_initialize_target_dcache): Initialize
target_dcache_aspace_key.
Diffstat (limited to 'gdb/target-dcache.c')
-rw-r--r-- | gdb/target-dcache.c | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/gdb/target-dcache.c b/gdb/target-dcache.c index bf04679..eb7d478 100644 --- a/gdb/target-dcache.c +++ b/gdb/target-dcache.c @@ -18,16 +18,31 @@ #include "defs.h" #include "target-dcache.h" #include "gdbcmd.h" +#include "progspace.h" -/* Cache of memory operations, to speed up remote access. */ -static DCACHE *target_dcache; +/* The target dcache is kept per-address-space. This key lets us + associate the cache with the address space. */ + +static const struct address_space_data *target_dcache_aspace_key; + +/* Clean up dcache, represented by ARG, which is associated with + ASPACE. */ + +static void +target_dcache_cleanup (struct address_space *aspace, void *arg) +{ + dcache_free (arg); +} /* Target dcache is initialized or not. */ int target_dcache_init_p (void) { - return (target_dcache != NULL); + DCACHE *dcache = address_space_data (current_program_space->aspace, + target_dcache_aspace_key); + + return (dcache != NULL); } /* Invalidate the target dcache. */ @@ -35,8 +50,11 @@ target_dcache_init_p (void) void target_dcache_invalidate (void) { - if (target_dcache_init_p ()) - dcache_invalidate (target_dcache); + DCACHE *dcache = address_space_data (current_program_space->aspace, + target_dcache_aspace_key); + + if (dcache != NULL) + dcache_invalidate (dcache); } /* Return the target dcache. Return NULL if target dcache is not @@ -45,7 +63,10 @@ target_dcache_invalidate (void) DCACHE * target_dcache_get (void) { - return target_dcache; + DCACHE *dcache = address_space_data (current_program_space->aspace, + target_dcache_aspace_key); + + return dcache; } /* Return the target dcache. If it is not initialized yet, initialize @@ -54,10 +75,13 @@ target_dcache_get (void) DCACHE * target_dcache_get_or_init (void) { - if (!target_dcache_init_p ()) - target_dcache = dcache_init (); + DCACHE *dcache = address_space_data (current_program_space->aspace, + target_dcache_aspace_key); - return target_dcache; + if (dcache == NULL) + dcache = dcache_init (); + + return dcache; } /* The option sets this. */ @@ -113,4 +137,8 @@ By default, caching for stack access is on."), set_stack_cache_enabled_p, show_stack_cache_enabled_p, &setlist, &showlist); + + target_dcache_aspace_key + = register_address_space_data_with_cleanup (NULL, + target_dcache_cleanup); } |