[Mesa-dev] [PATCH 05/12] gallivm: Use LLVM global context.

Brian Paul brianp at vmware.com
Tue May 13 08:10:00 PDT 2014


On 05/13/2014 06:01 AM, jfonseca at vmware.com wrote:
> From: José Fonseca <jfonseca at vmware.com>
>
> I saw that LLVM internally uses its global context for some things, even
> when we use our own.  Given ours is also global, might as well use
> LLVM's.
>
> However, sepearate contexts can still be enabled with a simple source
> code modification, for when the need/benefit arises.
> ---
>   src/gallium/auxiliary/gallivm/lp_bld_init.c | 40 ++++++++++++-----------------
>   1 file changed, 17 insertions(+), 23 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c
> index 6934a28..2d854e9 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c
> @@ -68,6 +68,16 @@
>   void LLVMLinkInMCJIT();
>   #endif
>
> +/*
> + * LLVM has several global caches which pointing/derived from objects
> + * owned by the context, so if we freeing contexts causes
> + * memory leaks and false cache hits when these objects are destroyed.

I can't quite parse that comment.


> + *
> + * TODO: For thread safety on multi-threaded OpenGL we should use one LLVM
> + * context per thread, and put them in a pool when threads are destroyed.
> + */
> +#define USE_GLOBAL_CONTEXT 1
> +
>
>   #ifdef DEBUG
>   unsigned gallivm_debug = 0;
> @@ -196,16 +206,12 @@ free_gallivm_state(struct gallivm_state *gallivm)
>      }
>   #endif
>
> -   /* Never free the LLVM context.
> -    */
> -#if 0
> -   if (gallivm->context)
> -      LLVMContextDispose(gallivm->context);
> -#endif
> -
>      if (gallivm->builder)
>         LLVMDisposeBuilder(gallivm->builder);
>
> +   if (!USE_GLOBAL_CONTEXT && gallivm->context)
> +      LLVMContextDispose(gallivm->context);
> +
>      gallivm->engine = NULL;
>      gallivm->target = NULL;
>      gallivm->module = NULL;
> @@ -277,19 +283,6 @@ fail:
>
>
>   /**
> - * Singleton
> - *
> - * We must never free LLVM contexts, because LLVM has several global caches
> - * which pointing/derived from objects owned by the context, causing false
> - * memory leaks and false cache hits when these objects are destroyed.
> - *
> - * TODO: For thread safety on multi-threaded OpenGL we should use one LLVM
> - * context per thread, and put them in a pool when threads are destroyed.
> - */
> -static LLVMContextRef gallivm_context = NULL;
> -
> -
> -/**
>    * Allocate gallivm LLVM objects.
>    * \return  TRUE for success, FALSE for failure
>    */
> @@ -301,10 +294,11 @@ init_gallivm_state(struct gallivm_state *gallivm)
>
>      lp_build_init();
>
> -   if (!gallivm_context) {
> -      gallivm_context = LLVMContextCreate();
> +   if (USE_GLOBAL_CONTEXT) {
> +      gallivm->context = LLVMGetGlobalContext();
> +   } else {
> +      gallivm->context = LLVMContextCreate();
>      }
> -   gallivm->context = gallivm_context;
>      if (!gallivm->context)
>         goto fail;
>
>



More information about the mesa-dev mailing list