[jboss-jira] [JBoss JIRA] Commented: (JGRP-536) Catching InterruptedException and setting interrupt bit in a loop might cause infinite loop
Bela Ban (JIRA)
jira-events at lists.jboss.org
Fri Jun 15 07:32:11 EDT 2007
[ http://jira.jboss.com/jira/browse/JGRP-536?page=comments#action_12365501 ]
Bela Ban commented on JGRP-536:
-------------------------------
Search for other occurrences of this
> Catching InterruptedException and setting interrupt bit in a loop might cause infinite loop
> -------------------------------------------------------------------------------------------
>
> Key: JGRP-536
> URL: http://jira.jboss.com/jira/browse/JGRP-536
> Project: JGroups
> Issue Type: Bug
> Reporter: Bela Ban
> Assigned To: Bela Ban
> Fix For: 2.4.1 SP4, 2.5
>
>
> FC.handleDownMessage() has the following code:
> while(length > lowest_credit && running) {
> try {
> boolean rc=credits_available.await(max_block_time, TimeUnit.MILLISECONDS);
> if(rc || length <= lowest_credit || !running)
> break;
> long wait_time=System.currentTimeMillis() - last_credit_request;
> if(wait_time >= max_block_time) {
> // we have to set this var now, because we release the lock below (for sending a
> // credit request), so all blocked threads would send a credit request, leading to
> // a credit request storm
> last_credit_request=System.currentTimeMillis();
> // we need to send the credit requests down *without* holding the sent_lock, otherwise we might
> // run into the deadlock described in http://jira.jboss.com/jira/browse/JGRP-292
> Map<Address,Long> sent_copy=new HashMap<Address,Long>(sent);
> sent_copy.keySet().retainAll(creditors);
> sent_lock.unlock();
> try {
> // System.out.println(new Date() + " --> credit request");
> for(Map.Entry<Address,Long> entry: sent_copy.entrySet()) {
> sendCreditRequest(entry.getKey(), entry.getValue());
> }
> }
> finally {
> sent_lock.lock();
> }
> }
> }
> catch(InterruptedException e) {
> // set the interrupted flag again, so the caller's thread can handle the interrupt as well
> Thread.currentThread().interrupt();
> }
> }
> So if the thread is interrupted, unless
> length < lowest_credit || !running,
> we will have an infinite loop !
> SOLUTION: we cannot set the interrupt flag again, because we *don't* return from the loop !
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list