[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 09/13] libxl: introduce lock in libxl_ctx
On Mon, 2011-11-28 at 16:59 +0000, Ian Jackson wrote: > This lock will be used to protect data structures which will be hung > off the libxl_ctx in subsequent patches. > > Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > --- > tools/libxl/libxl.c | 6 ++++++ > tools/libxl/libxl_internal.h | 27 +++++++++++++++++++++++++++ > 2 files changed, 33 insertions(+), 0 deletions(-) > > diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c > index bc17b15..7488538 100644 > --- a/tools/libxl/libxl.c > +++ b/tools/libxl/libxl.c > @@ -41,6 +41,7 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, > { > libxl_ctx *ctx; > struct stat stat_buf; > + const pthread_mutex_t mutex_value = > PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; > > if (version != LIBXL_VERSION) > return ERROR_VERSION; > @@ -54,6 +55,11 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, > memset(ctx, 0, sizeof(libxl_ctx)); > ctx->lg = lg; > > + /* This somewhat convoluted approach is needed because > + * PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP is defined to be valid > + * only as an initialiser, not as an expression. */ > + memcpy(&ctx->lock, &mutex_value, sizeof(ctx->lock)); > + > if ( stat(XENSTORE_PID_FILE, &stat_buf) != 0 ) { > LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Is xenstore daemon > running?\n" > "failed to stat %s", XENSTORE_PID_FILE); > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > index cda6fc1..41de6fd 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -23,6 +23,7 @@ > #include <stdarg.h> > #include <stdlib.h> > #include <string.h> > +#include <pthread.h> > > #include <xs.h> > #include <xenctrl.h> > @@ -95,6 +96,18 @@ struct libxl__ctx { > xc_interface *xch; > struct xs_handle *xsh; > > + pthread_mutex_t lock; /* protects data structures hanging off the ctx */ > + /* Always use CTX_LOCK and CTX_UNLOCK to manipulate this. > + * > + * You may acquire this mutex recursively if it is convenient to > + * do so. You may not acquire this lock at the same time as any > + * other lock. If you need to call application code outside > + * libxl (ie, a callback) with this lock held then it is > + * necessaray to impose restrictions on the caller to maintain a > + * proper lock hierarchy, and these restrictions must then be > + * documented in the libxl public interface. > + */ > + > /* for callers who reap children willy-nilly; caller must only > * set this after libxl_init and before any other call - or > * may leave them untouched */ > @@ -668,6 +681,20 @@ libxl__device_model_version_running(libxl__gc *gc, > uint32_t domid); > #define CTX libxl__gc_owner(gc) > > > +/* Locking functions. See comment for "lock" member of libxl__ctx. */ > + > +#define CTX_LOCK do { \ > + int mutex_r = pthread_mutex_lock(&CTX->lock); \ > + assert(!mutex_r); \ > + } while(0) > + > +#define CTX_UNLOCK do { \ > + int mutex_r = pthread_mutex_unlock(&CTX->lock); \ > + assert(!mutex_r); \ > + } while(0) > + > + > + > /* > * Inserts "elm_new" into the sorted list "head". > * _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |