summaryrefslogblamecommitdiffstats
path: root/cpukit/score/macros/rtems/score/priority.inl
blob: 4c5d32b3b33f083b58a5de97687578968e34b1b8 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13












                                                                          
        




                      
                                 





















                                            




                                                                     
                                             
                                          
















                                                                 





















                                             






































                                                                       

                                                                


















                                                  
                                                           
     
                                       


                                                
                                       











                                                    
 

                         
/*  priority.inl
 *
 *  This file contains the macro implementation of all inlined routines
 *  in the Priority Handler.
 *
 *  COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
 *  On-Line Applications Research Corporation (OAR).
 *  All rights assigned to U.S. Government, 1994.
 *
 *  This material may be reproduced by or for the U.S. Government pursuant
 *  to the copyright license under the clause at DFARS 252.227-7013.  This
 *  notice must appear in all copies of this file and its derivatives.
 *
 *  $Id$
 */

#ifndef __PRIORITY_inl
#define __PRIORITY_inl

#include <rtems/score/bitfield.h>

/*PAGE
 *
 *  _Priority_Handler_initialization
 *
 */

#define _Priority_Handler_initialization() \
  { \
    unsigned32 index; \
    \
    _Priority_Major_bit_map = 0; \
    for ( index=0 ; index <16 ; index++ ) \
       _Priority_Bit_map[ index ] = 0; \
  }

/*PAGE
 *
 *  _Priority_Is_valid
 *
 */

  /* 
   *  Since PRIORITY_MINIMUM is 0 and priorities are stored unsigned,
   *  then checking for less than 0 is unnecessary.
   */

#define _Priority_Is_valid( _the_priority ) \
  (  (_the_priority) <= PRIORITY_MAXIMUM )

/*PAGE
 *
 *  _Priority_Major
 *
 */

#define _Priority_Major( _the_priority ) ( (_the_priority) / 16 )

/*PAGE
 *
 *  _Priority_Minor
 *
 */

#define _Priority_Minor( _the_priority ) ( (_the_priority) % 16 )

#if ( CPU_USE_GENERIC_BITFIELD_CODE == TRUE )
 
/*PAGE
 *
 *  _Priority_Mask
 *
 */
 
#define _Priority_Mask( _bit_number ) \
  (0x8000 >> _bit_number)
 
/*PAGE
 *
 *  _Priority_Bits_index
 *
 */
 
#define _Priority_Bits_index( _bit_number ) \
  (_bit_number)
 
#endif
 
/*PAGE
 *
 *  _Priority_Add_to_bit_map
 *
 */

#define _Priority_Add_to_bit_map( _the_priority_map ) \
   { \
     *(_the_priority_map)->minor |= (_the_priority_map)->ready_minor; \
     _Priority_Major_bit_map     |= (_the_priority_map)->ready_major; \
   }

/*PAGE
 *
 *  _Priority_Remove_from_bit_map
 *
 */

#define _Priority_Remove_from_bit_map( _the_priority_map ) \
   { \
     *(_the_priority_map)->minor &= (_the_priority_map)->block_minor; \
     if ( *(_the_priority_map)->minor == 0 ) \
       _Priority_Major_bit_map &= (_the_priority_map)->block_major; \
   }

/*PAGE
 *
 *  _Priority_Get_highest
 *
 */

#define _Priority_Get_highest( _high_priority ) \
  { \
    Priority_Bit_map_control minor; \
    Priority_Bit_map_control major; \
    \
    _Bitfield_Find_first_bit( _Priority_Major_bit_map, major ); \
    _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); \
    \
    (_high_priority) = (_Priority_Bits_index( major ) * 16) +  \
                        _Priority_Bits_index( minor ); \
  }

/*PAGE
 *
 *  _Priority_Initialize_information
 *
 */

#define _Priority_Initialize_information( \
     _the_priority_map, _new_priority ) \
  { \
    Priority_Bit_map_control _major; \
    Priority_Bit_map_control _minor; \
    Priority_Bit_map_control _mask;  \
    \
    _major = _Priority_Major( (_new_priority) ); \
    _minor = _Priority_Minor( (_new_priority) ); \
    \
    (_the_priority_map)->minor =  \
      &_Priority_Bit_map[ _Priority_Bits_index(_major) ]; \
    \
    _mask = _Priority_Mask( _major ); \
    (_the_priority_map)->ready_major = _mask; \
    (_the_priority_map)->block_major = ~_mask; \
    \
    _mask = _Priority_Mask( _minor ); \
    (_the_priority_map)->ready_minor = _mask; \
    (_the_priority_map)->block_minor = ~_mask; \
  }

/*PAGE
 *
 *  _Priority_Is_group_empty
 *
 */

#define _Priority_Is_group_empty ( _the_priority ) \
  ( (_the_priority) == 0 )

#endif
/* end of include file */