Split out hw-alloc code. Add constructor and destructor for hw-alloc.

This commit is contained in:
Andrew Cagney 1998-05-25 08:18:03 +00:00
parent 39e953a722
commit 69be0d4cb8
7 changed files with 83 additions and 126 deletions

View file

@ -1,10 +1,25 @@
Mon May 25 17:14:27 1998 Andrew Cagney <cagney@b1.cygnus.com>
Mon May 25 17:40:46 1998 Andrew Cagney <cagney@b1.cygnus.com>
* dv-pal.c: Update.
* hw-device.c, hw-properties.c: Include hw-base.h
* hw-alloc.h, hw-alloc.c: New files. Move alloc code to here.
* hw-device.c: From here.
* hw-base.h: Include "hw-events.h".
* hw-base.h (create_hw_alloc_data, delete_hw_alloc_data): Declare.
* hw-base.c (hw_create, hw_delete): Call.
* hw-alloc.c (create_hw_alloc_data, delete_hw_alloc_data): Define.
* Make-common.in (SIM_NEW_COMMON_OBJS): Add hw-alloc.o.
(hw-alloc.o): New target.
Mon May 25 17:14:27 1998 Andrew Cagney <cagney@b1.cygnus.com>
* hw-events.h, hw-events.c: New files. Move event code to here.
* sim-hw.c: From here.
* hw-base.h: Include "hw-events.h".
* Make-common.in (SIM_NEW_COMMON_OBJS): Add hw-events.o.
(hw-events.o): New target.
* hw-device.h (struct hw): Add struct hw_event_data events_of_hw.
* hw-events.h (struct hw_event): Replace typedef hw_event.
@ -13,8 +28,7 @@ Mon May 25 17:14:27 1998 Andrew Cagney <cagney@b1.cygnus.com>
* hw-base.c (hw_create, hw_delete): Call.
* hw-events.c (create_hw_event_data, delete_hw_event_data): Define.
* Make-common.in (SIM_NEW_COMMON_OBJS): Add hw-events.o.
(hw-events.o): New target.
* dv-pal.c: Update.
Mon May 25 16:55:16 1998 Andrew Cagney <cagney@b1.cygnus.com>

View file

@ -142,6 +142,7 @@ SIM_EXTRA_CLEAN =
# Those files are specified in LIB_OBJS below.
SIM_COMMON_HW_OBJS = \
hw-alloc.o \
hw-device.o \
hw-events.o \
hw-ports.o \
@ -314,6 +315,7 @@ sim-options_h = $(srccom)/sim-options.h
sim-break_h = $(srccom)/sim-break.h
sim-signal_h = $(srccom)/sim-signal.h
hw-alloc_h = $(srccom)/hw-alloc.h
hw-base_h = $(srccom)/hw-base.h
hw-device_h = $(srccom)/hw-device.h
hw-events_h = $(srccom)/hw-events.h
@ -324,6 +326,7 @@ hw-properties_h = $(srccom)/hw-properties.h
hw-tree_h = $(srccom)/hw-tree.h
hw_base_headers = \
$(hw-alloc_h) \
$(hw-base_h) \
$(hw-device_h) \
$(hw-events_h) \
@ -472,6 +475,10 @@ hw-config.h: Makefile.in $(srccom)/Make-common.in config.status Makefile
echo "};" >> tmp-hw.h
mv tmp-hw.h hw-config.h
hw-alloc.o: $(srccom)/hw-alloc.c $(sim_main_headers) \
$(hw-alloc_h)
$(CC) -c $(srccom)/hw-alloc.c $(ALL_CFLAGS)
hw-base.o: $(srccom)/hw-base.c $(sim_main_headers) \
$(hw_base_headers) hw-config.h
$(CC) -c $(srccom)/hw-base.c $(ALL_CFLAGS)

View file

@ -417,6 +417,7 @@ hw_create (struct sim_state *sd,
}
/* Attach dummy ports */
create_hw_alloc_data (hw);
create_hw_port_data (hw);
create_hw_event_data (hw);
@ -500,7 +501,7 @@ hw_delete (struct hw *me)
}
/* blow away all memory belonging to the device */
hw_free_all (me);
delete_hw_alloc_data (me);
/* finally */
zfree (me->base_of_hw);

View file

@ -28,6 +28,7 @@
#include "hw-properties.h"
#include "hw-events.h"
#include "hw-alloc.h"
/* #include "hw-instances.h" */
/* #include "hw-handles.h" */
#include "hw-ports.h"
@ -133,6 +134,14 @@ int do_hw_poll_read
unsigned size_of_buf);
/* ALLOC */
extern void create_hw_alloc_data
(struct hw *hw);
extern void delete_hw_alloc_data
(struct hw *hw);
/* PORTS */
extern void create_hw_port_data

View file

