cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From volker.schm...@basf-it-services.com
Subject ExtendedComponentSelector not ThreadSafe
Date Wed, 05 Nov 2003 09:17:14 GMT
In my long debugging sessions the last days I found another issue inside
the ExtendedComponentSelector ;-)

ExtendedComponentSelector is a ThreadSafe Component which implements
ParentAware. To hold all the components which are lookup by the parent CS a
HashSet is used.

 /** The components selected in the parent selector */
    protected Set parentComponents;

Inside the select we have the following code:

try {
    return super.select(hint);

} catch(ComponentException ce) {
    // Doesn't exist here : try in parent selector
    Component component = this.parentSelector.select(hint);
    this.parentComponents.add(component);
    return component;
}


If two Threads or the same Thread lookup the same hint twice only one
reference is hold inside the HashSet and the release of the second
Component fail.

My first idea was first try to release the Component to the parent and if
fail call super.release(). In difference to the lookup a release doesn't
fail if a CM or CS can't release a Component, it only log a WARN.
A solution is using a "org.apache.commons.collections.MultiHashMap" which
in addition needs to be synchronized.

What do you think.

Volker




Mime
View raw message