[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.