| /* Licensed to the Apache Software Foundation (ASF) under one or more | |
| * contributor license agreements. See the NOTICE file distributed with | |
| * this work for additional information regarding copyright ownership. | |
| * The ASF licenses this file to You under the Apache License, Version 2.0 | |
| * (the "License"); you may not use this file except in compliance with | |
| * the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef APR_QUEUE_H | |
| #define APR_QUEUE_H | |
| /** | |
| * @file apr_queue.h | |
| * @brief Thread Safe FIFO bounded queue | |
| * @note Since most implementations of the queue are backed by a condition | |
| * variable implementation, it isn't available on systems without threads. | |
| * Although condition variables are sometimes available without threads. | |
| */ | |
| #include "apu.h" | |
| #include "apr_errno.h" | |
| #include "apr_pools.h" | |
| #include "apr_time.h" | |
| #if APR_HAS_THREADS | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif /* __cplusplus */ | |
| /** | |
| * @defgroup APR_Util_FIFO Thread Safe FIFO bounded queue | |
| * @ingroup APR | |
| * @{ | |
| */ | |
| /** | |
| * opaque structure | |
| */ | |
| typedef struct apr_queue_t apr_queue_t; | |
| /** | |
| * create a FIFO queue | |
| * @param queue The new queue | |
| * @param queue_capacity maximum size of the queue | |
| * @param a pool to allocate queue from | |
| */ | |
| APR_DECLARE(apr_status_t) apr_queue_create(apr_queue_t **queue, | |
| unsigned int queue_capacity, | |
| apr_pool_t *a); | |
| /** | |
| * push/add an object to the queue, blocking if the queue is already full | |
| * | |
| * @param queue the queue | |
| * @param data the data | |
| * @returns APR_EINTR the blocking was interrupted (try again) | |
| * @returns APR_EOF the queue has been terminated | |
| * @returns APR_SUCCESS on a successful push | |
| */ | |
| APR_DECLARE(apr_status_t) apr_queue_push(apr_queue_t *queue, void *data); | |
| /** | |
| * pop/get an object from the queue, blocking if the queue is already empty | |
| * | |
| * @param queue the queue | |
| * @param data the data | |
| * @returns APR_EINTR the blocking was interrupted (try again) | |
| * @returns APR_EOF if the queue has been terminated | |
| * @returns APR_SUCCESS on a successful pop | |
| */ | |
| APR_DECLARE(apr_status_t) apr_queue_pop(apr_queue_t *queue, void **data); | |
| /** | |
| * push/add an object to the queue, returning immediately if the queue is full | |
| * | |
| * @param queue the queue | |
| * @param data the data | |
| * @returns APR_EINTR the blocking operation was interrupted (try again) | |
| * @returns APR_EAGAIN the queue is full | |
| * @returns APR_EOF the queue has been terminated | |
| * @returns APR_SUCCESS on a successful push | |
| */ | |
| APR_DECLARE(apr_status_t) apr_queue_trypush(apr_queue_t *queue, void *data); | |
| /** | |
| * pop/get an object from the queue, returning immediately if the queue is empty | |
| * | |
| * @param queue the queue | |
| * @param data the data | |
| * @returns APR_EINTR the blocking operation was interrupted (try again) | |
| * @returns APR_EAGAIN the queue is empty | |
| * @returns APR_EOF the queue has been terminated | |
| * @returns APR_SUCCESS on a successful pop | |
| */ | |
| APR_DECLARE(apr_status_t) apr_queue_trypop(apr_queue_t *queue, void **data); | |
| /** | |
| * push/add an object to the queue, waiting a maximum of timeout microseconds | |
| * before returning if the queue is empty | |
| * | |
| * @param queue the queue | |
| * @param data the data | |
| * @param timeout the timeout | |
| * @returns APR_EINTR the blocking operation was interrupted (try again) | |
| * @returns APR_EAGAIN the queue is empty and timeout is 0 | |
| * @returns APR_TIMEUP the queue is empty and the timeout expired | |
| * @returns APR_EOF the queue has been terminated | |
| * @returns APR_SUCCESS on a successful pop | |
| */ | |
| APR_DECLARE(apr_status_t) apr_queue_timedpush(apr_queue_t *queue, void *data, | |
| apr_interval_time_t timeout); | |
| /** | |
| * pop/get an object from the queue, waiting a maximum of timeout microseconds | |
| * before returning if the queue is empty | |
| * | |
| * @param queue the queue | |
| * @param data the data | |
| * @param timeout the timeout | |
| * @returns APR_EINTR the blocking operation was interrupted (try again) | |
| * @returns APR_EAGAIN the queue is empty and timeout is 0 | |
| * @returns APR_TIMEUP the queue is empty and the timeout expired | |
| * @returns APR_EOF the queue has been terminated | |
| * @returns APR_SUCCESS on a successful pop | |
| */ | |
| APR_DECLARE(apr_status_t) apr_queue_timedpop(apr_queue_t *queue, void **data, | |
| apr_interval_time_t timeout); | |
| /** | |
| * returns the size of the queue. | |
| * | |
| * @warning this is not threadsafe, and is intended for reporting/monitoring | |
| * of the queue. | |
| * @param queue the queue | |
| * @returns the size of the queue | |
| */ | |
| APR_DECLARE(unsigned int) apr_queue_size(apr_queue_t *queue); | |
| /** | |
| * interrupt all the threads blocking on this queue. | |
| * | |
| * @param queue the queue | |
| */ | |
| APR_DECLARE(apr_status_t) apr_queue_interrupt_all(apr_queue_t *queue); | |
| /** | |
| * terminate the queue, sending an interrupt to all the | |
| * blocking threads | |
| * | |
| * @param queue the queue | |
| */ | |
| APR_DECLARE(apr_status_t) apr_queue_term(apr_queue_t *queue); | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
| /** @} */ | |
| #endif /* APR_HAS_THREADS */ | |
| #endif /* APRQUEUE_H */ |