@ -20,9 +20,7 @@
#include "sim-main.h"
#include "hw-device.h"
#include "hw-properties.h"
#include "hw-base.h"
#if HAVE_STDLIB_H
#include <stdlib.h>
@ -54,74 +52,6 @@ hw_ioctl (struct hw *me,
return status;
}
/* Mechanism for associating allocated memory regions to a device.
When a device is deleted any remaining memory regions are also
reclaimed.
FIXME: Perhaphs this can be generalized, perhaphs it should not
be. */
struct hw_alloc_data {
void *alloc;
int zalloc_p;
struct hw_alloc_data *next;
};
void *
hw_zalloc (struct hw *me, unsigned long size)
{
struct hw_alloc_data *memory = ZALLOC (struct hw_alloc_data);
memory->alloc = zalloc (size);
memory->zalloc_p = 1;
memory->next = me->alloc_of_hw;
me->alloc_of_hw = memory;
return memory->alloc;
}
void *
hw_malloc (struct hw *me, unsigned long size)
{
struct hw_alloc_data *memory = ZALLOC (struct hw_alloc_data);
memory->alloc = zalloc (size);
memory->zalloc_p = 0;
memory->next = me->alloc_of_hw;
me->alloc_of_hw = memory;
return memory->alloc;
}
void
hw_free (struct hw *me,
void *alloc)
{
struct hw_alloc_data **memory;
for (memory = &me->alloc_of_hw;
*memory != NULL;
memory = &(*memory)->next)
{
if ((*memory)->alloc == alloc)
{
struct hw_alloc_data *die = (*memory);
(*memory) = die->next;
if (die->zalloc_p)
zfree (die->alloc);
else
free (die->alloc);
zfree (die);
return;
}
}
hw_abort (me, "free of memory not belonging to a device");
}
void
hw_free_all (struct hw *me)
{
while (me->alloc_of_hw != NULL)
{
hw_free (me, me->alloc_of_hw->alloc);
}
}
char *
hw_strdup (struct hw *me, const char *str)
{

View file

@ -351,23 +351,6 @@ typedef int (hw_unit_size_to_attach_size_callback)
/* Memory allocator / de-allocator.
All memory allocated using the below will be automatically
reclaimed when the device is deleted.
A device implementation can either use these functions when
allocating memory or use malloc/zalloc/free an co-ordinate its own
garbage collection. */
#define HW_ZALLOC(me,type) (type*) hw_zalloc (me, sizeof (type))
#define HW_MALLOC(me,type) (type*) hw_malloc (me, sizeof (type))
extern void *hw_zalloc (struct hw *me, unsigned long size);
extern void *hw_malloc (struct hw *me, unsigned long size);
extern void hw_free (struct hw *me, void *);
extern void hw_free_all (struct hw *me);
extern char *hw_strdup (struct hw *me, const char *str);

View file

@ -19,9 +19,7 @@
*/
#include "sim-main.h"
#include "hw-device.h"
#include "hw-properties.h"
#include "hw-base.h"
#include "sim-assert.h"
@ -347,9 +345,10 @@ hw_find_array_property (struct hw *me,
{
const struct hw_property *node;
node = hw_find_property (me, property);
if (node == NULL
|| node->type != array_property)
hw_abort(me, "property %s not found or of wrong type", property);
if (node == NULL)
hw_abort (me, "property \"%s\" not found", property);
if (node->type != array_property)
hw_abort (me, "property \"%s\" of wrong type (array)", property);
return node;
}
@ -374,8 +373,10 @@ hw_find_boolean_property (struct hw *me,
const struct hw_property *node;
unsigned_cell boolean;
node = hw_find_property (me, property);
if (node == NULL || node->type != boolean_property)
hw_abort (me, "property %s not found or of wrong type", property);
if (node == NULL)
hw_abort (me, "property \"%s\" not found", property);
if (node->type != boolean_property)
hw_abort (me, "property \"%s\" of wrong type (boolean)", property);
ASSERT (sizeof (boolean) == node->sizeof_array);
memcpy (&boolean, node->array, sizeof (boolean));
return boolean;
@ -407,10 +408,11 @@ hw_find_ihandle_runtime_property (struct hw *me,
TRACE (trace_devices,
("hw_find_ihandle_runtime_property(me=0x%lx, property=%s)\n",
(long)me, property));
if (entry == NULL
|| entry->property->type != ihandle_property
if (entry == NULL)
hw_abort (me, "property \"%s\" not found", property);
if (entry->property->type != ihandle_property
|| entry->property->disposition != permenant_object)
hw_abort (me, "property %s not found or of wrong type", property);
hw_abort (me, "property \"%s\" of wrong type", property);
ASSERT (entry->init_array != NULL);
/* the full path */
ihandle->full_path = entry->init_array;
@ -443,10 +445,12 @@ hw_find_ihandle_property (struct hw *me,
hw_instance *instance;
node = hw_find_property (me, property);
if (node == NULL || node->type != ihandle_property)
hw_abort(me, "property %s not found or of wrong type", property);
if (node == NULL)
hw_abort (me, "property \"%s\" not found", property);
if (node->type != ihandle_property)
hw_abort(me, "property \"%s\" of wrong type (ihandle)", property);
if (node->array == NULL)
hw_abort(me, "runtime property %s not yet initialized", property);
hw_abort(me, "runtime property \"%s\" not yet initialized", property);
ASSERT (sizeof(ihandle) == node->sizeof_array);
memcpy (&ihandle, node->array, sizeof(ihandle));
@ -479,8 +483,10 @@ hw_find_integer_property (struct hw *me,
("hw_find_integer(me=0x%lx, property=%s)\n",
(long)me, property));
node = hw_find_property (me, property);
if (node == NULL || node->type != integer_property)
hw_abort (me, "property %s not found or of wrong type", property);
if (node == NULL)
hw_abort (me, "property \"%s\" not found", property);
if (node->type != integer_property)
hw_abort (me, "property \"%s\" of wrong type (integer)", property);
ASSERT (sizeof(integer) == node->sizeof_array);
memcpy (&integer, node->array, sizeof (integer));
return BE2H_cell (integer);
@ -501,12 +507,13 @@ hw_find_integer_array_property (struct hw *me,
/* check things sane */
node = hw_find_property (me, property);
if (node == NULL
|| (node->type != integer_property
&& node->type != array_property))
hw_abort (me, "property %s not found or of wrong type", property);
if (node == NULL)
hw_abort (me, "property \"%s\" not found", property);
if (node->type != integer_property
&& node->type != array_property)
hw_abort (me, "property \"%s\" of wrong type (integer or array)", property);
if ((node->sizeof_array % sizeof_integer) != 0)
hw_abort (me, "property %s contains an incomplete number of cells", property);
hw_abort (me, "property \"%s\" contains an incomplete number of cells", property);
if (node->sizeof_array <= sizeof_integer * index)
return 0;
@ -612,12 +619,14 @@ hw_find_range_array_property (struct hw *me,
/* locate the property */
node = hw_find_property (me, property);
if (node == NULL || node->type != range_array_property)
hw_abort (me, "property %s not found or of wrong type", property);
if (node == NULL)
hw_abort (me, "property \"%s\" not found", property);
if (node->type != range_array_property)
hw_abort (me, "property \"%s\" of wrong type (range array)", property);
/* aligned ? */
if ((node->sizeof_array % sizeof_entry) != 0)
hw_abort (me, "property %s contains an incomplete number of entries",
hw_abort (me, "property \"%s\" contains an incomplete number of entries",
property);
/* within bounds? */
@ -700,12 +709,14 @@ hw_find_reg_array_property (struct hw *me,
/* locate the property */
node = hw_find_property (me, property);
if (node == NULL || node->type != reg_array_property)
hw_abort (me, "property %s not found or of wrong type", property);
if (node == NULL)
hw_abort (me, "property \"%s\" not found", property);
if (node->type != reg_array_property)
hw_abort (me, "property \"%s\" of wrong type (reg array)", property);
/* aligned ? */
if ((node->sizeof_array % sizeof_entry) != 0)
hw_abort (me, "property %s contains an incomplete number of entries",
hw_abort (me, "property \"%s\" contains an incomplete number of entries",
property);
/* within bounds? */
@ -745,8 +756,10 @@ hw_find_string_property (struct hw *me,
const struct hw_property *node;
const char *string;
node = hw_find_property (me, property);
if (node == NULL || node->type != string_property)
hw_abort (me, "property %s not found or of wrong type", property);
if (node == NULL)
hw_abort (me, "property \"%s\" not found", property);
if (node->type != string_property)
hw_abort (me, "property \"%s\" of wrong type (string)", property);
string = node->array;
ASSERT (strlen(string) + 1 == node->sizeof_array);
return string;
@ -763,7 +776,7 @@ hw_add_string_array_property (struct hw *me,
char *array;
char *chp;
if (nr_strings == 0)
hw_abort (me, "property %s must be non-null", property);
hw_abort (me, "property \"%s\" must be non-null", property);
/* total up the size of the needed array */
for (sizeof_array = 0, string_nr = 0;
string_nr < nr_strings;
@ -798,11 +811,11 @@ hw_find_string_array_property (struct hw *me,
const struct hw_property *node;
node = hw_find_property (me, property);
if (node == NULL)
hw_abort (me, "property %s not found", property);
hw_abort (me, "property \"%s\" not found", property);
switch (node->type)
{
default:
hw_abort (me, "property %s of wrong type", property);
hw_abort (me, "property \"%s\" of wrong type", property);
break;
case string_property:
if (index == 0)
@ -815,7 +828,7 @@ hw_find_string_array_property (struct hw *me,
case array_property:
if (node->sizeof_array == 0
|| ((char*)node->array)[node->sizeof_array - 1] != '\0')
hw_abort (me, "property %s invalid for string array", property);
hw_abort (me, "property \"%s\" invalid for string array", property);
/* FALL THROUGH */
case string_array_property:
ASSERT (node->sizeof_array > 0);