[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-cim] Emailing: libxen.diff
On Fri, Dec 22, 2006 at 10:00:49PM -0500, Subrahmanian, Raj wrote: > This will MT-safe the xen_init and xen_fini calls, so that we can do it > once for each provider than for each call. I don't think that this belongs in libxen, as that library shouldn't add a dependency on libpthread unconditionally. Can't you do this inside the provider? Ewan. > Raj > <<libxen.diff>> > diff -r 8348f40ba2b7 tools/libxen/Makefile > --- a/tools/libxen/Makefile Thu Dec 21 14:49:19 2006 +0000 > +++ b/tools/libxen/Makefile Fri Dec 22 17:32:26 2006 -0500 > @@ -27,7 +27,8 @@ CFLAGS = -Iinclude \ > -W -Wall -Wmissing-prototypes -Werror -std=c99 -O2 -fPIC > > LDFLAGS = $(shell xml2-config --libs) \ > - $(shell curl-config --libs) > + $(shell curl-config --libs) \ > + -lpthread > > LIBXENAPI_HDRS = $(wildcard include/*.h) > LIBXENAPI_OBJS = $(patsubst %.c, %.o, $(wildcard src/*.c)) > diff -r 8348f40ba2b7 tools/libxen/include/xen_common.h > --- a/tools/libxen/include/xen_common.h Thu Dec 21 14:49:19 2006 +0000 > +++ b/tools/libxen/include/xen_common.h Fri Dec 22 17:32:26 2006 -0500 > @@ -24,13 +24,13 @@ > #include <stddef.h> > #include <stdint.h> > #include <time.h> > - > +// The init and the fini really need to happen only once. > +// The mutex will take care of that > +#include <pthread.h> > #include "xen_host_decl.h" > - > > typedef bool (*xen_result_func)(const void *data, size_t len, > void *result_handle); > - > > /** > * len does not include a terminating \0. > diff -r 8348f40ba2b7 tools/libxen/src/xen_common.c > --- a/tools/libxen/src/xen_common.c Thu Dec 21 14:49:19 2006 +0000 > +++ b/tools/libxen/src/xen_common.c Fri Dec 22 17:32:26 2006 -0500 > @@ -43,6 +43,8 @@ > #define PERMISSIVE 1 > > > +static pthread_mutex_t mutexUserCount=PTHREAD_MUTEX_INITIALIZER; > +static unsigned UserCount=0; > static xmlXPathCompExprPtr responsePath = NULL; > static xmlXPathCompExprPtr faultPath = NULL; > > @@ -111,23 +113,35 @@ void > void > xen_init(void) > { > - responsePath = > - xmlXPathCompile( > - BAD_CAST( > - "/methodResponse/params/param/value/struct/member/value")); > - faultPath = > - xmlXPathCompile( > - BAD_CAST("/methodResponse/fault/value/struct/member/value")); > + pthread_mutex_lock(&mutexUserCount); > + if (UserCount==0) > + { > + responsePath = > + xmlXPathCompile( > + BAD_CAST( > + > "/methodResponse/params/param/value/struct/member/value")); > + faultPath = > + xmlXPathCompile( > + BAD_CAST("/methodResponse/fault/value/struct/member/value")); > + } > + UserCount++; > + pthread_mutex_unlock(&mutexUserCount); > } > > > void > xen_fini(void) > { > - xmlXPathFreeCompExpr(responsePath); > - xmlXPathFreeCompExpr(faultPath); > - responsePath = NULL; > - faultPath = NULL; > + pthread_mutex_lock(&mutexUserCount); > + UserCount--; > + if (UserCount==0) > + { > + xmlXPathFreeCompExpr(responsePath); > + xmlXPathFreeCompExpr(faultPath); > + responsePath = NULL; > + faultPath = NULL; > + } > + pthread_mutex_unlock(&mutexUserCount); > } > _______________________________________________ > Xen-cim mailing list > Xen-cim@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-cim _______________________________________________ Xen-cim mailing list Xen-cim@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-cim
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |