mirror of https://github.com/xemu-project/xemu.git
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_rdlock_main_loop(void);
|
||||||
void bdrv_graph_rdunlock_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 */
|
#endif /* GRAPH_LOCK_H */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue