* [PATCH 1 of 2] libxc: rename safe_strerror to xc_strerror and pass in an XC handle for future use
2010-12-02 13:50 [PATCH 0 of 2] libxc: Add option to disable threading at runtime Ian Campbell
@ 2010-12-02 13:50 ` Ian Campbell
2010-12-02 13:50 ` [PATCH 2 of 2] libxc: allow caller to specify no re-entrancy protection when opening the interface Ian Campbell
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Ian Campbell @ 2010-12-02 13:50 UTC (permalink / raw)
To: xen-devel; +Cc: Ian Campbell
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1291294140 0
# Node ID 09bd65d842658b39e584b1d4bbc08e9813813937
# Parent 74b5822000a8f1d597f765c8d0a243e095de2f22
libxc: rename safe_strerror to xc_strerror and pass in an XC handle for future use.
Make the function public since I have future patches which depend on this.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r 74b5822000a8 -r 09bd65d84265 tools/libxc/ia64/xc_ia64_linux_save.c
--- a/tools/libxc/ia64/xc_ia64_linux_save.c Thu Dec 02 12:49:00 2010 +0000
+++ b/tools/libxc/ia64/xc_ia64_linux_save.c Thu Dec 02 12:49:00 2010 +0000
@@ -660,7 +660,7 @@ xc_domain_save(xc_interface *xch, int io
FIXME: to be tracked. */
fprintf(stderr, "cannot map mfn page %lx gpfn %lx: %s\n",
xc_ia64_p2m_mfn(&p2m_table, N),
- N, safe_strerror(errno));
+ N, xc_strerror(xch, errno));
goto out;
}
diff -r 74b5822000a8 -r 09bd65d84265 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
@@ -543,7 +543,7 @@ _xc_init_errbuf(void)
pthread_key_create(&errbuf_pkey, _xc_clean_errbuf);
}
-char *safe_strerror(int errcode)
+const char *xc_strerror(xc_interface *xch, int errcode)
{
#define XS_BUFSIZE 32
char *errbuf;
diff -r 74b5822000a8 -r 09bd65d84265 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
@@ -74,7 +74,6 @@ struct xc_interface {
const char *currently_progress_reporting;
};
-char *safe_strerror(int errcode);
void xc_report_error(xc_interface *xch, int code, const char *fmt, ...);
void xc_reportv(xc_interface *xch, xentoollog_logger *lg, xentoollog_level,
int code, const char *fmt, va_list args)
@@ -96,7 +95,7 @@ void xc_report_progress_step(xc_interfac
#define ERROR(_m, _a...) xc_report_error(xch,XC_INTERNAL_ERROR,_m , ## _a )
#define PERROR(_m, _a...) xc_report_error(xch,XC_INTERNAL_ERROR,_m \
- " (%d = %s)", ## _a , errno, safe_strerror(errno))
+ " (%d = %s)", ## _a , errno, xc_strerror(xch, errno))
/*
* HYPERCALL ARGUMENT BUFFERS
diff -r 74b5822000a8 -r 09bd65d84265 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
@@ -1411,6 +1411,11 @@ typedef struct xc_error {
*/
const char *xc_error_code_to_desc(int code);
+/*
+ * Convert an errno value to a text description.
+ */
+const char *xc_strerror(xc_interface *xch, int errcode);
+
/*
* Return a pointer to the last error with level XC_REPORT_ERROR. This
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 2 of 2] libxc: allow caller to specify no re-entrancy protection when opening the interface
2010-12-02 13:50 [PATCH 0 of 2] libxc: Add option to disable threading at runtime Ian Campbell
2010-12-02 13:50 ` [PATCH 1 of 2] libxc: rename safe_strerror to xc_strerror and pass in an XC handle for future use Ian Campbell
@ 2010-12-02 13:50 ` Ian Campbell
2010-12-02 14:56 ` [PATCH 0 of 2] libxc: Add option to disable threading at runtime Vincent Hanquez
2010-12-13 16:54 ` Stefano Stabellini
3 siblings, 0 replies; 5+ messages in thread
From: Ian Campbell @ 2010-12-02 13:50 UTC (permalink / raw)
To: xen-devel; +Cc: Ian Campbell
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1291294140 0
# Node ID 5de5590e2edb9a1245495ccc1ee804b47ad54087
# Parent 09bd65d842658b39e584b1d4bbc08e9813813937
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@citrix.com>
diff -r 09bd65d84265 -r 5de5590e2edb 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);
@@ -545,30 +546,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;
+ char *errbuf;
+ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ char *strerror_str;
- pthread_once(&errbuf_pkey_once, _xc_init_errbuf);
+ 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);
+ 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;
}
-
- /*
- * 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 09bd65d84265 -r 5de5590e2edb 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 09bd65d84265 -r 5de5590e2edb 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 */
};
/**
^ permalink raw reply [flat|nested] 5+ messages in thread