[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxl: introduce lock in libxl_ctx
# HG changeset patch # User Ian Jackson <ian.jackson@xxxxxxxxxxxxx> # Date 1323712121 0 # Node ID f9c147cdb448291af66e032c67b057ce96b137ce # Parent 27328e5242ba7f5510d9acd9151f2abacd41791f libxl: introduce lock in libxl_ctx 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> Committed-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- diff -r 27328e5242ba -r f9c147cdb448 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Mon Dec 12 17:48:40 2011 +0000 +++ b/tools/libxl/libxl.c Mon Dec 12 17:48:41 2011 +0000 @@ -41,6 +41,7 @@ { 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 @@ 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 -r 27328e5242ba -r f9c147cdb448 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Mon Dec 12 17:48:40 2011 +0000 +++ b/tools/libxl/libxl_internal.h Mon Dec 12 17:48:41 2011 +0000 @@ -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 @@ 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 */ @@ -669,6 +682,20 @@ #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-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |