Browse Source

updated

pull/572/head
hypnosis-i2p 8 years ago
parent
commit
a3286ebac3
  1. 82
      android/src/org/purplei2p/i2pd/DaemonSingleton.java
  2. 7
      android/src/org/purplei2p/i2pd/I2PD.java

82
android/src/org/purplei2p/i2pd/DaemonSingleton.java

@ -18,7 +18,7 @@ public class DaemonSingleton {
public synchronized void addStateChangeListener(StateChangeListener listener) { stateChangeListeners.add(listener); } public synchronized void addStateChangeListener(StateChangeListener listener) { stateChangeListeners.add(listener); }
public synchronized void removeStateChangeListener(StateChangeListener listener) { stateChangeListeners.remove(listener); } public synchronized void removeStateChangeListener(StateChangeListener listener) { stateChangeListeners.remove(listener); }
public void stopAcceptingTunnels() { public synchronized void stopAcceptingTunnels() {
if(isStartedOkay()){ if(isStartedOkay()){
state=State.gracefulShutdownInProgress; state=State.gracefulShutdownInProgress;
fireStateChange(); fireStateChange();
@ -39,35 +39,45 @@ public class DaemonSingleton {
public State getState() { return state; } public State getState() { return state; }
{ {
fireStateChange(); synchronized(this){
new Thread(new Runnable(){ fireStateChange();
new Thread(new Runnable(){
@Override
public void run() { @Override
try { public void run() {
I2PD_JNI.loadLibraries(); try {
state = State.jniLibraryLoaded; I2PD_JNI.loadLibraries();
fireStateChange(); synchronized (DaemonSingleton.this) {
} catch (Throwable tr) { state = State.jniLibraryLoaded;
lastThrowable=tr; fireStateChange();
state = State.startFailed; }
fireStateChange(); } catch (Throwable tr) {
return; lastThrowable=tr;
} synchronized (DaemonSingleton.this) {
try { state = State.startFailed;
daemonStartResult = I2PD_JNI.startDaemon(); fireStateChange();
if("ok".equals(daemonStartResult)){state=State.startedOkay;setStartedOkay(true);} }
else state=State.startFailed; return;
fireStateChange(); }
} catch (Throwable tr) { try {
lastThrowable=tr; synchronized (DaemonSingleton.this) {
state = State.startFailed; daemonStartResult = I2PD_JNI.startDaemon();
fireStateChange(); if("ok".equals(daemonStartResult)){state=State.startedOkay;setStartedOkay(true);}
return; else state=State.startFailed;
fireStateChange();
}
} catch (Throwable tr) {
lastThrowable=tr;
synchronized (DaemonSingleton.this) {
state = State.startFailed;
fireStateChange();
}
return;
}
} }
}
}, "i2pdDaemonStart").start(); }, "i2pdDaemonStart").start();
}
} }
private Throwable lastThrowable; private Throwable lastThrowable;
private String daemonStartResult="N/A"; private String daemonStartResult="N/A";
@ -91,15 +101,21 @@ public class DaemonSingleton {
return daemonStartResult; return daemonStartResult;
} }
public synchronized boolean isStartedOkay() { private final Object startedOkayLock = new Object();
return startedOkay;
public boolean isStartedOkay() {
synchronized (startedOkayLock) {
return startedOkay;
}
} }
private synchronized void setStartedOkay(boolean startedOkay) { private void setStartedOkay(boolean startedOkay) {
this.startedOkay = startedOkay; synchronized (startedOkayLock) {
this.startedOkay = startedOkay;
}
} }
public void stopDaemon() { public synchronized void stopDaemon() {
if(isStartedOkay()){ if(isStartedOkay()){
try {I2PD_JNI.stopDaemon();}catch(Throwable tr){Log.e(TAG, "", tr);} try {I2PD_JNI.stopDaemon();}catch(Throwable tr){Log.e(TAG, "", tr);}
setStartedOkay(false); setStartedOkay(false);

7
android/src/org/purplei2p/i2pd/I2PD.java

@ -5,8 +5,6 @@ import java.io.StringWriter;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import org.purplei2p.i2pd.DaemonSingleton.State;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.ComponentName; import android.content.ComponentName;
@ -76,8 +74,9 @@ public class I2PD extends Activity {
private void localDestroy() { private void localDestroy() {
textView = null; textView = null;
daemon.removeStateChangeListener(daemonStateChangeListener); daemon.removeStateChangeListener(daemonStateChangeListener);
if(getGracefulQuitTimer()!=null) { Timer gracefulQuitTimer = getGracefulQuitTimer();
getGracefulQuitTimer().cancel(); if(gracefulQuitTimer!=null) {
gracefulQuitTimer.cancel();
setGracefulQuitTimer(null); setGracefulQuitTimer(null);
} }
try{ try{

Loading…
Cancel
Save