cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sylvain Wallez <>
Subject Re: Weird multithreading bug in Cron block
Date Thu, 09 Jun 2005 08:37:25 GMT
Carsten Ziegeler wrote:

>Sylvain Wallez wrote:
>>So the question is:
>>- why is the pipeline automatically released? Is to avoid memory leaks?
>Yes, in 2.1.x there was no good place for explicitly releasing the
>pipeline; this required some incompatible changes we did in 2.2; the
>pipelines are released there explicitly and not automatically.
>If the pipeline is not released properly, this means that all pipeline
>components are not released, creating a hugh memory leak.

I see, and cleaning up is better than letting memory leak.

But I have a problem with the InheritableThreadLocal, which can also 
create leaks, as one of its effects is that child threads inherits the 
environment stack of their parent thread at the time where they (the 
children) were created.

If these child threads are created and terminated within the scope of 
the parent's thread request, then this is no problem (e.g. in parallel 
cinclude), but it is a problem for long-running background threads such 
as those created by the RunnableManager (used by the scheduler) or, as 
in my case, by user code.

So IMO, we should change the way environment inheritance between threads 
is managed:
- if a child thread runs in the scope of its parent, then a special 
CocoonThread class (extends Thread) should be used, which will copy the 
needed environment data before launching its Runnable.
- normal threads created with "new Thread()" inherit nothing and can 
therefore work in a clean environment.

This approach requires two changes in the 2.1 code base (haven't checked 
2.2 yet):
- DefaultIncludeCacheManager.load() in o.a.c.transformation.helpers
- maybe PortalManagerImpl.loadCoplet() in o.a.c.webapps.portal.components

In these two places, the CocoonThread proposed above have to be used to 
inherit the parent environment. In all other places where "new Thread()" 
is called, inheriting the parent environment is not needed and worse, 
can be harmful.



Sylvain Wallez                        Anyware Technologies  
Apache Software Foundation Member     Research & Technology Director

View raw message