Sylvain Wallez wrote:
Vadim Gritsenko wrote:

Sylvain Wallez wrote:

- core: DefaultRunnableManager
The thread pool can be created lazily when the first Runnable is executed.

Resulting pool will not behave same as with eager loading, for two reasons:

(1) there are 5 references to InheritableThreadLocal in Cocoon code,

and (2) initialization Thread is not the same as thread making request. It could be from different ThreadGroup, even.

Is that a problem?

Actual problem is that RunnableManager's threads should not be children of any request processing thread, and currently this is the case because RunnableManager is initialized eagerly.

If RunnableManager's thread pools are created lazily (==children of single request processing thread), following can happen:

  * All threads in pools inherit locals of the request thread,
    which is wrong.

  * All threads will be created in the ThreadGroup of the request
    processing thread, will attempt to modify said group, and
    can fail with SecurityException (you can create thread in a
    thread group only if you have modifyThreadGroup priviledge).

  * All threads will be limited to the priorities set for the
    request processing thread's group priorities.

  * All threads will inherit isDaemon, priority, contextClassLoader
    attributes of the execution thread. Both setPriority and setDaemon
    require permissions configured.

In short: request processing thread pool can be configured with different priorities, different permissions than initialization thread. Loading RunnableManager with lazy mode will hit these restrictions.

Hence my request to load RunnableManager eagerly to avoid any possible complications.


Back to InheritableThreadLocals:

> So let's check the uses of InheritableThreadLocal. I found only 4 of
> them (what is your 5th?)

IDEA counted two mentions in SourceProtocolHandler, for one line - so yes it is four actual variables.

Vadim

Reply via email to