aboutsummaryrefslogtreecommitdiff
path: root/include/odp/api/spec/queue.h
blob: 9ce2ac73f4ad111e3b9e0a3500fc0bd85c0e4d3d (plain)
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
/* SPDX-License-Identifier: BSD-3-Clause
 * Copyright (c) 2013-2018 Linaro Limited
 * Copyright (c) 2023 Nokia
 */

/**
 * @file
 *
 * ODP queue
 */

#ifndef ODP_API_SPEC_QUEUE_H_
#define ODP_API_SPEC_QUEUE_H_
#include <odp/visibility_begin.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <odp/api/event_types.h>
#include <odp/api/queue_types.h>
#include <odp/api/std_types.h>

/** @addtogroup odp_queue
 *  Queues for event passing and scheduling.
 *  @{
 */

/**
 * Queue create
 *
 * Create a queue according to the queue parameters. The use of queue name is
 * optional. Unique names are not required. However, odp_queue_lookup() returns
 * only a single matching queue. Use odp_queue_param_init() to initialize
 * parameters into their default values. Default values are also used when
 * 'param' pointer is NULL.
 *
 * @param name    Name of the queue or NULL. Maximum string length is
 *                ODP_QUEUE_NAME_LEN.
 * @param param   Queue parameters. Uses defaults if NULL.
 *
 * @return Queue handle
 * @retval ODP_QUEUE_INVALID on failure
 */
odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param);

/**
 * Create multiple queues
 *
 * Otherwise like odp_queue_create(), but creates multiple queues with a single
 * call. The output queue handles are written in the same order as input
 * parameters. A single odp_queue_create_multi() call is equivalent to calling
 * odp_queue_create() 'num' times in row.
 *
 * If 'share_param' value is false, 'param' array must contain 'num' elements.
 * If the value is true, only a single element is required and it's used as
 * queue parameters for all created queues. If 'name' array is not NULL, the
 * array must contain 'num' elements.
 *
 * @param      name         Array of queue name pointers or NULL. NULL is also
 *                          valid queue name pointer value.
 * @param      param        Array of queue parameters
 * @param      share_param  If true, use same parameters ('param[0]') for all
 *                          queues.
 * @param[out] queue        Array of queue handles for output
 * @param      num          Number of queues to create
 *
 * @return Number of queues actually created (0 ... num)
 * @retval <0 on failure
 */
int odp_queue_create_multi(const char *name[], const odp_queue_param_t param[],
			   odp_bool_t share_param, odp_queue_t queue[],
			   int num);

/**
 * Destroy ODP queue
 *
 * Destroys ODP queue. The queue must be empty and detached from other
 * ODP API (crypto, pktio, classifier, timer, etc). Application must ensure
 * that no other operations on this queue are invoked in parallel. Otherwise
 * behavior is undefined.
 *
 * @param queue    Queue handle
 *
 * @retval 0 on success
 * @retval <0 on failure
 */
int odp_queue_destroy(odp_queue_t queue);

/**
 * Destroy multiple queues
 *
 * Otherwise like odp_queue_destroy(), but destroys multiple queues with a
 * single call.
 *
 * @param queue    Array of queue handles
 * @param num      Number of queues to destroy
 *
 * @retval Number of queues actually destroyed (1 ... num)
 * @retval <0 on failure
 */
int odp_queue_destroy_multi(odp_queue_t queue[], int num);

/**
 * Find a queue by name
 *
 * @param name    Queue name
 *
 * @return Handle of the first matching queue
 * @retval ODP_QUEUE_INVALID on failure
 */
odp_queue_t odp_queue_lookup(const char *name);

/**
 * Query queue capabilities
 *
 * Outputs queue capabilities on success.
 *
 * @param[out] capa   Pointer to capability structure for output
 *
 * @retval 0 on success
 * @retval <0 on failure
 */
int odp_queue_capability(odp_queue_capability_t *capa);

/**
 * Set queue context
 *
 * It is the responsibility of the user to ensure that the queue context
 * is stored in a location accessible by all threads that attempt to
 * access it.
 *
 * @param queue    Queue handle
 * @param context  Address to the queue context
 * @param len      Queue context data length in bytes
 *
 * @retval 0 on success
 * @retval <0 on failure
 */
int odp_queue_context_set(odp_queue_t queue, void *context, uint32_t len);

/**
 * Get queue context
 *
 * Returns previously stored queue context pointer. The context pointer may
 * be set with odp_queue_context_set() or during queue creation
 * (see odp_queue_param_t). The pointer value is set to NULL by default.
 *
 * @param queue    Queue handle
 *
 * @return pointer to the queue context
 * @retval NULL on failure
 *
 * @see odp_queue_context_set(), odp_queue_create()
 */
void *odp_queue_context(odp_queue_t queue);

/**
 * Enqueue an event to a queue
 *
 * Enqueues the event into the queue. The caller loses ownership of the event on
 * a successful call. The event is not enqueued on failure, and the caller
 * maintains ownership of it.
 *
 * When successful, this function acts as a release memory barrier between
 * the sender (the calling thread) and the receiver of the event. The receiver
 * sees correctly the memory stores done by the sender before it enqueued
 * the event.
 *
 * @param queue   Queue handle
 * @param ev      Event handle
 *
 * @retval 0 on success
 * @retval <0 on failure
 */
