File: ev.h

package info (click to toggle)
libtoxcore 0.2.22-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,992 kB
  • sloc: ansic: 70,235; cpp: 14,770; sh: 1,576; python: 649; makefile: 255; perl: 39
file content (130 lines) | stat: -rw-r--r-- 3,657 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* SPDX-License-Identifier: GPL-3.0-or-later
 * Copyright © 2026 The TokTok team.
 */

#ifndef C_TOXCORE_TOXCORE_EV_H
#define C_TOXCORE_TOXCORE_EV_H

#include <stdbool.h>
#include <stdint.h>

#include "attributes.h"
#include "net.h"  // For Socket

#ifdef __cplusplus
extern "C" {
#endif

typedef struct Ev Ev;

/**
 * @brief Event types to monitor.
 */
typedef uint8_t Ev_Events;

#define EV_READ  (1 << 0)
#define EV_WRITE (1 << 1)
#define EV_ERROR (1 << 2)

/**
 * @brief Result of a triggered event.
 */
typedef struct Ev_Result {
    Socket sock;
    Ev_Events events;
    void *_Nullable data;
} Ev_Result;

/**
 * @brief Add a socket to the monitored set.
 *
 * This is called by `ev_add` to register a socket for event monitoring.
 *
 * @param self Backend-specific state.
 * @param sock The socket to monitor.
 * @param events Bitmask of events to monitor (EV_READ, EV_WRITE).
 * @param data User context pointer to be returned in Ev_Result.
 *
 * @return true on success, false if the socket is already registered or on error.
 */
typedef bool ev_add_cb(void *_Nullable self, Socket sock, Ev_Events events, void *_Nullable data);

/**
 * @brief Modify a registered socket's monitoring parameters.
 *
 * This is called by `ev_mod` to change the events or user data for a socket
 * that is already being monitored.
 *
 * @param self Backend-specific state.
 * @param sock The socket to modify.
 * @param events New bitmask of events to monitor.
 * @param data New user context pointer.
 *
 * @return true on success, false if the socket is not found or on error.
 */
typedef bool ev_mod_cb(void *_Nullable self, Socket sock, Ev_Events events, void *_Nullable data);

/**
 * @brief Remove a socket from the monitored set.
 *
 * This is called by `ev_del` to stop monitoring a socket.
 *
 * @param self Backend-specific state.
 * @param sock The socket to remove.
 *
 * @return true on success, false if the socket is not found.
 */
typedef bool ev_del_cb(void *_Nullable self, Socket sock);

/**
 * @brief Wait for events on registered sockets.
 *
 * This is called by `ev_run`. It blocks until at least one event occurs,
 * the timeout expires, or `ev_break` is called.
 *
 * @param self Backend-specific state.
 * @param results Array to be populated with triggered events.
 * @param max_results Maximum number of results to store in the array.
 * @param timeout_ms Maximum time to wait in milliseconds. 0 for non-blocking,
 *                   -1 for infinite wait.
 *
 * @return Number of events stored in `results`, 0 on timeout, or -1 on error.
 */
typedef int32_t ev_run_cb(void *_Nullable self, Ev_Result results[_Nonnull], uint32_t max_results, int32_t timeout_ms);

/** @brief Cleanup the event loop and free the Ev object. */
typedef void ev_kill_cb(Ev *_Nonnull ev);

/**
 * @brief Virtual function table for Ev.
 */
typedef struct Ev_Funcs {
    ev_add_cb *_Nonnull add_callback;
    ev_mod_cb *_Nonnull mod_callback;
    ev_del_cb *_Nonnull del_callback;
    ev_run_cb *_Nonnull run_callback;
    ev_kill_cb *_Nonnull kill_callback;
} Ev_Funcs;

/**
 * @brief The Event Loop object.
 */
struct Ev {
    const Ev_Funcs *_Nonnull funcs;
    void *_Nullable user_data;
};

/**
 * @brief Wrapper functions.
 */
bool ev_add(Ev *_Nonnull ev, Socket sock, Ev_Events events, void *_Nullable data);
bool ev_mod(Ev *_Nonnull ev, Socket sock, Ev_Events events, void *_Nullable data);
bool ev_del(Ev *_Nonnull ev, Socket sock);
int32_t ev_run(Ev *_Nonnull ev, Ev_Result results[_Nonnull], uint32_t max_results, int32_t timeout_ms);
void ev_kill(Ev *_Nullable ev);

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* C_TOXCORE_TOXCORE_EV_H */