Author: nextgens
Date: 2006-07-11 17:44:10 +0000 (Tue, 11 Jul 2006)
New Revision: 9563
Modified:
trunk/freenet/src/freenet/node/CHKInsertSender.java
Log:
maybe fix locking problems introduced in CHKInsertSender
Modified: trunk/freenet/src/freenet/node/CHKInsertSender.java
===================================================================
--- trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-07-11 17:09:32 UTC
(rev 9562)
+++ trunk/freenet/src/freenet/node/CHKInsertSender.java 2006-07-11 17:44:10 UTC
(rev 9563)
@@ -195,14 +195,22 @@
return super.toString()+" for "+uid;
}
- public synchronized void run() {
- short origHTL = htl;
- node.addInsertSender(myKey, htl, this);
+ public void run() {
+ short origHTL;
+ synchronized (this) {
+ origHTL = htl;
+ }
+
+ node.addInsertSender(myKey, origHTL, this);
try {
realRun();
} catch (Throwable t) {
Logger.error(this, "Caught "+t, t);
- if(status == NOT_FINISHED)
+ int myStatus;
+ synchronized (this) {
+ myStatus = status;
+ }
+ if(myStatus == NOT_FINISHED)
finish(INTERNAL_ERROR, null);
} finally {
node.completed(uid);
@@ -522,13 +530,11 @@
private void finish(int code, PeerNode next) {
Logger.minor(this, "Finished: "+code+" on "+this, new
Exception("debug"));
-
+ setStatusTime = System.currentTimeMillis();
synchronized(this) {
- if(status != NOT_FINISHED)
+ if(status != NOT_FINISHED)
throw new IllegalStateException("finish() called with "+code+"
when was already "+status);
-
- setStatusTime = System.currentTimeMillis();
-
+
if((code == ROUTE_NOT_FOUND) && !sentRequest)
code = ROUTE_REALLY_NOT_FOUND;
@@ -537,25 +543,26 @@
notifyAll();
Logger.minor(this, "Set status code: "+getStatusString()+" on
"+uid);
-
- // Now wait for transfers, or for downstream transfer
notifications.
-
- if(cw != null) {
- while(!allTransfersCompleted) {
- try {
- wait(10*1000);
- } catch (InterruptedException e) {
- // Try again
- }
+ }
+ // Now wait for transfers, or for downstream transfer notifications.
+ if(cw != null) {
+ while(!allTransfersCompleted) {
+ try {
+ synchronized (this) {
+ wait(10*1000);
+ }
+ } catch (InterruptedException e) {
+ // Try again
}
- } else {
- Logger.minor(this, "No completion waiter");
- // There weren't any transfers
- allTransfersCompleted = true;
}
- notifyAll();
+ } else {
+ Logger.minor(this, "No completion waiter");
+ // There weren't any transfers
+ allTransfersCompleted = true;
}
-
+ synchronized (this) {
+ notifyAll();
+ }
Logger.minor(this, "Returning from finish()");
}
@@ -602,13 +609,13 @@
private void makeCompletionWaiter() {
Thread t;
- synchronized(this) {
- if(cw == null)
- cw = new CompletionWaiter();
- else
- return;
- t = new Thread(cw, "Completion waiter for "+uid);
- }
+
+ if(cw == null)
+ cw = new CompletionWaiter();
+ else
+ return;
+ t = new Thread(cw, "Completion waiter for "+uid);
+
t.setDaemon(true);
t.start();
}
@@ -814,7 +821,7 @@
}
}
- public synchronized boolean completed() {
+ public boolean completed() {
return allTransfersCompleted;
}