[kepler-dev] Thread safety with Ptolemy’s TypedIOPort

Colin Enticott Colin.Enticott at csse.monash.edu.au
Thu Oct 8 23:10:59 PDT 2009


Hi,

Looking into this further (sorry for the delay, I’ve been busy), it 
looks like all actions on port types obtain a read lock on the 
workspace. When the manager resolves types, it also obtains a read lock, 
but makes changes to the port types. Shouldn't it obtain a write lock?

Thanks,
Colin

Colin Enticott wrote:
>
> Hi,
>
>
> First of all, I didn’t think that multiple threads would use the same 
> TypedIOPort object, but here’s the story:
>
>  
>
> I’ve been developing a new "threading director" for Ptolemy, the 
> Nimrod/k TDA director[1], and one in every 100 executions of my 
> rigorous director threading test workflows, I get an exception. This 
> exception happens when an actor sends a token out a TypedIOPort:
>
> (Sorry. The exception is from kepler-1.0.0, so the line numbers differ 
> from the current version, but the functions in question are identical)
>
>  
>
> ptolemy.kernel.util.IllegalActionException: Run-time type checking 
> failed. Token 3 with type int is incompatible with port type: int
>
>   in .Composite.Ramp.output
>
>         at ptolemy.actor.TypedIOPort._checkType(TypedIOPort.java:750)
>
>         at ptolemy.actor.TypedIOPort.send(TypedIOPort.java:472)
>
>         at ptolemy.actor.lib.Ramp.fire(Ramp.java:138)
>
>         at 
> org.monash.nimrod.NimrodDirector.NimrodProcessThread.run(NimrodProcessThread.java:347)
>
>  
>
> The confusing error message is “Token 3 with type int is incompatible 
> with port type: int”. Looking into this deeper I believe the error 
> message is being generated after the port state has changed.
>
>  
>
> The function in question is:
>
>  
>
> protected void _checkType(Token token) throws IllegalActionException {
>
>     int compare = TypeLattice.compare(token.getType(), _resolvedType);
>
>  
>
>     if ((compare == CPO.HIGHER) || (compare == CPO.INCOMPARABLE)) {
>
>         throw new IllegalActionException(this,
>
>                 "Run-time type checking failed. Token " + token
>
>                         + " with type " + token.getType()
>
>                         + " is incompatible with port type: "
>
>                         + getType().toString());
>
>     }
>
> }
>
>  
>
> I suspect the “compare” method is called before the type is set (or 
> changed) and the error message is generated after the type is set. 
> Looking for another thread that could be accessing the TypedIOPort, I 
> discovered the type checking functionality. Listening to the manager, 
> it looks like the manager is "resolving types" in response to a 
> “ChangeRequest”.
>
>  
>
> Two questions:
>
>  
>
> Should I use “change requests” in this way? None of the changes will 
> cause any problems with types and so I could directly modify the 
> workflow. (I initially used change requests as the main thread holds a 
> read lock on the workspace when the "manager" fires the “director”)
>
>  
>
> And, it looks like TypedIOPort is not thread safe. Does this need to 
> be fixed? Or should type resolving be completely blocked in a threaded 
> environment? The documentation suggests it should be left to the 
> director to decide “when it is safe to perform change requests”, but I 
> cannot see a way of preventing an actor from doing a type check when 
> sending tokens in a threaded environment.
>
>
> Also, I don't think it is just with my director. It looks like this 
> issue will arise in the PN environment, if the workflow makes changes 
> to the workflow.
>
>  
>
> Thanks,
>
> Colin
>
>
> [1] Abramson D, Enticott C, Altintas I., "Nimrod/K: Towards Massively 
> Parallel Dynamic Grid Workflows", IEEE SuperComputing 2008, Austin, 
> Texas November 2008
>
>
> -- 
> Colin Enticott, Research Scientist, Ph: +61 03 9903 2215
> Room H7.26, Level 7, Building H, Monash University Caulfield 3145, Australia 
> ------------------------------------------------------------------------
>
> _______________________________________________
> Kepler-dev mailing list
> Kepler-dev at kepler-project.org
> http://mercury.nceas.ucsb.edu/kepler/mailman/listinfo/kepler-dev
>   


-- 
Colin Enticott, Research Scientist, Ph: +61 03 9903 2215
Room H7.26, Level 7, Building H, Monash University Caulfield 3145, Australia 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mercury.nceas.ucsb.edu/kepler/pipermail/kepler-dev/attachments/20091009/dc2b44a7/attachment.html>


More information about the Kepler-dev mailing list