WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 2 of 2] libxc: allow caller to specify no re-entrancy

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 2 of 2] libxc: allow caller to specify no re-entrancy protection when opening the interface
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Thu, 02 Dec 2010 13:50:02 +0000
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Thu, 02 Dec 2010 05:53:00 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1291297800@xxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# 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@xxxxxxxxxx>

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 */
 };
 
 /**

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel