Changeset 3899bc1a in rtems


Ignore:
Timestamp:
11/24/18 10:51:28 (4 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
5, master
Children:
1c2d178
Parents:
359a3a3
git-author:
Sebastian Huber <sebastian.huber@…> (11/24/18 10:51:28)
git-committer:
Sebastian Huber <sebastian.huber@…> (12/07/18 13:22:01)
Message:

score: Optimize object lookup

Use the maximum ID for the ID to object translation. Using the maximum
ID gets rid of an additional load from the object information in
_Objects_Get(). In addition, object lookups fail for every ID in case
the object information is cleared to zero. This makes it a bit more
robust during system startup (see new tests in spconfig02).

The local table no longer needs a NULL pointer entry at array index
zero. Adjust all the object iteration loops accordingly.

Remove Objects_Information::minimum_id since it contains only redundant
information. Add _Objects_Get_minimum_id() to get the minimum ID.

Update #3621.

Files:
17 edited

Legend:

Unmodified
Added
Removed
  • cpukit/include/rtems/score/objectimpl.h

    r359a3a3 r3899bc1a  
    121121 */
    122122typedef struct {
    123   /** This is the minimum valid id of this object class. */
    124   Objects_Id        minimum_id;
    125123  /** This is the maximum valid id of this object class. */
    126124  Objects_Id        maximum_id;
     
    191189#define _Objects_Maximum_nodes 1
    192190#endif
     191
     192/**
     193 * This is the minimum object ID index associated with an object.
     194 */
     195#define OBJECTS_INDEX_MINIMUM 1U
    193196
    194197/**
     
    833836
    834837/**
     838 * Returns the identifier with the minimum index for the specified identifier.
     839 *
     840 * The specified identifier must have valid API, class and node fields.
     841 *
     842 * @param[in] id The identifier to be processed.
     843 *
     844 * @return The corresponding ID with the minimum index.
     845 */
     846RTEMS_INLINE_ROUTINE Objects_Id _Objects_Get_minimum_id( Objects_Id id )
     847{
     848  id &= ~OBJECTS_INDEX_MASK;
     849  id += (Objects_Id) OBJECTS_INDEX_MINIMUM << OBJECTS_INDEX_START_BIT;
     850  return id;
     851}
     852
     853/**
    835854 * This function sets the pointer to the local_table object
    836855 * referenced by the index.
     
    857876   *  occur in normal situations.
    858877   */
     878  _Assert( index >= OBJECTS_INDEX_MINIMUM );
    859879  _Assert( index <= information->maximum );
    860880
    861   information->local_table[ index ] = the_object;
     881  information->local_table[ index - OBJECTS_INDEX_MINIMUM ] = the_object;
    862882}
    863883
  • cpukit/posix/src/killinfo.c

    r359a3a3 r3899bc1a  
    211211    object_table = the_info->local_table;
    212212
    213     for ( index = 1 ; index <= maximum ; index++ ) {
     213    for ( index = 0 ; index < maximum ; ++index ) {
    214214      the_thread = (Thread_Control *) object_table[ index ];
    215215
  • cpukit/rtems/src/ratemonreportstatistics.c

    r359a3a3 r3899bc1a  
    3636{
    3737  rtems_status_code                      status;
     38  rtems_id                               maximum_id;
    3839  rtems_id                               id;
    3940  rtems_rate_monotonic_period_statistics the_stats;
     
    6869   * is a period that is inactive, we just get an error back.  No big deal.
    6970   */
    70   for ( id=_Rate_monotonic_Information.minimum_id ;
    71         id <= _Rate_monotonic_Information.maximum_id ;
    72         id++ ) {
     71  maximum_id = _Rate_monotonic_Information.maximum_id;
     72  for (
     73    id = _Objects_Get_minimum_id( maximum_id ) ;
     74    id <= maximum_id ;
     75    ++id
     76  ) {
    7377    status = rtems_rate_monotonic_get_statistics( id, &the_stats );
    7478    if ( status != RTEMS_SUCCESSFUL )
  • cpukit/rtems/src/ratemonresetall.c

    r359a3a3 r3899bc1a  
    2626void rtems_rate_monotonic_reset_all_statistics( void )
    2727{
    28   Objects_Id        id;
     28  rtems_id maximum_id;
     29  rtems_id id;
    2930
    3031   /*
     
    3839     * is a period that is inactive, we just get an error back.  No big deal.
    3940     */
    40     for ( id=_Rate_monotonic_Information.minimum_id ;
    41           id <= _Rate_monotonic_Information.maximum_id ;
    42           id++ ) {
     41    maximum_id = _Rate_monotonic_Information.maximum_id;
     42    for (
     43      id = _Objects_Get_minimum_id( maximum_id ) ;
     44      id <= maximum_id ;
     45      ++id
     46    ) {
    4347      (void) rtems_rate_monotonic_reset_statistics( id );
    4448    }
  • cpukit/rtems/src/rtemsobjectgetclassinfo.c

    r359a3a3 r3899bc1a  
    4545   * Return information about this object class to the user.
    4646   */
    47   info->minimum_id  = obj_info->minimum_id;
     47  info->minimum_id  = _Objects_Get_minimum_id( obj_info->maximum_id );
    4848  info->maximum_id  = obj_info->maximum_id;
    4949  info->auto_extend = obj_info->auto_extend;
  • cpukit/score/src/objectallocate.c

    r359a3a3 r3899bc1a  
    6363     */
    6464
    65     if ( !the_object ) {
     65    if ( the_object == NULL ) {
    6666      _Objects_Extend_information( information );
    6767      the_object = _Objects_Get_inactive( information );
    6868    }
    6969
    70     if ( the_object ) {
    71       uint32_t  block;
     70    if ( the_object != NULL ) {
     71      Objects_Maximum block;
    7272
    73       block = (uint32_t) _Objects_Get_index( the_object->id ) -
    74               _Objects_Get_index( information->minimum_id );
     73      block = _Objects_Get_index( the_object->id ) - OBJECTS_INDEX_MINIMUM;
    7574      block /= information->objects_per_block;
    7675
  • cpukit/score/src/objectextendinformation.c

    r359a3a3 r3899bc1a  
    4949  uint32_t          index_base;
    5050  uint32_t          index_end;
    51   uint32_t          minimum_index;
    5251  uint32_t          index;
    5352  uint32_t          maximum;
     
    6665   */
    6766  do_extend     = true;
    68   minimum_index = _Objects_Get_index( information->minimum_id );
    69   index_base    = minimum_index;
     67  index_base    = 0;
    7068  block         = 0;
    7169
    72   /* if ( information->maximum < minimum_index ) */
    7370  if ( information->object_blocks == NULL )
    7471    block_count = 0;
     
    150147     */
    151148    object_blocks_size = block_count * sizeof( *object_blocks );
    152     local_table_size = ( maximum + minimum_index ) * sizeof( *local_table );
     149    local_table_size =  maximum * sizeof( *local_table );
    153150    table_size = object_blocks_size
    154151      + local_table_size
     
    182179    block_count--;
    183180
    184     if ( information->maximum > minimum_index ) {
     181    if ( information->maximum > 0 ) {
    185182      /*
    186183       *  Copy each section of the table over. This has to be performed as
     
    200197        local_table,
    201198        information->local_table,
    202         ( information->maximum + minimum_index ) * sizeof( *local_table )
     199        information->maximum * sizeof( *local_table )
    203200      );
    204     } else {
    205       /*
    206        *  Deal with the special case of the 0 to minimum_index
    207        */
    208       for ( index = 0; index < minimum_index; index++ ) {
    209         local_table[ index ] = NULL;
    210       }
    211201    }
    212202
     
    257247      information->the_class,
    258248      _Objects_Local_node,
    259       index
     249      index + OBJECTS_INDEX_MINIMUM
    260250    );
    261251
  • cpukit/score/src/objectfree.c

    r359a3a3 r3899bc1a  
    3838
    3939    objects_per_block = information->objects_per_block;
    40     block = _Objects_Get_index( the_object->id );
    41     block -= _Objects_Get_index( information->minimum_id );
     40    block = _Objects_Get_index( the_object->id ) - OBJECTS_INDEX_MINIMUM;
    4241    block /= objects_per_block;
    4342
  • cpukit/score/src/objectgetlocal.c

    r359a3a3 r3899bc1a  
    3232)
    3333{
    34   uint32_t index;
     34  Objects_Id delta;
     35  Objects_Id maximum_id;
     36  Objects_Id end;
    3537
    36   index = id - information->minimum_id + 1;
     38  maximum_id = information->maximum_id;
     39  delta = maximum_id - id;
     40  end = _Objects_Get_index( maximum_id );
    3741
    38   if ( information->maximum >= index ) {
     42  if ( RTEMS_PREDICT_TRUE( delta < end ) ) {
     43    ISR_Level        level;
    3944    Objects_Control *the_object;
    4045
    41     _ISR_lock_ISR_disable( lock_context );
     46    _ISR_Local_disable( level );
     47    _ISR_lock_Context_set_level( lock_context, level );
    4248
    43     the_object = information->local_table[ index ];
    44     if ( the_object != NULL ) {
     49    the_object =
     50      information->local_table[ end - OBJECTS_INDEX_MINIMUM - delta ];
     51    if ( RTEMS_PREDICT_TRUE( the_object != NULL ) ) {
    4552      /* ISR disabled on behalf of caller */
    4653      return the_object;
    4754    }
    4855
    49     _ISR_lock_ISR_enable( lock_context );
     56    _ISR_Local_enable( level );
    5057  }
    5158
  • cpukit/score/src/objectgetnext.c

    r359a3a3 r3899bc1a  
    3737
    3838    if (_Objects_Get_index(id) == OBJECTS_ID_INITIAL_INDEX)
    39         next_id = information->minimum_id;
     39        next_id = _Objects_Get_minimum_id( information->maximum_id );
    4040    else
    4141        next_id = id;
  • cpukit/score/src/objectgetnoprotection.c

    r359a3a3 r3899bc1a  
    2626)
    2727{
    28   Objects_Control *the_object;
    29   uint32_t         index;
     28  Objects_Id delta;
     29  Objects_Id maximum_id;
     30  Objects_Id end;
    3031
    31   /*
    32    * You can't just extract the index portion or you can get tricked
    33    * by a value between 1 and maximum.
    34    */
    35   index = id - information->minimum_id + 1;
     32  maximum_id = information->maximum_id;
     33  delta = maximum_id - id;
     34  end = _Objects_Get_index( maximum_id );
    3635
    37   if ( information->maximum >= index ) {
    38     if ( (the_object = information->local_table[ index ]) != NULL ) {
    39       return the_object;
    40     }
     36  if ( RTEMS_PREDICT_TRUE( delta < end ) ) {
     37    return information->local_table[ end - OBJECTS_INDEX_MINIMUM - delta ];
    4138  }
    4239
  • cpukit/score/src/objectinitializeinformation.c

    r359a3a3 r3899bc1a  
    3838)
    3939{
    40   static Objects_Control *null_local_table = NULL;
    41   uint32_t                minimum_index;
    42   Objects_Maximum         maximum_per_allocation;
     40  Objects_Maximum maximum_per_allocation;
    4341
    4442  information->the_api            = the_api;
     
    4947  information->object_blocks      = 0;
    5048  information->inactive           = 0;
     49  information->local_table        = NULL;
    5150
    5251  /*
     
    7877   */
    7978  information->objects_per_block = maximum_per_allocation;
    80 
    81   /*
    82    *  Provide a null local table entry for the case of any empty table.
    83    */
    84   information->local_table = &null_local_table;
    85 
    86   /*
    87    *  Calculate minimum and maximum Id's
    88    */
    89   minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
    90   information->minimum_id =
    91     _Objects_Build_id( the_api, the_class, _Objects_Local_node, minimum_index );
    9279
    9380  /*
  • cpukit/score/src/objectnametoid.c

    r359a3a3 r3899bc1a  
    3030  bool                       search_local_node;
    3131  Objects_Control           *the_object;
    32   uint32_t                   index;
     32  Objects_Maximum            index;
    3333#if defined(RTEMS_MULTIPROCESSING)
    3434  Objects_Name               name_for_mp;
     
    5353
    5454  if ( search_local_node ) {
    55     for ( index = 1; index <= information->maximum; index++ ) {
     55    for ( index = 0; index < information->maximum; ++index ) {
    5656      the_object = information->local_table[ index ];
    5757      if ( !the_object )
  • cpukit/score/src/objectnametoidstring.c

    r359a3a3 r3899bc1a  
    5353  }
    5454
    55   for ( index = 1; index <= information->maximum; index++ ) {
     55  for ( index = 0; index < information->maximum; ++index ) {
    5656    Objects_Control *the_object;
    5757
  • cpukit/score/src/objectshrinkinformation.c

    r359a3a3 r3899bc1a  
    2929{
    3030  Objects_Maximum objects_per_block;
    31   Objects_Maximum index_base;
    3231  Objects_Maximum block_count;
    3332  Objects_Maximum block;
     33  Objects_Maximum index_base;
    3434
    3535  _Assert( _Objects_Allocator_is_owner() );
     
    4040
    4141  objects_per_block = information->objects_per_block;
    42   index_base = _Objects_Get_index( information->minimum_id );
    43   block_count = ( information->maximum - index_base ) / objects_per_block;
     42  block_count = information->maximum / objects_per_block;
     43  index_base = 0;
    4444
    4545  for ( block = 0; block < block_count; block++ ) {
     
    4747      Chain_Node       *node;
    4848      const Chain_Node *tail;
    49       uint32_t          index_end;
     49      Objects_Maximum   index_end;
    5050
    5151      node = _Chain_First( &information->Inactive );
     
    5858
    5959        object = (Objects_Control *) node;
    60         index = _Objects_Get_index( object->id );
     60        index = _Objects_Get_index( object->id ) - OBJECTS_INDEX_MINIMUM;
    6161
    6262        /*
  • cpukit/score/src/threaditerate.c

    r359a3a3 r3899bc1a  
    4040    }
    4141
    42     for ( i = 1 ; i <= information->maximum ; ++i ) {
     42    for ( i = 0 ; i < information->maximum ; ++i ) {
    4343      Thread_Control *the_thread;
    4444
  • testsuites/sptests/spconfig02/init.c

    r359a3a3 r3899bc1a  
    1919#include <rtems.h>
    2020#include <rtems/score/objectimpl.h>
     21#include <rtems/sysinit.h>
    2122
    2223#include <tmacros.h>
     
    2627static const rtems_name name = rtems_build_name('N', 'A', 'M', 'E');
    2728
    28 static void test_barrier(void)
     29static void test_barrier_create(void)
    2930{
    3031  rtems_status_code sc;
     
    3536}
    3637
    37 static void test_message_queue(void)
     38static void test_barrier_delete(void)
     39{
     40  rtems_status_code sc;
     41  rtems_id id;
     42
     43  sc = rtems_barrier_delete(0);
     44  rtems_test_assert(sc == RTEMS_INVALID_ID);
     45
     46  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_BARRIERS, 1, 0);
     47  sc = rtems_barrier_delete(id);
     48  rtems_test_assert(sc == RTEMS_INVALID_ID);
     49}
     50
     51static void test_barrier_get(void)
     52{
     53  rtems_status_code sc;
     54  rtems_id id;
     55
     56  sc = rtems_barrier_wait(0, RTEMS_NO_TIMEOUT);
     57  rtems_test_assert(sc == RTEMS_INVALID_ID);
     58
     59  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_BARRIERS, 1, 0);
     60  sc = rtems_barrier_wait(id, RTEMS_NO_TIMEOUT);
     61  rtems_test_assert(sc == RTEMS_INVALID_ID);
     62}
     63
     64static void test_message_queue_create(void)
    3865{
    3966  rtems_status_code sc;
     
    4875  );
    4976  rtems_test_assert(sc == RTEMS_TOO_MANY);
     77}
     78
     79static void test_message_queue_delete(void)
     80{
     81  rtems_status_code sc;
     82  rtems_id id;
    5083
    5184  sc = rtems_message_queue_delete(0);
     
    5790}
    5891
    59 static void test_partition(void)
     92static void test_message_queue_get(void)
     93{
     94  rtems_status_code sc;
     95  rtems_id id;
     96  uint32_t count;
     97
     98  sc = rtems_message_queue_flush(0, &count);
     99  rtems_test_assert(sc == RTEMS_INVALID_ID);
     100
     101  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_MESSAGE_QUEUES, 1, 0);
     102  sc = rtems_message_queue_flush(id, &count);
     103  rtems_test_assert(sc == RTEMS_INVALID_ID);
     104}
     105
     106static void test_partition_create(void)
    60107{
    61108  rtems_status_code sc;
     
    72119  );
    73120  rtems_test_assert(sc == RTEMS_TOO_MANY);
     121}
     122
     123static void test_partition_delete(void)
     124{
     125  rtems_status_code sc;
     126  rtems_id id;
    74127
    75128  sc = rtems_partition_delete(0);
     
    81134}
    82135
    83 static void test_rate_monotonic(void)
     136static void test_partition_get(void)
     137{
     138  rtems_status_code sc;
     139  rtems_id id;
     140
     141  sc = rtems_partition_return_buffer(0, NULL);
     142  rtems_test_assert(sc == RTEMS_INVALID_ID);
     143
     144  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_PARTITIONS, 1, 0);
     145  sc = rtems_partition_return_buffer(id, NULL);
     146  rtems_test_assert(sc == RTEMS_INVALID_ID);
     147}
     148
     149static void test_rate_monotonic_create(void)
    84150{
    85151  rtems_status_code sc;
     
    88154  sc = rtems_rate_monotonic_create(name, &id);
    89155  rtems_test_assert(sc == RTEMS_TOO_MANY);
     156}
     157
     158static void test_rate_monotonic_delete(void)
     159{
     160  rtems_status_code sc;
     161  rtems_id id;
    90162
    91163  sc = rtems_rate_monotonic_delete(0);
     
    97169}
    98170
    99 static void test_region(void)
     171static void test_rate_monotonic_get(void)
     172{
     173  rtems_status_code sc;
     174  rtems_id id;
     175
     176  sc = rtems_rate_monotonic_cancel(0);
     177  rtems_test_assert(sc == RTEMS_INVALID_ID);
     178
     179  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_PERIODS, 1, 0);
     180  sc = rtems_rate_monotonic_cancel(id);
     181  rtems_test_assert(sc == RTEMS_INVALID_ID);
     182}
     183
     184static void test_region_create(void)
    100185{
    101186  rtems_status_code sc;
     
    112197  );
    113198  rtems_test_assert(sc == RTEMS_TOO_MANY);
     199}
     200
     201static void test_region_delete(void)
     202{
     203  rtems_status_code sc;
     204  rtems_id id;
    114205
    115206  sc = rtems_region_delete(0);
     
    121212}
    122213
    123 static void test_semaphore(void)
     214static void test_region_get(void)
     215{
     216  rtems_status_code sc;
     217  rtems_id id;
     218
     219  sc = rtems_region_return_segment(0, NULL);
     220  rtems_test_assert(sc == RTEMS_INVALID_ID);
     221
     222  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_REGIONS, 1, 0);
     223  sc = rtems_region_return_segment(id, NULL);
     224  rtems_test_assert(sc == RTEMS_INVALID_ID);
     225}
     226
     227static void test_semaphore_create(void)
    124228{
    125229  rtems_status_code sc;
     
    134238  );
    135239  rtems_test_assert(sc == RTEMS_TOO_MANY);
     240}
     241
     242static void test_semaphore_delete(void)
     243{
     244  rtems_status_code sc;
     245  rtems_id id;
    136246
    137247  sc = rtems_semaphore_delete(0);
     
    143253}
    144254
    145 static void test_task(void)
     255static void test_semaphore_get(void)
     256{
     257  rtems_status_code sc;
     258  rtems_id id;
     259
     260  sc = rtems_semaphore_release(0);
     261  rtems_test_assert(sc == RTEMS_INVALID_ID);
     262
     263  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_SEMAPHORES, 1, 0);
     264  sc = rtems_semaphore_release(id);
     265  rtems_test_assert(sc == RTEMS_INVALID_ID);
     266}
     267
     268static void test_task_create(void)
    146269{
    147270  rtems_status_code sc;
     
    157280  );
    158281  rtems_test_assert(sc == RTEMS_TOO_MANY);
     282}
     283
     284static void test_task_delete(void)
     285{
     286  rtems_status_code sc;
     287  rtems_id id;
    159288
    160289  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_TASKS, 1, 0);
     
    163292}
    164293
    165 static void test_timer(void)
     294static void test_task_get(void)
     295{
     296  rtems_status_code sc;
     297  rtems_id id;
     298
     299  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_TASKS, 1, 0);
     300  sc = rtems_task_resume(id);
     301  rtems_test_assert(sc == RTEMS_INVALID_ID);
     302}
     303
     304static void test_timer_create(void)
    166305{
    167306  rtems_status_code sc;
     
    170309  sc = rtems_timer_create(name, &id);
    171310  rtems_test_assert(sc == RTEMS_TOO_MANY);
     311}
     312
     313static void test_timer_delete(void)
     314{
     315  rtems_status_code sc;
     316  rtems_id id;
    172317
    173318  sc = rtems_timer_delete(0);
     
    179324}
    180325
    181 static void test_user_extensions(void)
     326static void test_timer_get(void)
     327{
     328  rtems_status_code sc;
     329  rtems_id id;
     330
     331  sc = rtems_timer_reset(0);
     332  rtems_test_assert(sc == RTEMS_INVALID_ID);
     333
     334  id = rtems_build_id(OBJECTS_CLASSIC_API, OBJECTS_RTEMS_TIMERS, 1, 0);
     335  sc = rtems_timer_reset(id);
     336  rtems_test_assert(sc == RTEMS_INVALID_ID);
     337}
     338
     339static void test_user_extensions_create(void)
    182340{
    183341  rtems_status_code sc;
     
    188346  sc = rtems_extension_create(name, &table, &id);
    189347  rtems_test_assert(sc == RTEMS_TOO_MANY);
     348}
     349
     350static void test_user_extensions_delete(void)
     351{
     352  rtems_status_code sc;
     353  rtems_id id;
    190354
    191355  sc = rtems_extension_delete(0);
     
    247411static void Init(rtems_task_argument arg)
    248412{
    249   rtems_print_printer_printk(&rtems_test_printer);
    250   TEST_BEGIN();
    251   test_barrier();
    252   test_message_queue();
    253   test_partition();
    254   test_rate_monotonic();
    255   test_region();
    256   test_semaphore();
    257   test_task();
    258   test_timer();
    259   test_user_extensions();
     413  test_barrier_create();
     414  test_barrier_delete();
     415  test_barrier_get();
     416  test_message_queue_create();
     417  test_message_queue_delete();
     418  test_message_queue_get();
     419  test_partition_create();
     420  test_partition_delete();
     421  test_partition_get();
     422  test_rate_monotonic_create();
     423  test_rate_monotonic_delete();
     424  test_rate_monotonic_get();
     425  test_region_create();
     426  test_region_delete();
     427  test_region_get();
     428  test_semaphore_create();
     429  test_semaphore_delete();
     430  test_semaphore_get();
     431  test_task_create();
     432  test_task_delete();
     433  test_task_get();
     434  test_timer_create();
     435  test_timer_delete();
     436  test_timer_get();
     437  test_user_extensions_create();
     438  test_user_extensions_delete();
    260439  test_some_id_to_name();
    261440  TEST_END();
     
    263442}
    264443
     444static void before_object_information_initialization(void)
     445{
     446  rtems_print_printer_printk(&rtems_test_printer);
     447  TEST_BEGIN();
     448  test_barrier_get();
     449  test_message_queue_get();
     450  test_partition_get();
     451  test_rate_monotonic_get();
     452  test_semaphore_get();
     453  test_task_get();
     454  test_timer_get();
     455}
     456
     457RTEMS_SYSINIT_ITEM(
     458  before_object_information_initialization,
     459  RTEMS_SYSINIT_INITIAL_EXTENSIONS,
     460  RTEMS_SYSINIT_ORDER_LAST
     461);
     462
    265463#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
    266464
Note: See TracChangeset for help on using the changeset viewer.