[ 
https://issues.apache.org/jira/browse/DAFFODIL-2216?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mike Beckerle resolved DAFFODIL-2216.
-------------------------------------
    Fix Version/s: 3.0.0
       Resolution: Fixed

Fixed in ed9e35c55e0ed75abab36e7d50217b937e6d4c1e

> 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
>            Assignee: Chia-Hung Lin
>            Priority: Critical
>              Labels: beginner, thread-safety
>             Fix For: 3.0.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