Changeset 82cb78d8 in rtems for cpukit/score/src/coresem.c


Ignore:
Timestamp:
Nov 2, 1999, 9:45:15 PM (20 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
7cc8d6c
Parents:
93b4e6ef
Message:

Split core message queue and watchdog handler objects into separate files.

File:
1 edited

Legend:

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

    r93b4e6ef r82cb78d8  
    6868  );
    6969}
    70 
    71 /*PAGE
    72  *
    73  *  _CORE_semaphore_Surrender
    74  *
    75  *  Input parameters:
    76  *    the_semaphore            - the semaphore to be flushed
    77  *    id                       - id of parent semaphore
    78  *    api_semaphore_mp_support - api dependent MP support actions
    79  *
    80  *  Output parameters:
    81  *    CORE_SEMAPHORE_STATUS_SUCCESSFUL - if successful
    82  *    core error code                  - if unsuccessful
    83  *
    84  *  Output parameters:
    85  */
    86 
    87 CORE_semaphore_Status _CORE_semaphore_Surrender(
    88   CORE_semaphore_Control                *the_semaphore,
    89   Objects_Id                             id,
    90   CORE_semaphore_API_mp_support_callout  api_semaphore_mp_support
    91 )
    92 {
    93   Thread_Control *the_thread;
    94   ISR_Level       level;
    95   CORE_semaphore_Status status;
    96 
    97   status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
    98 
    99   if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
    100 
    101     if ( !_Objects_Is_local_id( the_thread->Object.id ) )
    102       (*api_semaphore_mp_support) ( the_thread, id );
    103 
    104   } else {
    105     _ISR_Disable( level );
    106       if ( the_semaphore->count <= the_semaphore->Attributes.maximum_count )
    107         the_semaphore->count += 1;
    108       else
    109         status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
    110     _ISR_Enable( level );
    111   }
    112 
    113   return status;
    114 }
    115 
    116 /*PAGE
    117  *
    118  *  _CORE_semaphore_Seize
    119  *
    120  *  This routine attempts to allocate a core semaphore to the calling thread.
    121  *
    122  *  Input parameters:
    123  *    the_semaphore - pointer to semaphore control block
    124  *    id            - id of object to wait on
    125  *    wait          - TRUE if wait is allowed, FALSE otherwise
    126  *    timeout       - number of ticks to wait (0 means forever)
    127  *
    128  *  Output parameters:  NONE
    129  *
    130  *  INTERRUPT LATENCY:
    131  *    available
    132  *    wait
    133  */
    134 
    135 void _CORE_semaphore_Seize(
    136   CORE_semaphore_Control  *the_semaphore,
    137   Objects_Id               id,
    138   boolean                  wait,
    139   Watchdog_Interval        timeout
    140 )
    141 {
    142   Thread_Control *executing;
    143   ISR_Level       level;
    144 
    145   executing = _Thread_Executing;
    146   executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
    147   _ISR_Disable( level );
    148   if ( the_semaphore->count != 0 ) {
    149     the_semaphore->count -= 1;
    150     _ISR_Enable( level );
    151     return;
    152   }
    153 
    154   if ( !wait ) {
    155     _ISR_Enable( level );
    156     executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
    157     return;
    158   }
    159 
    160   _Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
    161   executing->Wait.queue          = &the_semaphore->Wait_queue;
    162   executing->Wait.id             = id;
    163   _ISR_Enable( level );
    164 
    165   _Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
    166 }
    167 
    168 
    169 /*PAGE
    170  *
    171  *  _CORE_semaphore_Flush
    172  *
    173  *  This function a flushes the semaphore's task wait queue.
    174  *
    175  *  Input parameters:
    176  *    the_semaphore          - the semaphore to be flushed
    177  *    remote_extract_callout - function to invoke remotely
    178  *    status                 - status to pass to thread
    179  *
    180  *  Output parameters:  NONE
    181  */
    182  
    183 void _CORE_semaphore_Flush(
    184   CORE_semaphore_Control     *the_semaphore,
    185   Thread_queue_Flush_callout  remote_extract_callout,
    186   unsigned32                  status
    187 )
    188 {
    189  
    190   _Thread_queue_Flush(
    191     &the_semaphore->Wait_queue,
    192     remote_extract_callout,
    193     status
    194   );
    195  
    196 }
Note: See TracChangeset for help on using the changeset viewer.