#ifndef HEADER_CURL_THRDQUEUE_H #define HEADER_CURL_THRDQUEUE_H /*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at https://curl.se/docs/copyright.html. * * You may opt to use, copy, modify, merge, publish, distribute and/or sell * copies of the Software, and permit persons to whom the Software is * furnished to do so, under the terms of the COPYING file. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * * SPDX-License-Identifier: curl * ***************************************************************************/ #include "curl_setup.h" #include "curlx/timediff.h" #ifdef USE_THREADS struct Curl_easy; struct curl_thrdq; typedef enum { CURL_THRDQ_EV_ITEM_DONE /* an item has been processed and is ready */ } Curl_thrdq_event; /* Notification callback when "events" happen in the queue. May be * call from any thread, queue is not locked. */ typedef void Curl_thrdq_ev_cb(const struct curl_thrdq *tqueue, Curl_thrdq_event ev, void *user_data); /* Process a queued item. Maybe call from any thread. Queue is * not locked. */ typedef void Curl_thrdq_item_process_cb(void *item); /* Free an item. May be called from any thread at any time for an * item that is in the queue (either before or after processing). */ typedef void Curl_thrdq_item_free_cb(void *item); /* Create a new queue processing "items" by a thread pool. */ CURLcode Curl_thrdq_create(struct curl_thrdq **ptqueue, const char *name, uint32_t max_len, /* 0 for unlimited */ uint32_t min_threads, uint32_t max_threads, uint32_t idle_time_ms, Curl_thrdq_item_free_cb *fn_free, Curl_thrdq_item_process_cb *fn_process, Curl_thrdq_ev_cb *fn_event, /* optional */ void *user_data); /* Destroy the queue, free all queued items unprocessed and destroy * the thread pool used. * @param join TRUE when thread pool shall be joined. FALSE for * detaching any running threads. */ void Curl_thrdq_destroy(struct curl_thrdq *tqueue, bool join); /* Send "item" onto the queue. The caller needs to clear any reference * to "item" on success, e.g. the queue takes ownership. * `description` is an optional string describing the item for tracing * purposes. It needs to have the same lifetime as `item`. * Returns CURLE_AGAIN when the queue has already been full. * * With`timeout_ms` != 0, items that get stuck that long in the send * queue are removed and added to the receive queue right away. */ CURLcode Curl_thrdq_send(struct curl_thrdq *tqueue, void *item, const char *description, timediff_t timeout_ms); /* Receive the oldest, processed item from the queue again, if there is one. * The caller takes ownership of the item received, e.g. the queue * relinquishes all references to item. * Returns CURLE_AGAIN when there is no processed item, setting `pitem` * to NULL. */ CURLcode Curl_thrdq_recv(struct curl_thrdq *tqueue, void **pitem); /* Return TRUE if the passed "item" matches. */ typedef bool Curl_thrdq_item_match_cb(void *item, void *match_data); /* Clear all scheduled/processed items that match from the queue. This * will *not* be able to clear items that are being processed. */ void Curl_thrdq_clear(struct curl_thrdq *tqueue, Curl_thrdq_item_match_cb *fn_match, void *match_data); CURLcode Curl_thrdq_await_done(struct curl_thrdq *tqueue, uint32_t timeout_ms); CURLcode Curl_thrdq_set_props(struct curl_thrdq *tqueue, uint32_t max_len, /* 0 for unlimited */ uint32_t min_threads, uint32_t max_threads, uint32_t idle_time_ms); #ifdef CURLVERBOSE void Curl_thrdq_trace(struct curl_thrdq *tqueue, struct Curl_easy *data); #endif #endif /* USE_THREADS */ #endif /* HEADER_CURL_THRDQUEUE_H */