[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxc: allow caller to specify no re-entrancy protection when opening the interface
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1291294140 0 # Node ID e5c48e0cd03d81e4e74952fe29fe3a7506e525a4 # Parent 31c2ae4ecd58684c12a2239e3a4fb8413e168c48 libxc: allow caller to specify no re-entrancy protection when opening the interface Used by language bindings which provide their own re-entrancy which conflicts with pthreads. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> committer: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> --- tools/libxc/xc_private.c | 54 ++++++++++++++++++++++++++--------------------- tools/libxc/xc_private.h | 1 tools/libxc/xenctrl.h | 11 ++++++++- 3 files changed, 42 insertions(+), 24 deletions(-) diff -r 31c2ae4ecd58 -r e5c48e0cd03d tools/libxc/xc_private.c --- a/tools/libxc/xc_private.c Thu Dec 02 12:49:00 2010 +0000 +++ b/tools/libxc/xc_private.c Thu Dec 02 12:49:00 2010 +0000 @@ -32,6 +32,7 @@ xc_interface *xc_interface_open(xentooll unsigned open_flags) { xc_interface xch_buf, *xch = &xch_buf; + xch->flags = open_flags; xch->fd = -1; xch->dombuild_logger_file = 0; xc_clear_last_error(xch); @@ -546,30 +547,37 @@ _xc_init_errbuf(void) const char *xc_strerror(xc_interface *xch, int errcode) { + if ( xch->flags & XC_OPENFLAG_NON_REENTRANT ) + { + return strerror(errcode); + } + else + { #define XS_BUFSIZE 32 - char *errbuf; - static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - char *strerror_str; - - pthread_once(&errbuf_pkey_once, _xc_init_errbuf); - - errbuf = pthread_getspecific(errbuf_pkey); - if (errbuf == NULL) { - errbuf = malloc(XS_BUFSIZE); - pthread_setspecific(errbuf_pkey, errbuf); - } - - /* - * Thread-unsafe strerror() is protected by a local mutex. We copy - * the string to a thread-private buffer before releasing the mutex. - */ - pthread_mutex_lock(&mutex); - strerror_str = strerror(errcode); - strncpy(errbuf, strerror_str, XS_BUFSIZE); - errbuf[XS_BUFSIZE-1] = '\0'; - pthread_mutex_unlock(&mutex); - - return errbuf; + char *errbuf; + static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + char *strerror_str; + + pthread_once(&errbuf_pkey_once, _xc_init_errbuf); + + errbuf = pthread_getspecific(errbuf_pkey); + if (errbuf == NULL) { + errbuf = malloc(XS_BUFSIZE); + pthread_setspecific(errbuf_pkey, errbuf); + } + + /* + * Thread-unsafe strerror() is protected by a local mutex. We copy the + * string to a thread-private buffer before releasing the mutex. + */ + pthread_mutex_lock(&mutex); + strerror_str = strerror(errcode); + strncpy(errbuf, strerror_str, XS_BUFSIZE); + errbuf[XS_BUFSIZE-1] = '\0'; + pthread_mutex_unlock(&mutex); + + return errbuf; + } } void bitmap_64_to_byte(uint8_t *bp, const uint64_t *lp, int nbits) diff -r 31c2ae4ecd58 -r e5c48e0cd03d tools/libxc/xc_private.h --- a/tools/libxc/xc_private.h Thu Dec 02 12:49:00 2010 +0000 +++ b/tools/libxc/xc_private.h Thu Dec 02 12:49:00 2010 +0000 @@ -67,6 +67,7 @@ struct xc_interface { int fd; + int flags; xentoollog_logger *error_handler, *error_handler_tofree; xentoollog_logger *dombuild_logger, *dombuild_logger_tofree; struct xc_error last_error; /* for xc_get_last_error */ diff -r 31c2ae4ecd58 -r e5c48e0cd03d tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Thu Dec 02 12:49:00 2010 +0000 +++ b/tools/libxc/xenctrl.h Thu Dec 02 12:49:00 2010 +0000 @@ -132,8 +132,17 @@ xc_interface *xc_interface_open(xentooll * if dombuild_logger=NULL, will log to a file */ +/* + * Note: if XC_OPENFLAG_NON_REENTRANT is passed then libxc must not be + * called reentrantly and the calling application is responsible for + * providing mutual exclusion surrounding all libxc calls itself. + * + * In particular xc_{get,clear}_last_error only remain valid for the + * duration of the critical section containing the call which failed. + */ enum xc_open_flags { - XC_OPENFLAG_DUMMY = 01, /* do not actually open a xenctrl interface */ + XC_OPENFLAG_DUMMY = 1<<0, /* do not actually open a xenctrl interface */ + XC_OPENFLAG_NON_REENTRANT = 1<<1, /* assume library is only every called from a single thread */ }; /** _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |