Mike Beckerle created DAFFODIL-2216:
---------------------------------------

             Summary: thread-unsafe Logging trait usage
                 Key: DAFFODIL-2216
                 URL: https://issues.apache.org/jira/browse/DAFFODIL-2216
             Project: Daffodil
          Issue Type: Bug
          Components: Back End
    Affects Versions: 2.4.0
            Reporter: Mike Beckerle
             Fix For: 2.5.0


The logger functionality is provided by the Logging trait.

This trait is mixed into, for example, the DataProcessor class.

This trait has mutable members.

This is a mistake. The PState/UState also mix in the Logging trait for use at 
runtime that way each thread (which requires a unique PState/UState) can have 
its own logger, own state for whether logging is on/off, own logging level, own 
I/O streams for writing to the log, etc. 

Currently the DataProcessor.doUnparse method is the only thing that calls 
DataProcessor.log, but it should be calling ustate.log instead.

This change has API implications however, as the API for setting a logger and 
turning on logging needs to arrange for that information to be recorded on the 
PState/UState, but those objects aren't directly visible to the API.

Since the logger is mutable state, we really don't want users to establish a 
single logger on the say, compiler or ProcessorFactory object instance, or even 
the DataProcessor instance, since that logger really should not get shared if 
users call parse multiple times on different threads. Rather, each 
parse/unparse call, which can be done on a separate thread, needs to be able to 
establish all its own mutable state.

Unfortunately, right now the parse() call takes two arguments, the 
InputSourceDataInputStream, and the InfosetOutputter.  I suppose the 
InputSourceDataInputStream, which cannot be shared, could have the logger 
methods mixed into it..... doesn't seem particularly clean.

There are two different loggers: the compile-time logger, and the runtime 
logger(s) - the latter is plural since there can be distinct ones per each 
thread used for a parse or unparse call.

 

 

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to