summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/include/rtems/rtems/asrimpl.h
blob: 38ee35d83aa10533ee91b3c25a0c205905bd2b25 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
 * @file
 *
 * @ingroup ClassicASRImpl
 *
 * @brief Classic ASR Implementation
 */

/* COPYRIGHT (c) 1989-2008.
 * 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.org/license/LICENSE.
 */

#ifndef _RTEMS_RTEMS_ASRIMPL_H
#define _RTEMS_RTEMS_ASRIMPL_H

#include <rtems/rtems/asr.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup ClassicASRImpl Classic ASR Implementation
 *
 * @ingroup ClassicASR
 *
 * @{
 */

/**
 *  @brief ASR_Initialize
 *
 *  This routine initializes the given RTEMS_ASR information record.
 */
RTEMS_INLINE_ROUTINE void _ASR_Initialize (
  ASR_Information *asr
)
{
  asr->is_enabled      = false;
  asr->handler         = NULL;
  asr->mode_set        = RTEMS_DEFAULT_MODES;
  asr->signals_posted  = 0;
  asr->signals_pending = 0;
  asr->nest_level      = 0;
}

RTEMS_INLINE_ROUTINE void _ASR_Create( ASR_Information *asr )
{
  _ISR_lock_Initialize( &asr->Lock, "ASR" );
  _ASR_Initialize( asr );
}

RTEMS_INLINE_ROUTINE void _ASR_Destroy( ASR_Information *asr )
{
  _ISR_lock_Destroy( &asr->Lock );
}

/**
 *  @brief ASR_Swap_signals
 *
 *  This routine atomically swaps the pending and posted signal
 *  sets.  This is done when the thread alters its mode in such a
 *  way that the RTEMS_ASR disable/enable flag changes.
 */
RTEMS_INLINE_ROUTINE void _ASR_Swap_signals (
  ASR_Information *asr
)
{
  rtems_signal_set _signals;
  ISR_lock_Context lock_context;

  _ISR_lock_ISR_disable_and_acquire( &asr->Lock, &lock_context );
    _signals             = asr->signals_pending;
    asr->signals_pending = asr->signals_posted;
    asr->signals_posted  = _signals;
  _ISR_lock_Release_and_ISR_enable( &asr->Lock, &lock_context );
}

/**
 *  @brief ASR_Is_null_handler
 *
 *  This function returns TRUE if the given asr_handler is NULL and
 *  FALSE otherwise.
 */
RTEMS_INLINE_ROUTINE bool _ASR_Is_null_handler (
  rtems_asr_entry asr_handler
)
{
  return asr_handler == NULL;
}

/**
 *  @brief ASR_Are_signals_pending
 *
 *  This function returns TRUE if there are signals pending in the
 *  given RTEMS_ASR information record and FALSE otherwise.
 */
RTEMS_INLINE_ROUTINE bool _ASR_Are_signals_pending (
  ASR_Information *asr
)
{
  return asr->signals_posted != 0;
}

/**
 *  @brief ASR_Post_signals
 *
 *  This routine posts the given signals into the signal_set
 *  passed in.  The result is returned to the user in signal_set.
 *
 *  NOTE:  This must be implemented as a macro.
 */
RTEMS_INLINE_ROUTINE void _ASR_Post_signals(
  ASR_Information  *asr,
  rtems_signal_set  signals,
  rtems_signal_set *signal_set
)
{
  ISR_lock_Context lock_context;

  _ISR_lock_ISR_disable_and_acquire( &asr->Lock, &lock_context );
    *signal_set |= signals;
  _ISR_lock_Release_and_ISR_enable( &asr->Lock, &lock_context );
}

RTEMS_INLINE_ROUTINE rtems_signal_set _ASR_Get_posted_signals(
  ASR_Information *asr
)
{
  rtems_signal_set signal_set;
  ISR_lock_Context lock_context;

  _ISR_lock_ISR_disable_and_acquire( &asr->Lock, &lock_context );
    signal_set = asr->signals_posted;
    asr->signals_posted = 0;
  _ISR_lock_Release_and_ISR_enable( &asr->Lock, &lock_context );

  return signal_set;
}

/**@}*/

#ifdef __cplusplus
}
#endif

#endif
/* end of include file */