[Libguestfs] [PATCH 2/5] threads: Acquire and release the lock around each public guestfs_* API.
Pino Toscano
ptoscano at redhat.com
Thu Jun 11 13:13:23 UTC 2015
Hi,
On Saturday 06 June 2015 14:20:38 Richard W.M. Jones wrote:
> Since each ACQUIRE_LOCK/RELEASE_LOCK call must balance, this code is
> difficult to debug. Enable DEBUG_LOCK to add some prints which can
> help.
There's some way this could be simplified:
> const char *
> guestfs_last_error (guestfs_h *g)
> {
> - return g->last_error;
> + const char *r;
> +
> + ACQUIRE_LOCK (g);
> + r = unlocked_last_error (g);
> + RELEASE_LOCK (g);
> + return r;
> +}
(picking this because it is the first ACQUIRE_LOCK ... RELEASE_LOCK
pattern in the patch)
there could be an extra macro to do a "stack lock", using the cleanup
attribute we use already; something like:
static inline guestfs_h *acquire_lock (guestfs_h *g)
{
ACQUIRE_LOCK (g);
return g;
}
static inline void cleanup_release_lock (void *ptr)
{
guestfs_h *g = * (guestfs_h **) ptr;
RELEASE_LOCK (g);
}
#define STACK_LOCK (g) \
__attribute__((cleanup(cleanup_release_lock))) \
guestfs_h *_stack_lock_ = acquire_lock (g)
then the function above could look like:
const char *
guestfs_last_error (guestfs_h *g)
{
STACK_LOCK (g);
return g->last_error;
}
This would have the drawback of requiring __attribute__((cleanup)) to
work, although that could mean we could drop the code handling its
lack.
--
Pino Toscano
More information about the Libguestfs
mailing list