=== modified file 'lib/profiler/Profiler.cc'
--- lib/profiler/Profiler.cc	2012-01-20 18:55:04 +0000
+++ lib/profiler/Profiler.cc	2012-06-03 06:30:30 +0000
@@ -240,4 +240,26 @@
     xp_UNACCOUNTED->start = tt;
 }
 
+void
+XProfilerNode::stop()
+{
+    stopped_ = get_tick();
+
+    // calculate how long this timer was running.
+    hrtime_t delta = stopped_ - started_;
+
+    // kick initialization of timers statistics (just in case)
+    xprof_InitLib();
+
+    // Record timer details into global counters
+    xprof_stats_data * head = &(xprof_Timers[type_]->accu);
+    if (delta < head->best)
+        head->best = delta;
+    if (delta > head->worst)
+        head->worst = delta;
+    head->summ += delta;
+    head->count++;
+    head->overheads += get_tick() - stopped_;
+}
+
 #endif /* USE_XPROF_STATS */

=== modified file 'lib/profiler/Profiler.h'
--- lib/profiler/Profiler.h	2011-01-11 07:31:04 +0000
+++ lib/profiler/Profiler.h	2012-06-03 06:31:34 +0000
@@ -32,6 +32,7 @@
         hrtime_t worst;
         hrtime_t count;
         hrtime_t accum;
+        hrtime_t overheads;
         int64_t summ;
     };
 
@@ -47,12 +48,39 @@
     extern TimersArray *xprof_Timers;
 
     /* Exported functions */
-    extern void xprof_start(xprof_type type, const char *timer);
-    extern void xprof_stop(xprof_type type, const char *timer);
     extern void xprof_event(void *data);
 
-#define PROF_start(probename) xprof_start(XPROF_##probename, #probename)
-#define PROF_stop(probename) xprof_stop(XPROF_##probename, #probename)
+/*
+/// This class provides a thread-safe timer for use in code profiling
+/// Timer kicks off when the class is creaated and terminates on destruct
+/// or if stop() method is called explicitly.
+///
+/// Use PROF_start(name) and PROF_stop(name) macros
+*/
+class XProfilerNode
+{
+public:
+    XProfilerNode(xprof_type aType, const char *aName) : type_(aType), name_(aName), running_(true), overheads_(0) {
+        // init stopped to prevent negative times occuring if anything goes wrong.
+        stopped_ = started_ = get_tick();
+    }
+    ~XProfilerNode() { stop(); }
+
+    // stop the timer.
+    void stop();
+
+private:
+    xprof_type type_;     ///< which profile type to update when stopped
+    const char *name_;    ///< printable version of the timers type name
+    bool running_;        ///< whether this timer is still active, or been stopped already
+    hrtime_t started_;    ///< when this timer was started
+    hrtime_t stopped_;    ///< when this timer was stopped
+    hrtime_t overheads_;  ///< how much time has measurably been spent on profiler internal code.
+};
+
+#define PROF_start(probename) XProfilerNode XProfTimer_##probename(XPROF_##probename, #probename)
+// explicitly stop the timer. This is now optional.
+#define PROF_stop(probename) XProfTimer_##probename.stop()
 
 #endif /* USE_XPROF_STATS */
 

