summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--grapher/Graph.cxx55
-rw-r--r--grapher/Graph.hxx2
-rw-r--r--grapher/GraphWidget.cxx25
-rw-r--r--grapher/GraphWidget.hxx1
-rw-r--r--grapher/Time.hxx83
5 files changed, 96 insertions, 70 deletions
diff --git a/grapher/Graph.cxx b/grapher/Graph.cxx
index dc808fa4..27b6a24f 100644
--- a/grapher/Graph.cxx
+++ b/grapher/Graph.cxx
@@ -19,7 +19,9 @@ using namespace std::tr1;
GraphDataList GraphDataBase::graphData;
sigc::signal<void> GraphDataBase::graphDataChanged;
-
+
+int64_t Graph::_currentTime = 0;
+
Graph::Graph(double x, double y)
: _width(600), _height(200), _graphX(0), _graphY(0),
_graphWidth(580), _graphHeight(180),
@@ -39,55 +41,10 @@ void Graph::draw(Cairo::RefPtr<Cairo::Context> cr)
if (_autoScaling)
{
- // line separation
- int linesPossible = (int)(_graphWidth / (_lineWidth + 2.0));
// Find latest time.
- int64_t latestTime = 0;
- for (GraphDataList::iterator ditr = _datasets.begin(),
- de = _datasets.end();
- ditr != de;
- ++ditr)
- {
- if (!(*ditr)->times.empty())
- {
- int64_t lastDataTime = (*ditr)->times.back();
- if (lastDataTime > latestTime)
- latestTime = lastDataTime;
- }
- }
- int64_t minDiff = 0;
- int64_t maxTotal = 0;
- for (GraphDataList::iterator ditr = _datasets.begin(),
- de = _datasets.end();
- ditr != de;
- ++ditr)
- {
- GraphDataBase::TimeList& gtimes = (*ditr)->times;
- if (gtimes.size() <= 1)
- continue;
- double totalDiff = 0.0;
- for (GraphDataBase::TimeList::reverse_iterator ritr = gtimes.rbegin(),
- re = gtimes.rend();
- ritr + 1 != gtimes.rend();
- ritr++)
- {
- int64_t timeDiff = *ritr - *(ritr + 1);
- if (timeDiff < minDiff || (timeDiff != 0 && minDiff == 0))
- minDiff = timeDiff;
- if (minDiff != 0
- && ((totalDiff + timeDiff) / minDiff + 1) > linesPossible)
- break;
- totalDiff += timeDiff;
- }
- if (totalDiff > maxTotal)
- maxTotal = totalDiff;
- }
- // Now we have a global scale.
- _right = latestTime;
- if (maxTotal != 0)
- _left = latestTime - maxTotal;
- else
- _left = _right - 1;
+ _right = _currentTime / 1000;
+ // Assume 1 pixel = 5 milliseconds
+ _left = _right - 5000;
}
cr->save();
double horizScale
diff --git a/grapher/Graph.hxx b/grapher/Graph.hxx
index efabd22d..d9f615b3 100644
--- a/grapher/Graph.hxx
+++ b/grapher/Graph.hxx
@@ -50,12 +50,14 @@ public:
GraphDataList& getDatasets() { return _datasets; }
int64_t getTimeAtPoint(double x);
void window2GraphCoords(double x, double y, double& xgraph, double& ygraph);
+ static void setCurrentTime(int64_t time) { _currentTime = time; }
protected:
GraphDataList _datasets;
int64_t _left;
int64_t _right;
double _top;
double _bottom;
+ static int64_t _currentTime;
};
}
#endif
diff --git a/grapher/GraphWidget.cxx b/grapher/GraphWidget.cxx
index db7493fb..be1ebdcd 100644
--- a/grapher/GraphWidget.cxx
+++ b/grapher/GraphWidget.cxx
@@ -23,6 +23,7 @@
#include "GraphWidget.hxx"
#include "CairoWidget.hxx"
+#include "Time.hxx"
namespace systemtap
{
@@ -33,7 +34,7 @@ using namespace std::tr1;
GraphWidget::GraphWidget()
: _trackingDrag(false), _width(600), _height(200), _mouseX(0.0),
- _mouseY(0.0), _globalTimeBase(0), _timeBaseInitialized(false)
+ _mouseY(0.0), _globalTimeBase(Time::getAbs() / 1000)
{
add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK
| Gdk::BUTTON_RELEASE_MASK | Gdk::SCROLL_MASK);
@@ -157,27 +158,11 @@ bool GraphWidget::on_expose_event(GdkEventExpose* event)
cr->save();
cr->set_source_rgba(0.0, 0.0, 0.0, 1.0);
cr->paint();
- if (!_timeBaseInitialized && !getGraphData().empty())
- {
- GraphDataList& graphData = getGraphData();
- int64_t earliest = INT64_MAX;
- for (GraphDataList::iterator gd = graphData.begin(),
- end = graphData.end();
- gd != end;
- ++gd)
- {
- if (!(*gd)->times.empty() && (*gd)->times[0] < earliest)
- earliest = (*gd)->times[0];
- }
- if (earliest != INT64_MAX)
- {
- _globalTimeBase = earliest;
- _timeBaseInitialized = true;
- }
- }
+ int64_t currentTime = Time::getAbs();
+ Graph::setCurrentTime(currentTime);
for (GraphList::iterator g = _graphs.begin(); g != _graphs.end(); ++g)
{
- if (_displayRelativeTimes && _timeBaseInitialized)
+ if (_displayRelativeTimes)
(*g)->_timeBase = _globalTimeBase;
else
(*g)->_timeBase = 0.0;
diff --git a/grapher/GraphWidget.hxx b/grapher/GraphWidget.hxx
index f90da361..f2801cd2 100644
--- a/grapher/GraphWidget.hxx
+++ b/grapher/GraphWidget.hxx
@@ -81,7 +81,6 @@ protected:
double _mouseX;
double _mouseY;
int64_t _globalTimeBase;
- bool _timeBaseInitialized;
std::tr1::shared_ptr<Graph> getGraphUnderPoint(double x, double y);
void establishHoverTimeout();
Gtk::CheckButton* _relativeTimesButton;
diff --git a/grapher/Time.hxx b/grapher/Time.hxx
new file mode 100644
index 00000000..7e16b7b2
--- /dev/null
+++ b/grapher/Time.hxx
@@ -0,0 +1,83 @@
+// systemtap grapher
+// Copyright (C) 2009 Red Hat Inc.
+//
+// This file is part of systemtap, and is free software. You can
+// redistribute it and/or modify it under the terms of the GNU General
+// Public License (GPL); either version 2, or (at your option) any
+// later version.
+
+#ifndef SYSTEMTAP_GRAPHER_TIME_HXX
+#define SYSTEMTAP_GRAPHER_TIME_HXX 1
+
+#include <stdint.h>
+#include <sys/time.h>
+
+namespace systemtap
+{
+
+template<typename T>
+class Singleton
+{
+public:
+ static T& instance()
+ {
+ static T _instance;
+ return _instance;
+ }
+protected:
+ Singleton() {}
+private:
+ // Insure that singleton is constructed before main() is called.
+ struct InstanceBuilder
+ {
+ InstanceBuilder()
+ {
+ instance();
+ }
+ };
+ static InstanceBuilder _instanceBuilder;
+};
+
+template<typename T>
+typename Singleton<T>::InstanceBuilder Singleton<T>::_instanceBuilder;
+
+class Time : public Singleton<Time>
+{
+public:
+ Time()
+ : origin(0)
+ {
+ origin = getTime();
+ }
+
+ int64_t getTime()
+ {
+ timeval tval;
+ gettimeofday(&tval, 0);
+ int64_t now = toUs(tval);
+ return now - origin;
+ }
+
+ static int64_t get()
+ {
+ return instance().getTime();
+ }
+
+ static int64_t getAbs()
+ {
+ timeval tval;
+ gettimeofday(&tval, 0);
+ return toUs(tval);
+ }
+
+ static int64_t toUs(const timeval& t)
+ {
+ int64_t result = t.tv_sec * 1000000;
+ result += t.tv_usec;
+ return result;
+ }
+
+ int64_t origin;
+};
+}
+#endif