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 {


Reply via email to