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

Jose Fonseca jfonseca at vmware.com
Tue May 13 08:16:34 PDT 2014



----- Original Message -----
> 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.

I tweaked the comment (was below) but indeed did a poor job.  I think I'll just put the original back:

   "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."

Jose

> > + *
> > + * 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;
> >
> >
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=kRO9KvwmjrXoEWeoBbmyfPh66F8KIgozbcuTmRLaxB0%3D%0A&s=4f4a6fcf6d37e893fa7ff739d30cb01db6842f68809634cfd1eda122f5404071
> 


More information about the mesa-dev mailing list