xref: /freebsd/sys/dev/ntsync/ntsyncvar.h (revision 03ca6dbdb80da79408f135d823fbd9a00fd4f25b)
1*03ca6dbdSKonstantin Belousov /*
2*03ca6dbdSKonstantin Belousov  * SPDX-License-Identifier: BSD-2-Clause
3*03ca6dbdSKonstantin Belousov  *
4*03ca6dbdSKonstantin Belousov  * Copyright 2026 The FreeBSD Foundation
5*03ca6dbdSKonstantin Belousov  *
6*03ca6dbdSKonstantin Belousov  * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
7*03ca6dbdSKonstantin Belousov  * under sponsorship from the FreeBSD Foundation.
8*03ca6dbdSKonstantin Belousov  */
9*03ca6dbdSKonstantin Belousov 
10*03ca6dbdSKonstantin Belousov #ifndef __DEV_NTSYNCVAR_H__
11*03ca6dbdSKonstantin Belousov #define	__DEV_NTSYNCVAR_H__
12*03ca6dbdSKonstantin Belousov 
13*03ca6dbdSKonstantin Belousov #include <sys/lock.h>
14*03ca6dbdSKonstantin Belousov #include <sys/mutex.h>
15*03ca6dbdSKonstantin Belousov #include <sys/time.h>
16*03ca6dbdSKonstantin Belousov #include <sys/queue.h>
17*03ca6dbdSKonstantin Belousov #include <dev/ntsync/ntsync.h>
18*03ca6dbdSKonstantin Belousov 
19*03ca6dbdSKonstantin Belousov enum ntsync_obj_type {
20*03ca6dbdSKonstantin Belousov 	NTSYNC_OBJ_SEM,
21*03ca6dbdSKonstantin Belousov 	NTSYNC_OBJ_MUTEX,
22*03ca6dbdSKonstantin Belousov 	NTSYNC_OBJ_EVENT,
23*03ca6dbdSKonstantin Belousov };
24*03ca6dbdSKonstantin Belousov 
25*03ca6dbdSKonstantin Belousov struct ntsync_wait_state;
26*03ca6dbdSKonstantin Belousov 
27*03ca6dbdSKonstantin Belousov struct ntsync_obj_waiter {
28*03ca6dbdSKonstantin Belousov 	struct ntsync_wait_state *state;
29*03ca6dbdSKonstantin Belousov 	TAILQ_ENTRY(ntsync_obj_waiter) link;
30*03ca6dbdSKonstantin Belousov };
31*03ca6dbdSKonstantin Belousov 
32*03ca6dbdSKonstantin Belousov struct ntsync_obj {
33*03ca6dbdSKonstantin Belousov 	enum ntsync_obj_type type;
34*03ca6dbdSKonstantin Belousov 	struct ntsync_priv *owner;
35*03ca6dbdSKonstantin Belousov 	TAILQ_HEAD(, ntsync_obj_waiter) waiters;
36*03ca6dbdSKonstantin Belousov 	/* any */
37*03ca6dbdSKonstantin Belousov 	bool (*is_signaled)(struct ntsync_obj *,
38*03ca6dbdSKonstantin Belousov 	    struct ntsync_wait_state *state, int index);
39*03ca6dbdSKonstantin Belousov 	void (*consume)(struct ntsync_obj *, struct ntsync_wait_state *,
40*03ca6dbdSKonstantin Belousov 	    int index);
41*03ca6dbdSKonstantin Belousov 	/* all */
42*03ca6dbdSKonstantin Belousov 	bool (*prepare)(struct ntsync_obj *, struct ntsync_wait_state *state,
43*03ca6dbdSKonstantin Belousov 	    int index, bool *stop);
44*03ca6dbdSKonstantin Belousov 	void (*commit)(struct ntsync_obj *, struct ntsync_wait_state *state,
45*03ca6dbdSKonstantin Belousov 	    int index);
46*03ca6dbdSKonstantin Belousov 	void (*post_commit)(struct ntsync_obj *,
47*03ca6dbdSKonstantin Belousov 	    struct ntsync_wait_state *state, int index);
48*03ca6dbdSKonstantin Belousov };
49*03ca6dbdSKonstantin Belousov 
50*03ca6dbdSKonstantin Belousov struct ntsync_obj_sem {
51*03ca6dbdSKonstantin Belousov 	struct ntsync_obj obj;
52*03ca6dbdSKonstantin Belousov 	struct ntsync_sem_args a;
53*03ca6dbdSKonstantin Belousov 	struct ntsync_sem_args a1;
54*03ca6dbdSKonstantin Belousov };
55*03ca6dbdSKonstantin Belousov #define	OBJ_TO_SEM(obj)		__containerof(obj, struct ntsync_obj_sem, obj)
56*03ca6dbdSKonstantin Belousov 
57*03ca6dbdSKonstantin Belousov struct ntsync_obj_mutex {
58*03ca6dbdSKonstantin Belousov 	struct ntsync_obj obj;
59*03ca6dbdSKonstantin Belousov 	struct ntsync_mutex_args a;
60*03ca6dbdSKonstantin Belousov 	struct ntsync_mutex_args a1;
61*03ca6dbdSKonstantin Belousov 	bool abandoned;
62*03ca6dbdSKonstantin Belousov };
63*03ca6dbdSKonstantin Belousov #define	OBJ_TO_MUTEX(obj)	__containerof(obj, struct ntsync_obj_mutex, obj)
64*03ca6dbdSKonstantin Belousov 
65*03ca6dbdSKonstantin Belousov struct ntsync_obj_event {
66*03ca6dbdSKonstantin Belousov 	struct ntsync_obj obj;
67*03ca6dbdSKonstantin Belousov 	struct ntsync_event_args a;
68*03ca6dbdSKonstantin Belousov 	struct ntsync_event_args a1;
69*03ca6dbdSKonstantin Belousov 	bool pulse;
70*03ca6dbdSKonstantin Belousov };
71*03ca6dbdSKonstantin Belousov #define	OBJ_TO_EVENT(obj)	__containerof(obj, struct ntsync_obj_event, obj)
72*03ca6dbdSKonstantin Belousov 
73*03ca6dbdSKonstantin Belousov struct ntsync_wait_state {
74*03ca6dbdSKonstantin Belousov 	struct ntsync_wait_args *nwa;
75*03ca6dbdSKonstantin Belousov 	struct ntsync_priv *owner;
76*03ca6dbdSKonstantin Belousov 	struct ntsync_obj_waiter waiters[NTSYNC_MAX_WAIT_COUNT + 1];
77*03ca6dbdSKonstantin Belousov 	int fds[NTSYNC_MAX_WAIT_COUNT];
78*03ca6dbdSKonstantin Belousov 	struct file *fps[NTSYNC_MAX_WAIT_COUNT];
79*03ca6dbdSKonstantin Belousov 	struct file *fp_alert;
80*03ca6dbdSKonstantin Belousov 	int obj_count;
81*03ca6dbdSKonstantin Belousov 	struct ntsync_obj *objs[NTSYNC_MAX_WAIT_COUNT + 1];
82*03ca6dbdSKonstantin Belousov 	struct ntsync_obj_event *alert_event;
83*03ca6dbdSKonstantin Belousov 	sbintime_t sb;
84*03ca6dbdSKonstantin Belousov 	int error;
85*03ca6dbdSKonstantin Belousov 	int index;
86*03ca6dbdSKonstantin Belousov 	bool any;
87*03ca6dbdSKonstantin Belousov 	bool all;
88*03ca6dbdSKonstantin Belousov 	bool ready;
89*03ca6dbdSKonstantin Belousov };
90*03ca6dbdSKonstantin Belousov 
91*03ca6dbdSKonstantin Belousov struct ntsync_priv {
92*03ca6dbdSKonstantin Belousov 	struct mtx lock;
93*03ca6dbdSKonstantin Belousov 	unsigned objs_cnt;
94*03ca6dbdSKonstantin Belousov 	bool closed;
95*03ca6dbdSKonstantin Belousov };
96*03ca6dbdSKonstantin Belousov 
97*03ca6dbdSKonstantin Belousov #define	NTSYNC_PRIV_LOCK(priv)		mtx_lock(&priv->lock)
98*03ca6dbdSKonstantin Belousov #define	NTSYNC_PRIV_UNLOCK(priv)	mtx_unlock(&priv->lock)
99*03ca6dbdSKonstantin Belousov #define	NTSYNC_PRIV_ASSERT(priv)	mtx_assert(&priv->lock, MA_OWNED)
100*03ca6dbdSKonstantin Belousov 
101*03ca6dbdSKonstantin Belousov extern struct cdevsw ntsync_cdevsw;
102*03ca6dbdSKonstantin Belousov 
103*03ca6dbdSKonstantin Belousov struct file;
104*03ca6dbdSKonstantin Belousov struct thread;
105*03ca6dbdSKonstantin Belousov int ntsync_sem_release(struct thread *td, struct file *fp, uint32_t *val);
106*03ca6dbdSKonstantin Belousov int ntsync_sem_read(struct thread *td, struct file *fp,
107*03ca6dbdSKonstantin Belousov     struct ntsync_sem_args *a);
108*03ca6dbdSKonstantin Belousov int ntsync_mutex_unlock(struct thread *td, struct file *fp,
109*03ca6dbdSKonstantin Belousov     struct ntsync_mutex_args *a);
110*03ca6dbdSKonstantin Belousov int ntsync_mutex_kill(struct thread *td, struct file *fp, uint32_t val);
111*03ca6dbdSKonstantin Belousov int ntsync_mutex_read(struct thread *td, struct file *fp,
112*03ca6dbdSKonstantin Belousov     struct ntsync_mutex_args *a, bool *doco);
113*03ca6dbdSKonstantin Belousov int ntsync_event_set(struct thread *td, struct file *fp, uint32_t *val);
114*03ca6dbdSKonstantin Belousov int ntsync_event_reset(struct thread *td, struct file *fp, uint32_t *val);
115*03ca6dbdSKonstantin Belousov int ntsync_event_pulse(struct thread *td, struct file *fp, uint32_t *val);
116*03ca6dbdSKonstantin Belousov int ntsync_event_read(struct thread *td, struct file *fp,
117*03ca6dbdSKonstantin Belousov     struct ntsync_event_args *a);
118*03ca6dbdSKonstantin Belousov 
119*03ca6dbdSKonstantin Belousov #endif
120