Split out hw-alloc code. Add constructor and destructor for hw-alloc.
authorAndrew Cagney <cagney@redhat.com>
Mon, 25 May 1998 08:18:03 +0000 (08:18 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 25 May 1998 08:18:03 +0000 (08:18 +0000)
sim/common/ChangeLog
sim/common/Make-common.in
sim/common/hw-base.c
sim/common/hw-base.h
sim/common/hw-device.c
sim/common/hw-device.h
sim/common/hw-properties.c

index 1e322378270d63d93fb9ba36cc31c51f8927b76b..ae5e2a3f9cb4b32806f46d50b5c96a136abbacf6 100644 (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>
 
index 23763e193ce19c074a33fd1c516ba2f77b44b34b..dcc8c7a7383d3a7514f064bc070638329be67e90 100644 (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)
index 25b5c235e6e75c553009f1dda4ee6db64e19e3e4..03aad9ba3b7d6ebc63b1073bf007f1c2d0e7a9b8 100644 (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);
index 99d68ac392aac9464cfe0c80e90fb3363f23ded3..1866d64465110e3d5c163e16bf7cbd9c71736b98 100644 (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
index f47ae86a70da618e5761356cdf103e33fba7a3b9..b435ebd0f7031fc003ec60b5d6e216793fc5d70c 100644 (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)
 {
index 558c41d8d4f6c69fc7109a098066324b94c88e0f..a787089c87c7ff7985e93e1a4ad1bfb3df592373 100644 (file)
@@ -351,23 +351,6 @@ typedef int (hw_unit_size_to_attach_size_callback)
 
 
 \f
-/* 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);
 
 \f
index a42c0c9188e29a7a9f8c538109f02eda5dd4d3fd..b46f2955404ca7b5d376392e66c50aa796274f8a 100644 (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);