summaryrefslogblamecommitdiffstats
path: root/cpukit/score/include/rtems/score/smplock.h
blob: a604d7bfe00c882c099637b252681644635bee69 (plain) (tree)

























                                                            

                  









                                                         
                                                       
                                               









                                                                
   
                
                                        


                                   






                                                          
   

                                          










                                                                   
   

                                           







                                                          






















                                                                           

                                            
                                             
                                                               


                                                              
  









                                                                   


                                                                   


                                                          
   


                                          









                         
/**
 *  @file  rtems/score/smplock.h
 *
 *  This include file defines the interface for atomic locks
 *  which can be used in multiprocessor configurations.
 */

/*
 *  COPYRIGHT (c) 1989-2011.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *  http://www.rtems.com/license/LICENSE.
 *
 *  $Id$
 */

#ifndef _RTEMS_LOCK_H
#define _RTEMS_LOCK_H

#include <rtems/score/isr.h>

/**
 *  @defgroup RTEMS Lock Interface
 *
 *  @ingroup Score
 *
 */

/**@{*/

#ifdef __cplusplus
extern "C" {
#endif

/**
 *  This type is used to lock elements for atomic access.
 *  This spinlock is a simple non-nesting spinlock, and
 *  may be used for short non-nesting accesses.
 */
typedef uint32_t SMP_lock_spinlock_simple_Control;

/**
 *  This type is used to lock elements for atomic access.
 *  This spinlock supports nesting, but is slightly more
 *  complicated to use.  Please see the descriptions of
 *  obtain and release prior to using in order to understand
 *  the callers responsibilty of managing short interupt disable
 *  times.
 */
typedef struct {
  SMP_lock_spinlock_simple_Control lock;
  uint32_t  count;
  int       cpu_id;
} SMP_lock_spinlock_nested_Control;

/**
 *  @brief Initialize a Lock
 *
 *  This method is used to initialize the lock at @a lock.
 *
 *  @param [in] lock is the address of the lock to obtain.
 */
void _SMP_lock_spinlock_simple_Initialize(
  SMP_lock_spinlock_simple_Control *lock
);

/**
 *  @brief Obtain a Lock
 *
 *  This method is used to obtain the lock at @a lock.
 *
 *  @param [in] lock is the address of the lock to obtain.
 *
 *  @return This method returns with processor interrupts disabled.
 *          The previous level is returned.
 */
ISR_Level _SMP_lock_spinlock_simple_Obtain(
  SMP_lock_spinlock_simple_Control *lock
);

/**
 *  @brief Release a Lock
 *
 *  This method is used to release the lock at @a lock.
 *
 *  @param [in] lock is the address of the lock to obtain.
 */
void _SMP_lock_spinlock_simple_Release(
  SMP_lock_spinlock_simple_Control  *lock,
  ISR_Level                         level
);

/**
 *  @brief Initialize a Lock
 *
 *  This method is used to initialize the lock at @a lock.
 *
 *  @param [in] lock is the address of the lock to obtain.
 */
void _SMP_lock_spinlock_nested_Initialize(
  SMP_lock_spinlock_nested_Control *lock
);

/**
 *  @brief Obtain a Lock
 *
 *  This method is used to obtain the lock at @a lock.  ISR's are
 *  disabled when this routine returns and it is the callers responsibility
 *  to either:
 *
 *   # Do something very short and then call
 *      _SMP_lock_spinlock_nested_Release  or
 *   # Do something very sort, call isr enable, then when ready
 *      call isr_disable and _SMP_lock_spinlock_nested_Release
 *
 *  @param [in] lock is the address of the lock to obtain.
 *
 *  @return This method returns with processor interrupts disabled.
 *          The previous level is returned.
 */
ISR_Level _SMP_lock_spinlock_nested_Obtain(
  SMP_lock_spinlock_nested_Control *lock
);

/**
 *  @brief Release a Lock
 *
 *  This method is used to release the lock at @a lock.  
 *
 *  @note ISR's are reenabled by this method and are expected to be
 *  disabled upon entry to the method.
 *
 *  @param [in] lock is the address of the lock to obtain.
 */
void _SMP_lock_spinlock_nested_Release(
  SMP_lock_spinlock_nested_Control  *lock,
  ISR_Level                         level
);

#ifdef __cplusplus
}
#endif

/**@}*/

#endif
/* end of include file */