|
|
|
|
|
|
|
|
|
|
xen-cim
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
|
|
|
|
|