On 11/09/19 21:06, Dr. David Alan Gilbert (git) wrote: > From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> > > RCU_READ_LOCK_AUTO takes the rcu_read_lock and then uses glib's > g_auto infrastructure (and thus whatever the compiler's hooks are) to > release it on all exits of the block. > > Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> > --- > include/qemu/rcu.h | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/include/qemu/rcu.h b/include/qemu/rcu.h > index 22876d1428..8768a7b60a 100644 > --- a/include/qemu/rcu.h > +++ b/include/qemu/rcu.h > @@ -154,6 +154,24 @@ extern void call_rcu1(struct rcu_head *head, RCUCBFunc > *func); > }), \ > (RCUCBFunc *)g_free); > > +typedef void RCUReadAuto; > +static inline RCUReadAuto *rcu_read_auto_lock(void) > +{ > + rcu_read_lock(); > + /* Anything non-NULL causes the cleanup function to be called */ > + return (void *)0x1;
Doesn't this cause a warning (should be "(void *)(uintptr_t)1" instead)? > +} > + > +static inline void rcu_read_auto_unlock(RCUReadAuto *r) > +{ > + rcu_read_unlock(); > +} > + > +G_DEFINE_AUTOPTR_CLEANUP_FUNC(RCUReadAuto, rcu_read_auto_unlock) > + > +#define RCU_READ_LOCK_AUTO \ > + g_autoptr(RCUReadAuto) _rcu_read_auto = rcu_read_auto_lock() > + > #ifdef __cplusplus > } > #endif > Is it possible to make this a scope, like WITH_RCU_READ_LOCK() { } ? Perhaps something like #define WITH_RCU_READ_LOCK() \ WITH_RCU_READ_LOCK_(_rcu_read_auto##__COUNTER__) #define WITH_RCU_READ_LOCK_(var) \ for (g_autoptr(RCUReadAuto) var = rcu_read_auto_lock(); (var); rcu_read_auto_unlock(), (var) = NULL) where the dummy variable doubles as an execute-once guard and the gauto cleanup is still used in case of a "break". I'm not sure if the above raises a warning because of the variable declaration inside the for loop, though. Thanks, Paolo