On 8/9/07, Stefano Bagnara <[EMAIL PROTECTED]> wrote: > Bernd Fondermann ha scritto: > > What types of exceptions do you get? NPE?
mostly ones related to the state machine. it's the same script and it filters the mail fine in a single threaded test environment but occasionally fails when run from the spool. > > if it wasn't for a ThreadLocal, I'd say that this method's init is not > > atomic, if fieldInstance is NULL: > > > > static protected void setInstance(CommandStateManager conditionManager) > > { > > if (null == fieldInstance) > > fieldInstance = new ThreadLocal(); > > fieldInstance.set(conditionManager); > > } > > > > It leaves ThreadLocal uninitialized but accessible for a little > > moment. if the method got interrupted in between and getInstance() > > gets executed, this might result in a NPE. > > Good catch!! +1 probably better to replace lazy construction with a final variable > > But maybe this case will never occur because of the special nature of > > ThreadLocals? > > I don't think so, but your pointer brought me to look for callers of > that code, and here it is: > > /** > * Method execute executes a Block within the context of a new > ConditionManager. > * @param mail > * @param block > * @return Object > * @throws SieveException > */ > protected Object execute(MailAdapter mail, Block block) throws > SieveException { > // Switch to a new ConditionManager > ConditionManager oldManager = ConditionManager.getInstance(); > ConditionManager.resetInstance(); > > // Execute the Block > Object result = block.execute(mail); > > // Restore the old ConditionManager > ConditionManager.setInstance(oldManager); > > return result; > } > > I don't get how it works. ConditionManager.resetInstance will set the > static thread local fieldInstance to null: doesn't this invalidate also > instances of every other thread using the ConditionManager ? good spot 8-) +1 probably better to use a stack and push the implementation into ConditionManager > Shouldn't > resetInstance simply remove the conditionManager from the fieldInstance > ThreadLocal using a fieldInstance.set(null) ? i've been running with this change in for a couple of days and (as yet) there haven't been any exceptions thrown - robert --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]