summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/rtems/eventimpl.h
blob: 4635d76437f734b238781e5a2262743a16cf0a97 (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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/**
 * @file
 *
 * @ingroup ClassicEventImpl
 *
 * @brief This header file provides interfaces used by the event 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_EVENTIMPL_H
#define _RTEMS_RTEMS_EVENTIMPL_H

#include <rtems/rtems/eventdata.h>
#include <rtems/score/thread.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @defgroup ClassicEventImpl Event Implementation
 *
 * @ingroup RTEMSImplClassic
 *
 * @{
 */

/**
 * @brief Seizes a set of events.
 *
 * @param event_in is the input event set.
 *
 * @param option_set is the option set.
 *
 * @param ticks is the optional timeout in clock ticks.
 *
 * @param event_out[out] is the output event set.
 *
 * @param executing[in, out] is the executing thread.
 *
 * @param event[in, out] is the source event set.
 *
 * @param wait_class is the thread wait class of the source event set.
 *
 * @param block_state is the thread blocking state of the source event set.
 *
 * @param lock_context[in, out] is the lock context set up by _Thread_Get().
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 *
 * @retval ::RTEMS_UNSATISFIED The events of interest were not immediately
 *   available.
 *
 * @retval ::RTEMS_TIMEOUT The events of interest were not available within the
 *   specified timeout interval.
 */
rtems_status_code _Event_Seize(
  rtems_event_set    event_in,
  rtems_option       option_set,
  rtems_interval     ticks,
  rtems_event_set   *event_out,
  Thread_Control    *executing,
  Event_Control     *event,
  Thread_Wait_flags  wait_class,
  States_Control     block_state,
  ISR_lock_Context  *lock_context
);

/**
 * @brief Surrenders a set of events.
 *
 * @param the_thread[in, out] is the thread of the event set.
 *
 * @param event_in is the set of events to post.
 *
 * @param event[in, out] is the target event set.
 *
 * @param wait_class is the thread wait class of the target event set.
 *
 * @param lock_context[in, out] is the lock context set up by _Thread_Get().
 *
 * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
 */
rtems_status_code _Event_Surrender(
  Thread_Control    *the_thread,
  rtems_event_set    event_in,
  Event_Control     *event,
  Thread_Wait_flags  wait_class,
  ISR_lock_Context  *lock_context
);

/**
 * @brief Initializes an event control block to have no pending events.
 *
 * @param event is the event control block to initialize.
 */
RTEMS_INLINE_ROUTINE void _Event_Initialize( Event_Control *event )
{
  event->pending_events = 0;
}

/**
 * @brief Checks if the event set is empty.
 *
 * @param the_event_set is the event set to check.
 *
 * @return Returns true, if there are no posted events in the event set,
 *   otherwise false.
 */
RTEMS_INLINE_ROUTINE bool _Event_sets_Is_empty(
  rtems_event_set the_event_set
)
{
  return ( the_event_set == 0 );
}

/**
 * @brief Posts the events in the specified event set.
 *
 * @param the_new_events is the set of events to post.
 *
 * @param the_event_set[in, out] is the event set.
 */
RTEMS_INLINE_ROUTINE void _Event_sets_Post(
  rtems_event_set  the_new_events,
  rtems_event_set *the_event_set
)
{
  *the_event_set |= the_new_events;
}

/**
 * @brief Gets the events of the specified event condition.
 *
 * @param the_event_set is the event set.
 *
 * @param the_event_condition is the event condition defining the events of interest.
 *
 * @return Return the events of the event condition which are posted in the
 *   event set.
 */
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get(
  rtems_event_set the_event_set,
  rtems_event_set the_event_condition
)
{
   return ( the_event_set & the_event_condition );
}

/**
 * @brief Clears a set of events from an event set.
 *
 * @param the_event_set is the event set.
 *
 * @param the_mask is the set of events to clear.
 *
 * @return Returns the event set with all event cleared specified by the event
 *   mask.
 */
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
 rtems_event_set the_event_set,
 rtems_event_set the_mask
)
{
   return ( the_event_set & ~(the_mask) );
}

/**@}*/

#ifdef __cplusplus
}
#endif

#if defined(RTEMS_MULTIPROCESSING)
#include <rtems/rtems/eventmp.h>
#endif

#endif
/* end of include file */