[PATCH 12/17] libbsp/shared/console.c: Clean up memory allocation for per device data

Joel Sherrill joel at rtems.org
Thu Mar 10 16:39:20 UTC 2016


On Thu, Mar 10, 2016 at 10:35 AM, Joel Sherrill <joel at rtems.org> wrote:

>
>
> On Wed, Mar 9, 2016 at 8:15 PM, Gedare Bloom <gedare at rtems.org> wrote:
>
>> On Wed, Mar 9, 2016 at 5:24 PM, Joel Sherrill <joel at rtems.org> wrote:
>> > ---
>> >  c/src/lib/libbsp/shared/console.c | 49
>> ++++++++++++++++++++++++++++-----------
>> >  1 file changed, 36 insertions(+), 13 deletions(-)
>> >
>> > diff --git a/c/src/lib/libbsp/shared/console.c
>> b/c/src/lib/libbsp/shared/console.c
>> > index 81a70b1..d030065 100644
>> > --- a/c/src/lib/libbsp/shared/console.c
>> > +++ b/c/src/lib/libbsp/shared/console.c
>> > @@ -7,7 +7,7 @@
>> >   */
>> >
>> >  /*
>> > - *  COPYRIGHT (c) 1989-2011.
>> > + *  COPYRIGHT (c) 1989-2011, 2016.
>> >   *  On-Line Applications Research Corporation (OAR).
>> >   *
>> >   *  The license and distribution terms for this file may be
>> > @@ -46,13 +46,28 @@ void console_initialize_data(void)
>> >    if ( Console_Port_Tbl )
>> >      return;
>> >
>> > +  /*
>> > +   * Allocate memory for the table of device pointers.
>> > +   */
>> >    Console_Port_Count = Console_Configuration_Count;
>> >    Console_Port_Tbl   = malloc( Console_Port_Count * sizeof(
>> console_tbl * ) );
>> >    if (Console_Port_Tbl == NULL)
>> >      bsp_fatal( BSP_FATAL_CONSOLE_NO_MEMORY_0 );
>> >
>> > -  for (i=0 ; i < Console_Port_Count ; i++)
>> > +  /*
>> > +   * Allocate memory for the table of device specific data pointers.
>> > +   */
>> > +  Console_Port_Data  = calloc( Console_Port_Count, sizeof(
>> console_data ) );
>> why calloc ...
>>
>>
> Good catch. Likely already there but just wasted time. Changing to
> malloc().
>

I think we both misread it. The calloc() is for data per port. The copy is
copying
the per port configuration data. They are different. Notice
Console_Port_Data
vs Console_Port_Tbl.

I think this is OK on closer look.

Anything else.

>
>
>> > +  if ( Console_Port_Data == NULL ) {
>> > +    bsp_fatal( BSP_FATAL_CONSOLE_NO_MEMORY_3 );
>> > +  }
>> > +
>> > +  /*
>> > +   * Fill in the Console Table
>> > +   */
>> > +  for (i=0 ; i < Console_Port_Count ; i++) {
>> >      Console_Port_Tbl[i] = &Console_Configuration_Ports[i];
>> > +  }
>> ... if you will immediately initialize it
>>
>> >  }
>> >
>> >  /*
>> > @@ -69,10 +84,13 @@ void console_register_devices(
>> >    int  old_number_of_ports;
>> >    int  i;
>> >
>> > +  /*
>> > +   * Initialize the console data elements
>> > +   */
>> >    console_initialize_data();
>> >
>> >    /*
>> > -   *  console_initialize has been invoked so it is now too late to
>> > +   *  console_initialize() has been invoked so it is now too late to
>> >     *  register devices.
>> >     */
>> >    if ( console_initialized ) {
>> > @@ -86,23 +104,31 @@ void console_register_devices(
>> >    Console_Port_Count += number_of_ports;
>> >    Console_Port_Tbl = realloc(
>> >      Console_Port_Tbl,
>> > -    Console_Port_Count * sizeof( console_tbl * )
>> > +    Console_Port_Count * sizeof(console_tbl *)
>> >    );
>> >    if ( Console_Port_Tbl == NULL ) {
>> >      bsp_fatal( BSP_FATAL_CONSOLE_NO_MEMORY_1 );
>> >    }
>> >
>> > -  Console_Port_Data  = calloc( Console_Port_Count, sizeof(
>> console_data ) );
>> > +  /*
>> > +   * Since we can only add devices before console_initialize(),
>> > +   * the data area will contain no information and must be zero
>> > +   * before it is used. So extend the area and zero it out.
>> > +   */
>> > +  Console_Port_Data = realloc(
>> > +    Console_Port_Data,
>> > +    Console_Port_Count * sizeof(console_tbl *)
>> > +  );
>> >    if ( Console_Port_Data == NULL ) {
>> >      bsp_fatal( BSP_FATAL_CONSOLE_NO_MEMORY_2 );
>> >    }
>> > +  memset(&Console_Port_Data, '\0', Console_Port_Count *
>> sizeof(console_tbl *));
>> >
>> >    /*
>> >     *  Now add the new devices at the end.
>> >     */
>> > -
>> >    for (i=0 ; i < number_of_ports ; i++) {
>> > -    Console_Port_Tbl[old_number_of_ports + i] = &new_ports[i];
>> > +    Console_Port_Tbl[old_number_of_ports + i]  = &new_ports[i];
>> >    }
>> >  }
>> >
>> > @@ -249,14 +275,11 @@ rtems_device_driver console_initialize(
>> >
>> >    /*
>> >     * If we have no devices which were registered earlier then we
>> > -   * must still initialize pointers and set Console_Port_Data.
>> > +   * must still initialize pointers for Console_Port_Tbl and
>> > +   * Console_Port_Data.
>> >     */
>> > -  if ( ! Console_Port_Tbl ) {
>> > +  if ( !Console_Port_Tbl ) {
>> >      console_initialize_data();
>> > -    Console_Port_Data  = calloc( Console_Port_Count, sizeof(
>> console_data ) );
>> > -    if ( Console_Port_Data == NULL ) {
>> > -      bsp_fatal( BSP_FATAL_CONSOLE_NO_MEMORY_3 );
>> > -    }
>> >    }
>> >
>> >    /*
>> > --
>> > 1.8.3.1
>> >
>> > _______________________________________________
>> > devel mailing list
>> > devel at rtems.org
>> > http://lists.rtems.org/mailman/listinfo/devel
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20160310/5221ac3a/attachment-0002.html>


More information about the devel mailing list