xref: /openbsd/regress/sys/net/rtable/srp_compat.h (revision 61306f30)
18ceda520Smpi 
28ceda520Smpi #ifndef _SRP_COMPAT_H_
38ceda520Smpi #define _SRP_COMPAT_H_
48ceda520Smpi 
58ceda520Smpi #include <sys/srp.h>
68ceda520Smpi #include <sys/queue.h>
78ceda520Smpi 
88ceda520Smpi /*
97df47212Smpi  * SRP glue.
108ceda520Smpi  */
118ceda520Smpi 
127df47212Smpi #define srp_follow(_sr, _s)		((_s)->ref)
137df47212Smpi #define srp_leave(_sr)			do { } while (0)
147df47212Smpi #define srp_swap(_srp, _v)		srp_swap_locked((_srp), (_v))
157df47212Smpi #define srp_update(_gc, _srp, _v)	srp_update_locked((_gc), (_srp), (_v))
167df47212Smpi #define srp_finalize(_v, _wchan)	((void)0)
177df47212Smpi 
188ceda520Smpi #define srp_get_locked(_s)		((_s)->ref)
197df47212Smpi 
207df47212Smpi static inline void *
srp_enter(struct srp_ref * _sr,struct srp * _s)21eb899f7fSmpi srp_enter(struct srp_ref *_sr, struct srp *_s)
22eb899f7fSmpi {
23eb899f7fSmpi 	return (_s->ref);
24eb899f7fSmpi }
25eb899f7fSmpi 
26eb899f7fSmpi static inline void *
srp_swap_locked(struct srp * srp,void * nv)277df47212Smpi srp_swap_locked(struct srp *srp, void *nv)
287df47212Smpi {
297df47212Smpi 	void *ov;
307df47212Smpi 
317df47212Smpi 	ov = srp->ref;
327df47212Smpi 	srp->ref = nv;
337df47212Smpi 
347df47212Smpi 	return (ov);
357df47212Smpi }
368ceda520Smpi 
378ceda520Smpi #define srp_update_locked(_gc, _s, _v) do {				\
388ceda520Smpi 	void *ov;							\
398ceda520Smpi 									\
407df47212Smpi 	ov = srp_swap_locked(_s, _v);					\
41b2ef63beSmpi 									\
428ceda520Smpi 	if (ov != NULL)							\
43b2ef63beSmpi 		((_gc)->srp_gc_dtor)((_gc)->srp_gc_cookie, ov);		\
448ceda520Smpi } while (0)
458ceda520Smpi 
467df47212Smpi /*
477df47212Smpi  * SRPL glue.
487df47212Smpi  */
497df47212Smpi 
508ceda520Smpi #define SRPL_INIT(_sl)			SLIST_INIT(_sl)
51*61306f30Svisa #undef SRPL_HEAD
528ceda520Smpi #define SRPL_HEAD(name, entry)		SLIST_HEAD(name, entry)
53*61306f30Svisa #undef SRPL_ENTRY
548ceda520Smpi #define SRPL_ENTRY(type)		SLIST_ENTRY(type)
558ceda520Smpi 
56c0cc5413Smpi #define SRPL_FIRST(_sr, _sl)		SLIST_FIRST(_sl);
57b2ef63beSmpi #define SRPL_NEXT(_sr, _e, _ENTRY)	SLIST_NEXT(_e, _ENTRY)
58c0cc5413Smpi #define SRPL_FOLLOW(_sr, _e, _ENTRY)	SLIST_NEXT(_e, _ENTRY)
59b2ef63beSmpi #define SRPL_LEAVE(_sr)			((void)_sr)
608ceda520Smpi 
617df47212Smpi #define SRPL_FOREACH(_c, _srp, _sl, _ENTRY)				\
627df47212Smpi 		SLIST_FOREACH(_c, _sl, _ENTRY)
637df47212Smpi 
64eb899f7fSmpi 
65b2ef63beSmpi #define SRPL_EMPTY_LOCKED(_sl)		SLIST_EMPTY(_sl)
66eb899f7fSmpi #define SRPL_FIRST_LOCKED(_sl)		SLIST_FIRST(_sl)
67eb899f7fSmpi #define SRPL_NEXT_LOCKED(_e, _ENTRY)	SLIST_NEXT(_e, _ENTRY)
68eb899f7fSmpi 
69eb899f7fSmpi #define SRPL_FOREACH_LOCKED(_c, _sl, _ENTRY)				\
70eb899f7fSmpi 		SLIST_FOREACH(_c, _sl, _ENTRY)
71eb899f7fSmpi 
728ceda520Smpi #define SRPL_FOREACH_SAFE_LOCKED(_c, _sl, _ENTRY, _tc)			\
738ceda520Smpi 		SLIST_FOREACH_SAFE(_c, _sl, _ENTRY, _tc)
74b2ef63beSmpi 
758ceda520Smpi #define SRPL_INSERT_HEAD_LOCKED(_rc, _sl, _e, _ENTRY)			\
76b2ef63beSmpi 	do {								\
77b2ef63beSmpi 		(_rc)->srpl_ref((_rc)->srpl_cookie, _e);		\
78b2ef63beSmpi 		SLIST_INSERT_HEAD(_sl, _e, _ENTRY);			\
79b2ef63beSmpi 	} while (0)
80b2ef63beSmpi 
81eb899f7fSmpi #define SRPL_INSERT_AFTER_LOCKED(_rc, _se, _e, _ENTRY)			\
82eb899f7fSmpi 	do {								\
83eb899f7fSmpi 		(_rc)->srpl_ref((_rc)->srpl_cookie, _e);		\
84eb899f7fSmpi 		SLIST_INSERT_AFTER(_se, _e, _ENTRY);			\
85eb899f7fSmpi 	} while (0)
86eb899f7fSmpi 
87b2ef63beSmpi #define SRPL_REMOVE_LOCKED(_rc, _sl, _e, _type, _ENTRY)			\
88b2ef63beSmpi 	do {								\
89b2ef63beSmpi 		SLIST_REMOVE(_sl, _e, _type, _ENTRY);			\
90b2ef63beSmpi 		((_rc)->srpl_gc.srp_gc_dtor)((_rc)->srpl_gc.srp_gc_cookie, _e);\
91b2ef63beSmpi 	} while (0)
928ceda520Smpi 
938ceda520Smpi #endif /* _SRP_COMPAT_H_ */
94