some fixes for performance measurments and added plot
diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
index 6638ac0..37ed4aa 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
@@ -360,8 +360,8 @@
 		List<Link> reverseLinks = linkStore.getReverseLinks(switchId, port.getPortNumber());
 		links.addAll(reverseLinks);
 
+		PerformanceMonitor.stop("SwitchPortRemoved.DbAccess");
 		if (swStore.deletePort(HexString.toHexString(switchId), port.getPortNumber())) {
-		    PerformanceMonitor.stop("SwitchPortRemoved.DbAccess");
 		    PerformanceMonitor.start("SwitchPortRemoved.NotificationSend");
 		    // TODO publish DELETE_PORT event here
 		    TopologyElement topologyElement =
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
index 50834d2..55aeb97 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/ParallelFlowDatabaseOperation.java
@@ -268,7 +268,7 @@
 	    PerformanceMonitor.Measurement m;
 	    m = PerformanceMonitor.start(tag1);
 	    boolean success = FlowDatabaseOperation.addFlow(dbHandler, flowPath);
-	    PerformanceMonitor.stop(tag1);
+//	    PerformanceMonitor.stop(tag1);
 	    m.stop();
 	    m = PerformanceMonitor.start(tag2);
 	    if(success) {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
index 7c38a3c..fa75460 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/PerformanceMonitor.java
@@ -54,13 +54,11 @@
     public static void stop(String tag) {
 	long time = System.nanoTime();
 	List<Measurement> list = map.get(tag);
-	if(list == null) {
+	if(list == null || list.size() == 0) {
 	    log.error("Tag {} does not exist", tag);
 	}
-	else if(list.size() == 1) {
-	    list.get(0).stop(time);
-	}
-	else {
+	list.get(0).stop(time);
+	if(list.size() > 1) {
 	    log.error("Tag {} has multiple measurements", tag);
 	}
 	overhead += System.nanoTime() - time;
@@ -92,6 +90,9 @@
 	    int total = 0, count = 0;
 	    long start = Long.MAX_VALUE, stop = -1;
 	    for(Measurement m : list) {
+		if(m.stop < 0) {
+		    continue; // measurement has not been stopped
+		}
 		// Collect overall start and end times
 		if(m.start < start) {
 		    start = m.start;
@@ -101,8 +102,7 @@
 		    if(stop > experimentEnd) {
 			experimentEnd = stop;
 		    }
-		}
-		
+		}		
 		// Collect statistics for average
 		total += m.elapsed();
 		count++;
@@ -155,7 +155,9 @@
 	 * Start the measurement
 	 */
 	public void start() {
-	    start = System.nanoTime();
+	    if(start <= 0) {
+		start = System.nanoTime();
+	    }
 	}
 	
 	/**
@@ -171,7 +173,9 @@
 	 * @param time to stop
 	 */
 	public void stop(long time){
-	    stop = time;
+	    if(stop <= 0) {
+		stop = time;
+	    }
 	}
 	
 	/**
@@ -217,15 +221,24 @@
 	    report();
 	    clear();
 	}
-//	for(int i = 0; i < 100; i++){
-//	    tag = "a";
-//	    start(tag); stop(tag);
-//	    tag = "b";
-//	    start(tag); stop(tag);
-//	    tag = "c";
-//	    start(tag); stop(tag);
-//	    report();
-//	    clear();
-//	}
+	for(int i = 0; i < 100; i++){
+	    tag = "a";
+	    start(tag); stop(tag);
+	    start(tag); stop(tag);
+
+	    start(tag); stop(tag);
+	    start(tag); stop(tag);
+	    start(tag); stop(tag);
+	    start(tag); stop(tag);
+	    start(tag); stop(tag);
+	    start(tag); stop(tag);
+
+	    tag = "b";
+	    start(tag); stop(tag);
+	    tag = "c";
+	    start(tag); stop(tag);
+	    report();
+	    clear();
+	}
     }
 }