int odp_queue_enq(odp_queue_t queue, odp_event_t ev);

/**
 * Enqueue multiple events to a queue
 *
 * Like odp_queue_enq(), but enqueues multiple events into the queue. Events are
 * stored into the queue in the order they are in the array. A successful
 * call returns the actual number of events enqueued. If return value is less
 * than 'num', the remaining events at the end of events[] are not enqueued,
 * and the caller maintains ownership of those.
 *
 * @param queue   Queue handle
 * @param events  Array of event handles
 * @param num     Number of events to enqueue
 *
 * @return Number of events actually enqueued (0 ... num)
 * @retval <0 on failure
 */
int odp_queue_enq_multi(odp_queue_t queue, const odp_event_t events[], int num);

/**
 * Dequeue an event from a queue
 *
 * Returns the next event from head of the queue, or ODP_EVENT_INVALID when the
 * queue is empty. Cannot be used for ODP_QUEUE_TYPE_SCHED type queues
 * (use odp_schedule() instead).
 *
 * When successful, this function acts as an acquire memory barrier between
 * the sender and the receiver (the calling thread) of the event. The receiver
 * sees correctly the memory stores done by the sender before it enqueued
 * the event.
 *
 * @param queue   Queue handle
 *
 * @return Event handle
 * @retval ODP_EVENT_INVALID on failure, or when the queue is empty
 */
odp_event_t odp_queue_deq(odp_queue_t queue);

/**
 * Dequeue multiple events from a queue
 *
 * Like odp_queue_deq(), but dequeues multiple events from head of the queue.
 * Cannot be used for ODP_QUEUE_TYPE_SCHED type queues (use odp_schedule_multi()
 * instead). A successful call returns the actual number of events dequeued.
 *
 * @param queue        Queue handle
 * @param[out] events  Array of event handles for output
 * @param num          Maximum number of events to dequeue

 * @return Number of events actually dequeued (0 ... num)
 * @retval <0 on failure
 */
int odp_queue_deq_multi(odp_queue_t queue, odp_event_t events[], int num);

/**
 * Queue type
 *
 * @param queue   Queue handle
 *
 * @return Queue type
 */
odp_queue_type_t odp_queue_type(odp_queue_t queue);

/**
 * Queue schedule type
 *
 * @param queue   Queue handle
 *
 * @return Queue schedule synchronization type
 */
odp_schedule_sync_t odp_queue_sched_type(odp_queue_t queue);

/**
 * Queue priority
 *
 * @note Passing an invalid queue_handle will result in UNDEFINED behavior
 *
 * @param queue   Queue handle
 *
 * @return Queue schedule priority
 */
odp_schedule_prio_t odp_queue_sched_prio(odp_queue_t queue);

/**
 * Queue group
 *
 * @note Passing an invalid queue_handle will result in UNDEFINED behavior
 *
 * @param queue   Queue handle
 *
 * @return Queue schedule group
 */
odp_schedule_group_t odp_queue_sched_group(odp_queue_t queue);

/**
 * Queue lock count
 *
 * Return number of ordered locks associated with this ordered queue.
 * Lock count is defined in odp_schedule_param_t.
 *
 * @param queue   Queue handle
 *
 * @return	Number of ordered locks associated with this ordered queue
 * @retval 0	Specified queue is not ordered or no ordered lock associated
 *		with the ordered queue.
 */
uint32_t odp_queue_lock_count(odp_queue_t queue);

/**
 * Get printable value for an odp_queue_t
 *
 * @param hdl  odp_queue_t handle to be printed
 * @return     uint64_t value that can be used to print/display this
 *             handle
 *
 * @note This routine is intended to be used for diagnostic purposes
 * to enable applications to generate a printable value that represents
 * an odp_queue_t handle.
 */
uint64_t odp_queue_to_u64(odp_queue_t hdl);

/**
 * Initialize queue params
 *
 * Initialize an odp_queue_param_t to its default values for all fields.
 * Also the schedule parameters are set to defaults, although the default queue
 * type is ODP_QUEUE_TYPE_PLAIN.
 *
 * @param param   Address of the odp_queue_param_t to be initialized
 */
void odp_queue_param_init(odp_queue_param_t *param);

/**
 * Retrieve information about a queue
 *
 * Invalid queue handles or handles to free/destroyed queues leads to
 * undefined behaviour. Not intended for fast path use.
 *
 * @param      queue   Queue handle
 * @param[out] info    Queue info pointer for output
 *
 * @retval 0 Success
 * @retval <0 Failure.  Info could not be retrieved.
 */
int odp_queue_info(odp_queue_t queue, odp_queue_info_t *info);

/**
 * Print queue info
 *
 * Print implementation defined information about the specified queue to the ODP
 * log. The information is intended to be used for debugging.
 *
 * @param      queue   Queue handle
 */
void odp_queue_print(odp_queue_t queue);

/**
 * Print debug info about all queues
 *
 * Print implementation defined information about all created queues to the ODP
 * log. The information is intended to be used for debugging.
 */
void odp_queue_print_all(void);

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#include <odp/visibility_end.h>
#endif