aboutsummaryrefslogtreecommitdiff
path: root/gdb/target-dcache.c
diff options
context:
space:
mode:
authorYao Qi <yao@codesourcery.com>2013-10-31 22:18:10 +0800
committerYao Qi <yao@codesourcery.com>2013-11-20 12:41:26 +0800
commitb26dfc9ab352692e0bb8b005b9ca58eb1bc8c026 (patch)
treec8efc49902d6c2df9e87424ef7eb4dd8d9567b6b /gdb/target-dcache.c
parent3a8356ffac809056cb3650c50a00f4adb30cc147 (diff)
downloadgdb-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.c46
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);
}