[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