]
David Lloyd commented on JGRP-1877:
-----------------------------------
Nope. If a thread is interrupted once, then interrupt state must persist until the thread
pool's root method clears it. That's the contract of interruption. The reason it
is this way is that you can have a stack 1000 levels deep, and 10 people can be using
interruption for 10 different purposes. You cannot know if interruption is intended for
you or not. This is why things which use interrupt also employ additional
"exit" or "terminate" flags, though having such a flag set *still*
does not mean you can assume that an interrupt was meant for you because each party might
separately interrupt the same thread for different purposes. Only the root thread task
itself has suitable information and position to safely clear the interrupt state of the
thread.
System.nanoTime() can be negative
---------------------------------
Key: JGRP-1877
URL:
https://issues.jboss.org/browse/JGRP-1877
Project: JGroups
Issue Type: Bug
Reporter: Bela Ban
Assignee: Bela Ban
Fix For: 3.5.1, 3.6
According to the javadoc, {{System.nanoTime()}} should only be used to measure _elapsed
time_, but not compute a _target time in the future_, as {{nanoTime()}} might return a a
time in the future.
Code like the one below might fail:
{code:title=Responses.waitFor()|borderStyle=solid}
public boolean waitFor(long timeout) {
long wait_time;
final long target_time=System.nanoTime() + TimeUnit.NANOSECONDS.convert(timeout,
TimeUnit.MILLISECONDS); // ns
lock.lock();
try {
while(!done && (wait_time=target_time - System.nanoTime()) > 0) {
try {
cond.await(wait_time,TimeUnit.NANOSECONDS);
}
catch(InterruptedException e) {
}
}
return done;
}
finally {
lock.unlock();
}
}
{code}
When computing {{target_time}}, {{System.nanoTime()}} could return a negative value
(numeric overflow) or a value in the future. In the first case, {{target_time}} could be
negative, so the method would not block at all. In the latter case, {{target_time}} could
be huge, so the method would block for a long time.
Investigate all occurrences where we use {{nanoTime()}} to compute a time in the future,
and see what impact a future value value could have. Possibly replace with
{{System.currentTimeMillis()}} or the _time service_.