1
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
8
* http://www.apache.org/licenses/LICENSE-2.0
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
23
* @brief Thread Safe FIFO bounded queue
24
* @note Since most implementations of the queue are backed by a condition
25
* variable implementation, it isn't available on systems without threads.
26
* Although condition variables are some times available without threads.
30
#include "apr_errno.h"
31
#include "apr_pools.h"
35
#endif /* __cplusplus */
38
* @defgroup APR_Util_FIFO Thread Safe FIFO bounded queue
46
typedef struct apr_queue_t apr_queue_t;
50
* @param queue The new queue
51
* @param queue_capacity maximum size of the queue
52
* @param a pool to allocate queue from
54
APU_DECLARE(apr_status_t) apr_queue_create(apr_queue_t **queue,
55
unsigned int queue_capacity,
59
* push/add a object to the queue, blocking if the queue is already full
61
* @param queue the queue
62
* @param data the data
63
* @returns APR_EINTR the blocking was interrupted (try again)
64
* @returns APR_EOF the queue has been terminated
65
* @returns APR_SUCCESS on a successfull push
67
APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data);
70
* pop/get an object from the queue, blocking if the queue is already empty
72
* @param queue the queue
73
* @param data the data
74
* @returns APR_EINTR the blocking was interrupted (try again)
75
* @returns APR_EOF if the queue has been terminated
76
* @returns APR_SUCCESS on a successfull pop
78
APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data);
81
* push/add a object to the queue, returning immediatly if the queue is full
83
* @param queue the queue
84
* @param data the data
85
* @returns APR_EINTR the blocking operation was interrupted (try again)
86
* @returns APR_EAGAIN the queue is full
87
* @returns APR_EOF the queue has been terminated
88
* @returns APR_SUCCESS on a successfull push
90
APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data);
93
* pop/get an object to the queue, returning immediatly if the queue is empty
95
* @param queue the queue
96
* @param data the data
97
* @returns APR_EINTR the blocking operation was interrupted (try again)
98
* @returns APR_EAGAIN the queue is empty
99
* @returns APR_EOF the queue has been terminated
100
* @returns APR_SUCCESS on a successfull push
102
APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data);
105
* returns the size of the queue.
107
* @warning this is not threadsafe, and is intended for reporting/monitoring
109
* @param queue the queue
110
* @returns the size of the queue
112
APU_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue);
115
* interrupt all the threads blocking on this queue.
117
* @param queue the queue
119
APU_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue);
122
* terminate all queue, sendinging a interupt to all the
125
* @param queue the queue
127
APU_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue);
135
#endif /* APR_HAS_THREADS */
137
#endif /* APRQUEUE_H */