]> git.proxmox.com Git - mirror_corosync-qdevice.git/blame - qdevices/pr-poll-loop.h
pr-poll-loop: Add pre poll callbacks
[mirror_corosync-qdevice.git] / qdevices / pr-poll-loop.h
CommitLineData
108c5e8e
JF
1/*
2 * Copyright (c) 2015-2020 Red Hat, Inc.
3 *
4 * All rights reserved.
5 *
6 * Author: Jan Friesse (jfriesse@redhat.com)
7 *
8 * This software licensed under BSD license, the text of which follows:
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions are met:
12 *
13 * - Redistributions of source code must retain the above copyright notice,
14 * this list of conditions and the following disclaimer.
15 * - Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
18 * - Neither the name of the Red Hat, Inc. nor the names of its
19 * contributors may be used to endorse or promote products derived from this
20 * software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32 * THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#ifndef _PR_POLL_LOOP_H_
36#define _PR_POLL_LOOP_H_
37
38#include <sys/types.h>
39#include <inttypes.h>
40
41#include <nspr.h>
42#include <poll.h>
43
44#include "pr-poll-array.h"
45#include "timer-list.h"
46
47#ifdef __cplusplus
48extern "C" {
49#endif
50
51/*
52 * Return code: 0 - Ok, -1 - Don't add client, -2 - Return poll error
53 */
54typedef int (*pr_poll_loop_fd_set_events_cb_fn)(int fd, short *events,
55 void *user_data1, void *user_data2);
56typedef int (*pr_poll_loop_prfd_set_events_cb_fn)(PRFileDesc *prfd, short *events,
57 void *user_data1, void *user_data2);
58
59/*
60 * Return code: 0 - Ok, -1 - Return error
61 */
62typedef int (*pr_poll_loop_fd_read_cb_fn)(int fd, void *user_data1, void *user_data2);
01a63aae
JF
63typedef int (*pr_poll_loop_prfd_read_cb_fn)(PRFileDesc *prfd, const PRPollDesc *pd,
64 void *user_data1, void *user_data2);
108c5e8e
JF
65
66/*
67 * Return code: 0 - Ok, -1 - Return error
68 */
69typedef int (*pr_poll_loop_fd_write_cb_fn)(int fd, void *user_data1, void *user_data2);
01a63aae
JF
70typedef int (*pr_poll_loop_prfd_write_cb_fn)(PRFileDesc *prfd,
71 const PRPollDesc *pd, void *user_data1, void *user_data2);
108c5e8e
JF
72
73/*
74 * Return code: 0 - Ok, -1 - Return error
75 */
76typedef int (*pr_poll_loop_fd_err_cb_fn)(int fd, short revents, void *user_data1, void *user_data2);
01a63aae
JF
77typedef int (*pr_poll_loop_prfd_err_cb_fn)(PRFileDesc *prfd, short revents, const PRPollDesc *pd,
78 void *user_data1, void *user_data2);
108c5e8e 79
ea6d7a90
JF
80/*
81 * Return code: 0 - Ok, -1 - Return error
82 */
83typedef int (*pr_poll_loop_pre_poll_cb_fn)(void *user_data1, void *user_data2);
84
108c5e8e
JF
85struct pr_poll_loop_fd_entry {
86 int fd;
87 PRFileDesc *prfd;
88 short events;
89 pr_poll_loop_fd_set_events_cb_fn fd_set_events_cb;
90 pr_poll_loop_prfd_set_events_cb_fn prfd_set_events_cb;
91 pr_poll_loop_fd_read_cb_fn fd_read_cb;
92 pr_poll_loop_prfd_read_cb_fn prfd_read_cb;
93 pr_poll_loop_fd_write_cb_fn fd_write_cb;
94 pr_poll_loop_prfd_write_cb_fn prfd_write_cb;
95 pr_poll_loop_fd_err_cb_fn fd_err_cb;
96 pr_poll_loop_prfd_err_cb_fn prfd_err_cb;
97 void *user_data1;
98 void *user_data2;
99 TAILQ_ENTRY(pr_poll_loop_fd_entry) entries;
100};
101
ea6d7a90
JF
102struct pr_poll_loop_pre_poll_cb_entry {
103 pr_poll_loop_pre_poll_cb_fn pre_poll_cb;
104 void *user_data1;
105 void *user_data2;
106 TAILQ_ENTRY(pr_poll_loop_pre_poll_cb_entry) entries;
107};
108
108c5e8e
JF
109struct pr_poll_loop {
110 TAILQ_HEAD(, pr_poll_loop_fd_entry) fd_list;
ea6d7a90 111 TAILQ_HEAD(, pr_poll_loop_pre_poll_cb_entry) pre_poll_cb_list;
108c5e8e
JF
112 struct timer_list tlist;
113 struct pr_poll_array poll_array;
114};
115
116extern void pr_poll_loop_init(struct pr_poll_loop *poll_loop);
117
118extern int pr_poll_loop_add_fd(struct pr_poll_loop *poll_loop, int fd,
119 short events, pr_poll_loop_fd_set_events_cb_fn fd_set_events_cb,
120 pr_poll_loop_fd_read_cb_fn fd_read_cb,
121 pr_poll_loop_fd_read_cb_fn fd_write_cb,
122 pr_poll_loop_fd_err_cb_fn fd_err_cb,
123 void *user_data1, void *user_data2);
124
ea6d7a90
JF
125extern int pr_poll_loop_add_pre_poll_cb(struct pr_poll_loop *poll_loop,
126 pr_poll_loop_pre_poll_cb_fn pre_poll_cb,
127 void *user_data1, void *user_data2);
128
108c5e8e
JF
129extern int pr_poll_loop_add_prfd(struct pr_poll_loop *poll_loop,
130 PRFileDesc *prfd, short events,
131 pr_poll_loop_prfd_set_events_cb_fn prfd_set_events_cb,
132 pr_poll_loop_prfd_read_cb_fn fd_read_cb,
133 pr_poll_loop_prfd_read_cb_fn fd_write_cb,
134 pr_poll_loop_prfd_err_cb_fn fd_err_cb,
135 void *user_data1, void *user_data2);
136
137extern int pr_poll_loop_del_fd(struct pr_poll_loop *poll_loop, int fd);
138
ea6d7a90
JF
139extern int pr_poll_loop_del_pre_poll_cb(struct pr_poll_loop *poll_loop,
140 pr_poll_loop_pre_poll_cb_fn pre_poll_cb);
141
108c5e8e
JF
142extern int pr_poll_loop_del_prfd(struct pr_poll_loop *poll_loop,
143 PRFileDesc *prfd);
144
145/*
146 * Return codes:
147 * 0 - No error and all callbacks returned 0
148 * -1 - Either set_events returned -2 or some other callbacks returned -1
149 * -2 - Other error (events is not POLLIN|POLLOUT, or set_events cb was not 0, -1 or -2)
c1910888 150 * -3 - PR_Poll returned -1
108c5e8e
JF
151 */
152extern int pr_poll_loop_exec(struct pr_poll_loop *poll_loop);
153
154extern int pr_poll_loop_destroy(struct pr_poll_loop *poll_loop);
155
156extern struct timer_list *pr_poll_loop_get_timer_list(struct pr_poll_loop *poll_loop);
157
158#ifdef __cplusplus
159}
160#endif
161
162#endif /* _PR_POLL_LOOP_H_ */