Author: bdonlan
Date: 2005-01-13 20:26:12 -0500 (Thu, 13 Jan 2005)
New Revision: 596
Modified:
trunk/misc/javer/
trunk/misc/javer/TODO
trunk/misc/javer/src/javer/HaverClient.java
trunk/misc/javer/src/javer/JaverUIPanel.form
trunk/misc/javer/src/javer/JaverUIPanel.java
trunk/misc/javer/src/javer/NonblockingOutputStream.java
Log:
[EMAIL PROTECTED]: bdonlan | 2005-01-13 20:25:15 -0500
Finish lagmeter implementation
Property changes on: trunk/misc/javer
___________________________________________________________________
Name: svk:merge
- 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk/misc/javer:16414
+ 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk/misc/javer:16420
Modified: trunk/misc/javer/TODO
===================================================================
--- trunk/misc/javer/TODO 2005-01-13 20:06:15 UTC (rev 595)
+++ trunk/misc/javer/TODO 2005-01-14 01:26:12 UTC (rev 596)
@@ -3,6 +3,5 @@
* Logging and menus for standalone client
* SSL!
* Colors
-* POKE lagchecking
* /set to disable e.g. .commands, ;emotes, etc
* Synchronous-response API for the client
Modified: trunk/misc/javer/src/javer/HaverClient.java
===================================================================
--- trunk/misc/javer/src/javer/HaverClient.java 2005-01-13 20:06:15 UTC (rev
595)
+++ trunk/misc/javer/src/javer/HaverClient.java 2005-01-14 01:26:12 UTC (rev
596)
@@ -23,8 +23,27 @@
protected java.util.Map fails = new java.util.HashMap();
protected String uid = null;
protected Integer lock = new Integer(0);
- Pinger pingDaemon = null;
+ protected Pinger pingDaemon = null;
+ protected List lagEvents = null;
+ protected void pushLagEvent() {
+ lagEvents.add(new Long(System.currentTimeMillis()));
+ if (pingDaemon != null)
+ pingDaemon.serverPoked();
+ }
+
+ protected void popLagEvent() {
+ try {
+ Long then = (Long)lagEvents.remove(0);
+ long delta = System.currentTimeMillis() - then.longValue();
+ eventLagMeasured(delta);
+ } catch (IOException e) {
+ eventIOException(e);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
protected void send(String s) throws java.io.IOException {
synchronized (lock) {
if (sock == null) {
@@ -74,7 +93,7 @@
));
send("HAVER\t" + versionString);
start();
- pingDaemon = new Pinger(0, 0);
+ lagEvents = new java.util.LinkedList();
}
public String getUID() {
@@ -142,6 +161,7 @@
fails.put("MSG", new FailHandler() {
public void failure(String why, String[] args) throws
java.io.IOException {
eventPublicFailed(why, args);
+ popLagEvent();
}
});
}
@@ -175,6 +195,8 @@
public void trigger(String[] args) throws java.io.IOException {
String[] msgArgs = subStringArray(args, 4, args.length - 1);
eventMessage(args[1], args[2], args[3], msgArgs);
+ if (args[2].equals(uid))
+ popLagEvent();
}
});
serverevents.put("PMSG", new ServerHandler() {
@@ -196,6 +218,7 @@
public void trigger(String[] args) throws java.io.IOException {
if (args[2].equals(uid)) {
eventChannelPart(args[1]);
+ //popLagEvent();
} else {
eventChannelPart(args[1], args[2]);
}
@@ -217,6 +240,7 @@
s.add(args[i]);
}
eventChannelList(args[1], s);
+ //popLagEvent();
}
});
serverevents.put("FAIL", new ServerHandler() {
@@ -236,7 +260,7 @@
});
serverevents.put("OUCH", new ServerHandler() {
public void trigger(String[] args) throws java.io.IOException {
- long pingtime = Integer.decode(args[1]).intValue();
+ long pingtime = Long.decode(args[2]).longValue();
long lag = System.currentTimeMillis() - pingtime;
eventLagMeasured(lag);
}
@@ -363,6 +387,7 @@
public void sendMessage(String where, String type, String message) throws
IOException {
send("MSG\t" + where + "\t" + type + "\t" + message);
+ pushLagEvent();
}
public void sendMessage(String where, String type, String[] message)
throws IOException {
@@ -426,6 +451,12 @@
}
}
+ public void pokeServer() throws IOException {
+ send("POKE\t" + System.currentTimeMillis());
+ if (pingDaemon != null)
+ pingDaemon.serverPoked();
+ }
+
/**
* Called when an I/O exception is detected internally, or caught from
* within an event handler.
@@ -461,52 +492,56 @@
public void run() {
while (true) {
- synchronized(this) {
- this.interrupted(); /* we don't care if we're interrupted
- * but we need the flag cleared
- */
- if (halting)
- return;
- long nextPing = Long.MAX_VALUE;
- long nextDead = Long.MAX_VALUE;
- long nextEvt;
- long now = System.currentTimeMillis();
- long delta;
- if (pingInterval > 0)
- nextPing = lastPing + pingInterval;
- else {
- halting = true;
- return;
- }
- if (deadInterval > 0)
- nextDead = lastPong + deadInterval;
- if (nextPing < nextDead)
- nextEvt = nextPing;
- else
- nextEvt = nextDead;
- if (now < nextPing) {
- try {
- send("POKE\t" + now);
- } catch (IOException e) {
- eventIOException(e);
- }
- nextPing = now + pingInterval;
- continue;
+ long delta = 0;
+ this.interrupted(); /* we don't care if we're interrupted
+ * but we need the flag cleared
+ */
+ if (halting)
+ return;
+ long nextPing = Long.MAX_VALUE;
+ long nextDead = Long.MAX_VALUE;
+ long nextEvt;
+ long now = System.currentTimeMillis();
+ if (pingInterval > 0)
+ nextPing = lastPing + pingInterval;
+ else {
+ halting = true;
+ return;
+ }
+ if (deadInterval > 0)
+ nextDead = lastPong + deadInterval;
+
+ if (nextPing < nextDead)
+ nextEvt = nextPing;
+ else
+ nextEvt = nextDead;
+ System.out.println("lastPing=" + lastPing + " lastPong=" +
lastPong);
+ System.out.println("nextPing = " + nextPing + " nextDead = " +
nextDead + " nextEvt=" + nextEvt);
+ System.out.println("Now = " + now);
+ System.out.println("p="+nextPing+"\nn="+now);
+ if (now >= nextPing) {
+ try {
+ pokeServer();
+ } catch (IOException e) {
+ eventIOException(e);
}
- if (now < nextDead) {
- try {
- eventServerDead();
- } catch (IOException e) {
- eventIOException(e);
- }
- lastPong = Long.MAX_VALUE;
- continue;
+ nextPing = now + pingInterval;
+ continue;
+ }
+ if (now >= nextDead) {
+ try {
+ eventServerDead();
+ } catch (IOException e) {
+ eventIOException(e);
}
- delta = now - nextEvt;
- try {
- this.sleep(delta);
- } catch(InterruptedException e) {}
+ lastPong = now + deadInterval;
+ continue;
}
+ delta = nextEvt - now;
+ try {
+ System.out.println("Sleeping for " + delta +"ms");
+ this.sleep(delta);
+ } catch(InterruptedException e) {}
}
}
@@ -526,7 +561,7 @@
public void setPingInterval(int pingInterval) {
if (pingInterval < 0)
throw new IllegalArgumentException("pingInterval must not be
negative");
- if (deadInterval < pingInterval)
+ if (deadInterval > pingInterval)
throw new IllegalArgumentException("pingInterval should be
greater than deadInterval");
synchronized (this) {
this.pingInterval = pingInterval;
@@ -578,7 +613,7 @@
}
public Pinger(int pingInterval, int deadInterval) {
- lastPing = System.currentTimeMillis();
+ lastPing = lastPong = System.currentTimeMillis();
setPingInterval(pingInterval);
setDeadInterval(deadInterval);
}
@@ -604,6 +639,12 @@
lastPong = System.currentTimeMillis();
}
}
+
+ public void serverPoked() {
+ synchronized (this) {
+ lastPing = System.currentTimeMillis();
+ }
+ }
public void start() {
if (this == Thread.currentThread())
@@ -633,12 +674,16 @@
}
public void setPingTimers(int pingInterval, int deadInterval) {
+ if (pingDaemon == null) {
+ pingDaemon = new Pinger(pingInterval * 1000, deadInterval * 1000);
+ return;
+ }
pingDaemon.setDeadInterval(0); /* XXX: prevent exception when new
* deadInterval > old pingInterval
* needs to be cleaner
*/
- pingDaemon.setPingInterval(pingInterval);
- pingDaemon.setDeadInterval(deadInterval);
+ pingDaemon.setPingInterval(pingInterval * 1000);
+ pingDaemon.setDeadInterval(deadInterval * 1000);
}
}
Modified: trunk/misc/javer/src/javer/JaverUIPanel.form
===================================================================
--- trunk/misc/javer/src/javer/JaverUIPanel.form 2005-01-13 20:06:15 UTC
(rev 595)
+++ trunk/misc/javer/src/javer/JaverUIPanel.form 2005-01-14 01:26:12 UTC
(rev 596)
@@ -18,6 +18,10 @@
<Layout
class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
</Container>
<Container class="javax.swing.JPanel" name="jPanel2">
+ <AuxValues>
+ <AuxValue name="JavaCodeGenerator_VariableModifier"
type="java.lang.Integer" value="0"/>
+ <AuxValue name="JavaCodeGenerator_VariableLocal"
type="java.lang.Boolean" value="true"/>
+ </AuxValues>
<Constraints>
<Constraint
layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"
value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
@@ -37,14 +41,32 @@
<EventHandler event="keyTyped"
listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent"
handler="inputKeyTyped"/>
</Events>
</Component>
- <Component class="javax.swing.JLabel" name="status">
- <Properties>
- <Property name="text" type="java.lang.String" value="NOT
CONNECTED"/>
- <Property name="minimumSize" type="java.awt.Dimension"
editor="org.netbeans.beaninfo.editors.DimensionEditor">
- <Dimension value="[300, 300]"/>
- </Property>
- </Properties>
- </Component>
+ <Container class="javax.swing.JPanel" name="jPanel1">
+ <AuxValues>
+ <AuxValue name="JavaCodeGenerator_VariableModifier"
type="java.lang.Integer" value="0"/>
+ <AuxValue name="JavaCodeGenerator_VariableLocal"
type="java.lang.Boolean" value="true"/>
+ </AuxValues>
+
+ <Layout
class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
+ <Property name="columns" type="int" value="2"/>
+ <Property name="rows" type="int" value="1"/>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="status">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="NOT
CONNECTED"/>
+ <Property name="minimumSize" type="java.awt.Dimension"
editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[300, 300]"/>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="lagLabel">
+ <Properties>
+ <Property name="horizontalAlignment" type="int" value="4"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
</SubComponents>
</Container>
</SubComponents>
Modified: trunk/misc/javer/src/javer/JaverUIPanel.java
===================================================================
--- trunk/misc/javer/src/javer/JaverUIPanel.java 2005-01-13 20:06:15 UTC
(rev 595)
+++ trunk/misc/javer/src/javer/JaverUIPanel.java 2005-01-14 01:26:12 UTC
(rev 596)
@@ -123,6 +123,8 @@
putServer("Logged in successfully.");
status.setText("Connected.");
super.eventIdentAccepted();
+ setPingTimers(60, 180);
+ pokeServer();
}
protected void eventIdenting() throws java.io.IOException {
@@ -293,6 +295,18 @@
super.eventDisconnected();
}
+ protected void eventServerDead() throws IOException {
+ putServer("Server seems to be dead, killing connection.");
+ do_disconnect();
+ super.eventServerDead();
+ }
+
+ protected void eventLagMeasured(long lag) throws IOException {
+ double dlag = lag / 1000.0;
+ lagLabel.setText("Current lag: " + dlag);
+ super.eventLagMeasured(lag);
+ }
+
}
@@ -302,6 +316,9 @@
}
public void do_disconnect() {
+ /* XXX: split this into disconnect-performing and after-disconnect
+ * functions
+ */
Set pairs = new java.util.HashSet(tabs.values());
Iterator it = pairs.iterator();
while (it.hasNext()) {
@@ -319,6 +336,7 @@
"Enter your UID to begin."
);
status.setText("NOT CONNECTED");
+ lagLabel.setText("");
}
/** This method is called from within the constructor to
@@ -327,10 +345,15 @@
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
+ javax.swing.JPanel jPanel1;
+ javax.swing.JPanel jPanel2;
+
jTabbedPane1 = new javax.swing.JTabbedPane();
jPanel2 = new javax.swing.JPanel();
input = new javax.swing.JTextField();
+ jPanel1 = new javax.swing.JPanel();
status = new javax.swing.JLabel();
+ lagLabel = new javax.swing.JLabel();
setLayout(new java.awt.BorderLayout());
@@ -354,10 +377,17 @@
jPanel2.add(input);
+ jPanel1.setLayout(new java.awt.GridLayout(1, 2));
+
status.setText("NOT CONNECTED");
status.setMinimumSize(new java.awt.Dimension(300, 300));
- jPanel2.add(status);
+ jPanel1.add(status);
+ lagLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
+ jPanel1.add(lagLabel);
+
+ jPanel2.add(jPanel1);
+
add(jPanel2, java.awt.BorderLayout.SOUTH);
}//GEN-END:initComponents
@@ -549,8 +579,8 @@
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTextField input;
- private javax.swing.JPanel jPanel2;
private javax.swing.JTabbedPane jTabbedPane1;
+ private javax.swing.JLabel lagLabel;
private javax.swing.JLabel status;
// End of variables declaration//GEN-END:variables
Modified: trunk/misc/javer/src/javer/NonblockingOutputStream.java
===================================================================
--- trunk/misc/javer/src/javer/NonblockingOutputStream.java 2005-01-13
20:06:15 UTC (rev 595)
+++ trunk/misc/javer/src/javer/NonblockingOutputStream.java 2005-01-14
01:26:12 UTC (rev 596)
@@ -161,6 +161,7 @@
}
protected void dump() {
+ /*
System.out.println("=== NonblockingOutputStream status:");
synchronized(th) {
System.out.println("Flags: flushing="+flushing+"
closing="+closing+" autoflush="+autoflush);
@@ -175,6 +176,7 @@
}
System.out.println("Stack trace:");
new Exception().printStackTrace();
+ */
}
public void write(int b) throws IOException {