Bob Hanson wrote:
> supreme catch, JR! Nico is our synchronization expert, but that does
> seem to work. I ran
>
> for (int i = 0; i < 100; i++)
> jmol.viewer.script("echo test "+ i);
>
> and got one single queue.
>
Yes, it should work correctly for single-thread calls like your example.
The synchronized() part would be necessary only if we wanted to support
calling script() from several threads.
Nico
> Bob
>
>
> JR Schmidt wrote:
>
>
>> I believe that I discovered a nasty little race condition in the
>> org.jmol.viewer.ScriptManager class, which rears its head when
>> multiple calls to JMolViewer.script() are made in rapid
>> succession. Obviously, this is most likely to occur when using
>> JMolViewer programmatically, rather than from JavaScript (since
>> JavaScript is too slow to call frequently enough).
>>
>> In any case, the problem is that the ScriptManager.addScript() method
>> first checks to see if the script execution thread is running; if
>> not, it starts it. The problem is that if two calls to addScript are
>> made in rapid succession, multiple threads can be created, and the
>> resulting scripts are run multiple times. Not good!
>>
>> The solution is to move the setting of scriptQueueRunning = true from
>> the run() method of ScriptQueueRunnable to the start ScriptQueue
>> function itself. This eliminates the problem.
>>
>> private void startScriptQueue() {
>> if (scriptQueueRunning)
>> return;
>> scriptQueueRunning = true; <- set it here!
>> queueThread = new Thread(new ScriptQueueRunnable());
>> queueThread.start();
>> }
>>
>> The astute coder may not that this doesn't actually eliminate the
>> race condition, it just mitigates it. There is still a race
>> condition between the check in the if statement and the setting of
>> the variable. I think (but I haven't verified) that this can be
>> eliminated with a synchronized block, like
>>
>> private void startScriptQueue() {
>> synchronized(this) {
>> if (scriptQueueRunning)
>> return;
>> scriptQueueRunning = true; <- set it here!
>> }
>> queueThread = new Thread(new ScriptQueueRunnable());
>> queueThread.start();
>> }
>>
>> I don't have SVN write access, so I'll leave the final solution to
>> one of you fine fellows.
>>
>> JR Schmidt
>>
>>
>> -------------------------------------------------------------------------
>> Using Tomcat but need to do more? Need to support web services, security?
>> Get stuff done quickly with pre-integrated technology to make your job easier
>> Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
>> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
>> _______________________________________________
>> Jmol-developers mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/jmol-developers
>>
>>
>>
>
> -------------------------------------------------------------------------
> Using Tomcat but need to do more? Need to support web services, security?
> Get stuff done quickly with pre-integrated technology to make your job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> _______________________________________________
> Jmol-developers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/jmol-developers
>
>
>
>
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Jmol-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-developers