diff options
Diffstat (limited to 'gdb/progspace.c')
-rw-r--r-- | gdb/progspace.c | 111 |
1 files changed, 6 insertions, 105 deletions
diff --git a/gdb/progspace.c b/gdb/progspace.c index 1065c27..6498738 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -37,10 +37,13 @@ struct program_space *current_program_space; /* The last address space number assigned. */ static int highest_address_space_num; -/* Prototypes for local functions */ + + +/* Keep a registry of per-program_space data-pointers required by other GDB + modules. */ + +DEFINE_REGISTRY (program_space) -static void program_space_alloc_data (struct program_space *); -static void program_space_free_data (struct program_space *); /* An address space. Currently this is not used for much other than @@ -517,108 +520,6 @@ clear_program_space_solib_cache (struct program_space *pspace) -/* Keep a registry of per-program_space data-pointers required by other GDB - modules. */ - -struct program_space_data -{ - unsigned index; - void (*cleanup) (struct program_space *, void *); -}; - -struct program_space_data_registration -{ - struct program_space_data *data; - struct program_space_data_registration *next; -}; - -struct program_space_data_registry -{ - struct program_space_data_registration *registrations; - unsigned num_registrations; -}; - -static struct program_space_data_registry program_space_data_registry - = { NULL, 0 }; - -const struct program_space_data * -register_program_space_data_with_cleanup - (void (*cleanup) (struct program_space *, void *)) -{ - struct program_space_data_registration **curr; - - /* Append new registration. */ - for (curr = &program_space_data_registry.registrations; - *curr != NULL; curr = &(*curr)->next); - - *curr = XMALLOC (struct program_space_data_registration); - (*curr)->next = NULL; - (*curr)->data = XMALLOC (struct program_space_data); - (*curr)->data->index = program_space_data_registry.num_registrations++; - (*curr)->data->cleanup = cleanup; - - return (*curr)->data; -} - -const struct program_space_data * -register_program_space_data (void) -{ - return register_program_space_data_with_cleanup (NULL); -} - -static void -program_space_alloc_data (struct program_space *pspace) -{ - gdb_assert (pspace->data == NULL); - pspace->num_data = program_space_data_registry.num_registrations; - pspace->data = XCALLOC (pspace->num_data, void *); -} - -static void -program_space_free_data (struct program_space *pspace) -{ - gdb_assert (pspace->data != NULL); - clear_program_space_data (pspace); - xfree (pspace->data); - pspace->data = NULL; -} - -void -clear_program_space_data (struct program_space *pspace) -{ - struct program_space_data_registration *registration; - int i; - - gdb_assert (pspace->data != NULL); - - for (registration = program_space_data_registry.registrations, i = 0; - i < pspace->num_data; - registration = registration->next, i++) - if (pspace->data[i] != NULL && registration->data->cleanup) - registration->data->cleanup (pspace, pspace->data[i]); - - memset (pspace->data, 0, pspace->num_data * sizeof (void *)); -} - -void -set_program_space_data (struct program_space *pspace, - const struct program_space_data *data, - void *value) -{ - gdb_assert (data->index < pspace->num_data); - pspace->data[data->index] = value; -} - -void * -program_space_data (struct program_space *pspace, - const struct program_space_data *data) -{ - gdb_assert (data->index < pspace->num_data); - return pspace->data[data->index]; -} - - - void initialize_progspace (void) { |