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.
22
* @brief Thread Safe FIFO bounded queue
23
* @note Since most implementations of the queue are backed by a condition
24
* variable implementation, it isn't available on systems without threads.
25
* Although condition variables are some times available without threads.
29
#include "apr_errno.h"
30
#include "apr_pools.h"
36
#endif /* __cplusplus */
39
* @defgroup APR_Util_FIFO Thread Safe FIFO bounded queue
47
typedef struct apr_queue_t apr_queue_t;
51
* @param queue The new queue
52
* @param queue_capacity maximum size of the queue
53
* @param a pool to allocate queue from
55
APU_DECLARE(apr_status_t) apr_queue_create(apr_queue_t **queue,
56
unsigned int queue_capacity,
60
* push/add a object to the queue, blocking if the queue is already full
62
* @param queue the queue
63
* @param data the data
64
* @returns APR_EINTR the blocking was interrupted (try again)
65
* @returns APR_EOF the queue has been terminated
66
* @returns APR_SUCCESS on a successfull push
68
APU_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data);
71
* pop/get an object from the queue, blocking if the queue is already empty
73
* @param queue the queue
74
* @param data the data
75
* @returns APR_EINTR the blocking was interrupted (try again)
76
* @returns APR_EOF if the queue has been terminated
77
* @returns APR_SUCCESS on a successfull pop
79
APU_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data);
82
* push/add a object to the queue, returning immediatly if the queue is full
84
* @param queue the queue
85
* @param data the data
86
* @returns APR_EINTR the blocking operation was interrupted (try again)
87
* @returns APR_EAGAIN the queue is full
88
* @returns APR_EOF the queue has been terminated
89
* @returns APR_SUCCESS on a successfull push
91
APU_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data);
94
* pop/get an object to the queue, returning immediatly if the queue is empty
96
* @param queue the queue
97
* @param data the data
98
* @returns APR_EINTR the blocking operation was interrupted (try again)
99
* @returns APR_EAGAIN the queue is empty
100
* @returns APR_EOF the queue has been terminated
101
* @returns APR_SUCCESS on a successfull push
103
APU_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data);
106
* returns the size of the queue.
108
* @warning this is not threadsafe, and is intended for reporting/monitoring
110
* @param queue the queue
111
* @returns the size of the queue
113
APU_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue);
116
* interrupt all the threads blocking on this queue.
118
* @param queue the queue
120
APU_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue);
123
* terminate all queue, sendinging a interupt to all the
126
* @param queue the queue
128
APU_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue);
136
#endif /* APR_HAS_THREADS */
138
#endif /* APRQUEUE_H */