Changeset 3235ad9 in rtems for cpukit/score/src/object.c


Ignore:
Timestamp:
Aug 23, 1995, 7:30:23 PM (26 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
5250ff39
Parents:
80e2c29e
Message:

Support for variable length names added to Object Handler. This supports
both fixed length "raw" names and strings from the API's point of view.

Both inline and macro implementations were tested.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/score/src/object.c

    r80e2c29e r3235ad9  
    5656 *    supports_global - TRUE if this is a global object class
    5757 *    maximum         - maximum objects of this class
     58 *    is_string       - TRUE if names for this object are strings
    5859 *    size            - size of this object's control block
    5960 *
     
    6667  boolean              supports_global,
    6768  unsigned32           maximum,
    68   unsigned32           size
     69  unsigned32           size,
     70  boolean              is_string,
     71  unsigned32           maximum_name_length
    6972)
    7073{
     
    7275  unsigned32       index;
    7376  Objects_Control *the_object;
     77  unsigned32       name_length;
     78  void            *name_area;
    7479
    7580  information->maximum   = maximum;
    7681  information->the_class = the_class;
     82  information->is_string = is_string;
     83
     84  /*
     85   *  Calculate minimum and maximum Id's
     86   */
    7787
    7888  if ( maximum == 0 ) minimum_index = 0;
     
    8494  information->maximum_id =
    8595    _Objects_Build_id( the_class, _Objects_Local_node, maximum );
     96
     97  /*
     98   *  Allocate local pointer table
     99   */
    86100
    87101  information->local_table = _Workspace_Allocate_or_fatal_error(
     
    89103  );
    90104
    91   information->name_table = _Workspace_Allocate_or_fatal_error(
    92     (maximum + 1) * sizeof(Objects_Name)
    93   );
    94 
    95   for ( index=0 ; index < maximum ; index++ ) {
     105  /*
     106   *  Allocate name table
     107   */
     108
     109  name_length = maximum_name_length;
     110
     111  if (name_length & (OBJECTS_NAME_ALIGNMENT-1))
     112    name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
     113                  ~(OBJECTS_NAME_ALIGNMENT-1);
     114
     115  information->name_length = name_length;
     116
     117  name_area = _Workspace_Allocate_or_fatal_error( (maximum + 1) * name_length );
     118  information->name_table = name_area;
     119
     120  /*
     121   *  Initialize local pointer table
     122   */
     123
     124  for ( index=0 ; index <= maximum ; index++ ) {
    96125     information->local_table[ index ] = NULL;
    97      information->name_table[ index ]  = 0;
    98126  }
     127
     128  /*
     129   *  Initialize objects .. if there are any
     130   */
    99131
    100132  if ( maximum == 0 ) {
    101133    _Chain_Initialize_empty( &information->Inactive );
    102134  } else {
    103 
    104135
    105136    _Chain_Initialize(
     
    111142
    112143    the_object = (Objects_Control *) information->Inactive.first;
    113     for ( index=1;
    114           index <= maximum ;
    115           index++ ) {
     144    for ( index=1; index <= maximum ; index++ ) {
    116145      the_object->id =
    117146        _Objects_Build_id( the_class, _Objects_Local_node, index );
     147     
     148      the_object->name = (void *) name_area;
     149
     150      name_area = _Addresses_Add_offset( name_area, name_length );
     151
    118152      the_object = (Objects_Control *) the_object->Node.next;
    119153    }
     
    121155  }
    122156
    123  if ( supports_global == TRUE && _Configuration_Is_multiprocessing() ) {
    124 
    125    information->global_table = _Workspace_Allocate_or_fatal_error(
    126      (_Configuration_MP_table->maximum_nodes + 1) * sizeof(Chain_Control)
    127    );
    128 
    129    for ( index=1;
    130          index <= _Configuration_MP_table->maximum_nodes ;
    131          index++ )
    132      _Chain_Initialize_empty( &information->global_table[ index ] );
    133   }
    134   else
    135     information->global_table = NULL;
    136 }
     157  /*
     158   *  Take care of multiprocessing
     159   */
     160
     161  if ( supports_global == TRUE && _Configuration_Is_multiprocessing() ) {
     162
     163    information->global_table = _Workspace_Allocate_or_fatal_error(
     164      (_Configuration_MP_table->maximum_nodes + 1) * sizeof(Chain_Control)
     165    );
     166
     167    for ( index=1;
     168          index <= _Configuration_MP_table->maximum_nodes ;
     169          index++ )
     170      _Chain_Initialize_empty( &information->global_table[ index ] );
     171   }
     172   else
     173     information->global_table = NULL;
     174}
     175
     176/*PAGE
     177 *
     178 *  _Objects_Clear_name
     179 *
     180 *  XXX
     181 */
     182
     183void _Objects_Clear_name(
     184  void       *name,
     185  unsigned32  length
     186)
     187{
     188  unsigned32  index;
     189  unsigned32  maximum = length / OBJECTS_NAME_ALIGNMENT;
     190  unsigned32 *name_ptr = name;
     191
     192  for ( index=0 ; index < maximum ; index++ )
     193    *name_ptr++ = 0;
     194}
     195 
     196/*PAGE
     197 *
     198 *  _Objects_Copy_name_string
     199 *
     200 *  XXX
     201 */
     202 
     203void _Objects_Copy_name_string(
     204  void       *source,
     205  void       *destination
     206)
     207{
     208  unsigned8 *source_p = source;
     209  unsigned8 *destination_p = destination;
     210 
     211  do {
     212    *destination_p++ = *source_p;
     213  } while ( *source_p++ );
     214}
     215
     216/*PAGE
     217 *
     218 *  _Objects_Copy_name_raw
     219 *
     220 *  XXX
     221 */
     222 
     223void _Objects_Copy_name_raw(
     224  void       *source,
     225  void       *destination,
     226  unsigned32  length
     227)
     228{
     229  unsigned32 *source_p = source;
     230  unsigned32 *destination_p = destination;
     231  unsigned32  tmp_length = length / OBJECTS_NAME_ALIGNMENT;
     232 
     233  while ( tmp_length-- )
     234    *destination_p++ = *source_p++;
     235}
     236
     237/*PAGE
     238 *
     239 *  _Objects_Compare_name_string
     240 *
     241 *  XXX
     242 */
     243 
     244boolean _Objects_Compare_name_string(
     245  void       *name_1,
     246  void       *name_2,
     247  unsigned32  length
     248)
     249{
     250  unsigned8 *name_1_p = name_1;
     251  unsigned8 *name_2_p = name_2;
     252  unsigned32 tmp_length = length;
     253 
     254  do {
     255    if ( *name_1_p++ != *name_2_p++ )
     256      return FALSE;
     257    if ( !tmp_length-- )
     258      return FALSE;
     259  } while ( *name_1_p );
     260
     261  return TRUE;
     262}
     263 
     264/*PAGE
     265 *
     266 *  _Objects_Compare_name_raw
     267 *
     268 *  XXX
     269 */
     270 
     271boolean _Objects_Compare_name_raw(
     272  void       *name_1,
     273  void       *name_2,
     274  unsigned32  length
     275)
     276{
     277  unsigned32 *name_1_p = name_1;
     278  unsigned32 *name_2_p = name_2;
     279  unsigned32  tmp_length = length / OBJECTS_NAME_ALIGNMENT;
     280 
     281  while ( tmp_length-- )
     282    if ( *name_1_p++ != *name_2_p++ )
     283      return FALSE;
     284
     285  return TRUE;
     286}
     287
    137288
    138289/*PAGE
     
    157308rtems_status_code _Objects_Name_to_id(
    158309  Objects_Information *information,
    159   Objects_Name                name,
    160   unsigned32                  node,
    161   Objects_Id                 *id
    162 )
    163 {
    164   boolean           search_local_node;
    165   Objects_Control **objects;
    166   Objects_Control  *the_object;
    167   unsigned32        index;
     310  Objects_Name         name,
     311  unsigned32           node,
     312  Objects_Id          *id
     313)
     314{
     315  boolean                    search_local_node;
     316  Objects_Control          **objects;
     317  Objects_Control           *the_object;
     318  unsigned32                 index;
     319  unsigned32                 name_length;
     320  Objects_Name_comparators   compare_them;
    168321
    169322  if ( name == 0 )
     
    180333    objects = information->local_table;
    181334
     335    name_length = information->name_length;
     336
     337    if ( information->is_string ) compare_them = _Objects_Compare_name_string;
     338    else                          compare_them = _Objects_Compare_name_raw;
     339
    182340    for ( index = 1; index <= information->maximum; index++ ) {
    183341
     
    187345        continue;
    188346
    189       if ( name == *the_object->name ) {
     347      if ( (*compare_them)( name, the_object->name, name_length ) ) {
    190348        *id = the_object->id;
    191349        return( RTEMS_SUCCESSFUL );
Note: See TracChangeset for help on using the changeset viewer.