xref: /freebsd/crypto/openssl/include/internal/rio_notifier.h (revision e7be843b4a162e68651d3911f0357ed464915629)
1*e7be843bSPierre Pronchery /*
2*e7be843bSPierre Pronchery  * Copyright 2024-2025 The OpenSSL Project Authors. All Rights Reserved.
3*e7be843bSPierre Pronchery  *
4*e7be843bSPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*e7be843bSPierre Pronchery  * this file except in compliance with the License.  You can obtain a copy
6*e7be843bSPierre Pronchery  * in the file LICENSE in the source distribution or at
7*e7be843bSPierre Pronchery  * https://www.openssl.org/source/license.html
8*e7be843bSPierre Pronchery  */
9*e7be843bSPierre Pronchery #ifndef OSSL_RIO_NOTIFIER_H
10*e7be843bSPierre Pronchery # define OSSL_RIO_NOTIFIER_H
11*e7be843bSPierre Pronchery 
12*e7be843bSPierre Pronchery # include "internal/common.h"
13*e7be843bSPierre Pronchery # include "internal/sockets.h"
14*e7be843bSPierre Pronchery 
15*e7be843bSPierre Pronchery /*
16*e7be843bSPierre Pronchery  * Pollable Notifier
17*e7be843bSPierre Pronchery  * =================
18*e7be843bSPierre Pronchery  *
19*e7be843bSPierre Pronchery  * RIO_NOTIFIER provides an OS-pollable resource which can be plugged into an
20*e7be843bSPierre Pronchery  * OS's socket polling APIs to allow socket polling calls to be woken
21*e7be843bSPierre Pronchery  * artificially by other threads.
22*e7be843bSPierre Pronchery  */
23*e7be843bSPierre Pronchery # define RIO_NOTIFIER_METHOD_SOCKET      1
24*e7be843bSPierre Pronchery # define RIO_NOTIFIER_METHOD_SOCKETPAIR  2
25*e7be843bSPierre Pronchery 
26*e7be843bSPierre Pronchery # if !defined(RIO_NOTIFIER_METHOD)
27*e7be843bSPierre Pronchery #  if defined(OPENSSL_SYS_WINDOWS)
28*e7be843bSPierre Pronchery #   define RIO_NOTIFIER_METHOD          RIO_NOTIFIER_METHOD_SOCKET
29*e7be843bSPierre Pronchery #  elif defined(OPENSSL_SYS_UNIX)
30*e7be843bSPierre Pronchery #   define RIO_NOTIFIER_METHOD          RIO_NOTIFIER_METHOD_SOCKETPAIR
31*e7be843bSPierre Pronchery #  else
32*e7be843bSPierre Pronchery #   define RIO_NOTIFIER_METHOD          RIO_NOTIFIER_METHOD_SOCKET
33*e7be843bSPierre Pronchery #  endif
34*e7be843bSPierre Pronchery # endif
35*e7be843bSPierre Pronchery 
36*e7be843bSPierre Pronchery typedef struct rio_notifier_st {
37*e7be843bSPierre Pronchery     int rfd, wfd;
38*e7be843bSPierre Pronchery } RIO_NOTIFIER;
39*e7be843bSPierre Pronchery 
40*e7be843bSPierre Pronchery /*
41*e7be843bSPierre Pronchery  * Initialises a RIO_NOTIFIER. Returns 1 on success or 0 on failure.
42*e7be843bSPierre Pronchery  */
43*e7be843bSPierre Pronchery int ossl_rio_notifier_init(RIO_NOTIFIER *nfy);
44*e7be843bSPierre Pronchery 
45*e7be843bSPierre Pronchery /*
46*e7be843bSPierre Pronchery  * Cleans up a RIO_NOTIFIER, tearing down any allocated resources.
47*e7be843bSPierre Pronchery  */
48*e7be843bSPierre Pronchery void ossl_rio_notifier_cleanup(RIO_NOTIFIER *nfy);
49*e7be843bSPierre Pronchery 
50*e7be843bSPierre Pronchery /*
51*e7be843bSPierre Pronchery  * Signals a RIO_NOTIFIER, waking up any waiting threads.
52*e7be843bSPierre Pronchery  */
53*e7be843bSPierre Pronchery int ossl_rio_notifier_signal(RIO_NOTIFIER *nfy);
54*e7be843bSPierre Pronchery 
55*e7be843bSPierre Pronchery /*
56*e7be843bSPierre Pronchery  * Unsignals a RIO_NOTIFIER.
57*e7be843bSPierre Pronchery  */
58*e7be843bSPierre Pronchery int ossl_rio_notifier_unsignal(RIO_NOTIFIER *nfy);
59*e7be843bSPierre Pronchery 
60*e7be843bSPierre Pronchery /*
61*e7be843bSPierre Pronchery  * Returns an OS socket handle (FD or Win32 SOCKET) which can be polled for
62*e7be843bSPierre Pronchery  * readability to determine when the notifier has been signalled.
63*e7be843bSPierre Pronchery  */
ossl_rio_notifier_as_fd(RIO_NOTIFIER * nfy)64*e7be843bSPierre Pronchery static ossl_inline ossl_unused int ossl_rio_notifier_as_fd(RIO_NOTIFIER *nfy)
65*e7be843bSPierre Pronchery {
66*e7be843bSPierre Pronchery     return nfy->rfd;
67*e7be843bSPierre Pronchery }
68*e7be843bSPierre Pronchery 
69*e7be843bSPierre Pronchery #endif
70