diff options
Diffstat (limited to 'crypto/openssl/ssl/rio/poll_builder.h')
| -rw-r--r-- | crypto/openssl/ssl/rio/poll_builder.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/crypto/openssl/ssl/rio/poll_builder.h b/crypto/openssl/ssl/rio/poll_builder.h new file mode 100644 index 000000000000..0a03f89df74d --- /dev/null +++ b/crypto/openssl/ssl/rio/poll_builder.h @@ -0,0 +1,79 @@ +/* + * Copyright 2024-2025 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ +#ifndef OSSL_POLL_BUILDER_H +# define OSSL_POLL_BUILDER_H + +# include "poll_method.h" +# include "internal/time.h" + +/* + * RIO_POLL_BUILDER + * ================ + * + * RIO_POLL_BUILDER provides support for immediate-mode polling architectures. + * It abstracts OS-specific immediate-mode polling APIs such as select(2) and + * poll(2) and allows an arbitrarily large number of FDs to be polled for while + * providing minimal overhead (over the OS APIs themselves) for small numbers of + * FDs. + */ +typedef struct rio_poll_builder_st { +# if RIO_POLL_METHOD == RIO_POLL_METHOD_NONE + int unused_dummy; /* make microsoft compiler happy */ +# elif RIO_POLL_METHOD == RIO_POLL_METHOD_SELECT + fd_set rfd, wfd, efd; + int hwm_fd; +# elif RIO_POLL_METHOD == RIO_POLL_METHOD_POLL +# define RIO_NUM_STACK_PFDS 32 + struct pollfd *pfd_heap; + struct pollfd pfds[RIO_NUM_STACK_PFDS]; + size_t pfd_num, pfd_alloc; +# else +# error Unknown RIO poll method +# endif +} RIO_POLL_BUILDER; + +/* + * Initialises a new poll builder. + * + * Returns 1 on success and 0 on failure. + */ +int ossl_rio_poll_builder_init(RIO_POLL_BUILDER *rpb); + +/* + * Tears down a poll builder, freeing any heap allocations (if any) which may + * have been made internally. + */ +void ossl_rio_poll_builder_cleanup(RIO_POLL_BUILDER *rpb); + +/* + * Adds a file descriptor to a poll builder. If want_read is 1, listens for + * readability events (POLLIN). If want_write is 1, listens for writability + * events (POLLOUT). + * + * If this is called with the same fd twice, the result equivalent to calling + * it one time with logically OR'd values of want_read and want_write. + * + * Returns 1 on success and 0 on failure. + */ +int ossl_rio_poll_builder_add_fd(RIO_POLL_BUILDER *rpb, int fd, + int want_read, int want_write); + +/* + * Polls the set of file descriptors added to a poll builder. deadline is a + * deadline time based on the ossl_time_now() clock or ossl_time_infinite() for + * no timeout. Returns 1 on success or 0 on failure. + */ +int ossl_rio_poll_builder_poll(RIO_POLL_BUILDER *rpb, OSSL_TIME deadline); + +/* + * TODO(RIO): No support currently for readout of what was readable/writeable as + * it is currently not needed. + */ + +#endif |
