graph-lock: Implement guard macros
Similar to the implementation in lockable.h, implement macros to automatically take and release the rdlock. Create the empty GraphLockable and GraphLockableMainloop structs only to use it as a type for G_DEFINE_AUTOPTR_CLEANUP_FUNC. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20221207131838.239125-4-kwolf@redhat.com> Reviewed-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
aead9dc9d1
commit
8aa77000c2
@ -135,5 +135,71 @@ void coroutine_fn bdrv_graph_co_rdunlock(void);
|
||||
void bdrv_graph_rdlock_main_loop(void);
|
||||
void bdrv_graph_rdunlock_main_loop(void);
|
||||
|
||||
typedef struct GraphLockable { } GraphLockable;
|
||||
|
||||
/*
|
||||
* In C, compound literals have the lifetime of an automatic variable.
|
||||
* In C++ it would be different, but then C++ wouldn't need QemuLockable
|
||||
* either...
|
||||
*/
|
||||
#define GML_OBJ_() (&(GraphLockable) { })
|
||||
|
||||
static inline GraphLockable *graph_lockable_auto_lock(GraphLockable *x)
|
||||
{
|
||||
bdrv_graph_co_rdlock();
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void graph_lockable_auto_unlock(GraphLockable *x)
|
||||
{
|
||||
bdrv_graph_co_rdunlock();
|
||||
}
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GraphLockable, graph_lockable_auto_unlock)
|
||||
|
||||
#define WITH_GRAPH_RDLOCK_GUARD_(var) \
|
||||
for (g_autoptr(GraphLockable) var = graph_lockable_auto_lock(GML_OBJ_()); \
|
||||
var; \
|
||||
graph_lockable_auto_unlock(var), var = NULL)
|
||||
|
||||
#define WITH_GRAPH_RDLOCK_GUARD() \
|
||||
WITH_GRAPH_RDLOCK_GUARD_(glue(graph_lockable_auto, __COUNTER__))
|
||||
|
||||
#define GRAPH_RDLOCK_GUARD(x) \
|
||||
g_autoptr(GraphLockable) \
|
||||
glue(graph_lockable_auto, __COUNTER__) G_GNUC_UNUSED = \
|
||||
graph_lockable_auto_lock(GML_OBJ_())
|
||||
|
||||
|
||||
typedef struct GraphLockableMainloop { } GraphLockableMainloop;
|
||||
|
||||
/*
|
||||
* In C, compound literals have the lifetime of an automatic variable.
|
||||
* In C++ it would be different, but then C++ wouldn't need QemuLockable
|
||||
* either...
|
||||
*/
|
||||
#define GMLML_OBJ_() (&(GraphLockableMainloop) { })
|
||||
|
||||
static inline GraphLockableMainloop *
|
||||
graph_lockable_auto_lock_mainloop(GraphLockableMainloop *x)
|
||||
{
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void
|
||||
graph_lockable_auto_unlock_mainloop(GraphLockableMainloop *x)
|
||||
{
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
}
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GraphLockableMainloop,
|
||||
graph_lockable_auto_unlock_mainloop)
|
||||
|
||||
#define GRAPH_RDLOCK_GUARD_MAINLOOP(x) \
|
||||
g_autoptr(GraphLockableMainloop) \
|
||||
glue(graph_lockable_auto, __COUNTER__) G_GNUC_UNUSED = \
|
||||
graph_lockable_auto_lock_mainloop(GMLML_OBJ_())
|
||||
|
||||
#endif /* GRAPH_LOCK_H */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user