summaryrefslogtreecommitdiffstats
path: root/3rdparty/openpgm-svn-r1085/pgm/include/impl/histogram.h
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/openpgm-svn-r1085/pgm/include/impl/histogram.h')
-rw-r--r--3rdparty/openpgm-svn-r1085/pgm/include/impl/histogram.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/histogram.h b/3rdparty/openpgm-svn-r1085/pgm/include/impl/histogram.h
new file mode 100644
index 0000000..92ddeb9
--- /dev/null
+++ b/3rdparty/openpgm-svn-r1085/pgm/include/impl/histogram.h
@@ -0,0 +1,129 @@
+/* vim:ts=8:sts=8:sw=4:noai:noexpandtab
+ *
+ * histograms.
+ *
+ * Copyright (c) 2009 Miru Limited.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#if !defined (__PGM_IMPL_FRAMEWORK_H_INSIDE__) && !defined (PGM_COMPILATION)
+# error "Only <framework.h> can be included directly."
+#endif
+
+#ifndef __PGM_IMPL_HISTOGRAM_H__
+#define __PGM_IMPL_HISTOGRAM_H__
+
+#include <pgm/types.h>
+#include <pgm/time.h>
+#include <impl/slist.h>
+#include <impl/string.h>
+
+PGM_BEGIN_DECLS
+
+typedef int pgm_sample_t;
+typedef int pgm_count_t;
+
+struct pgm_sample_set_t {
+ pgm_count_t* counts;
+ unsigned counts_len;
+ int64_t sum;
+ int64_t square_sum;
+};
+
+typedef struct pgm_sample_set_t pgm_sample_set_t;
+
+struct pgm_histogram_t {
+ const char* restrict histogram_name;
+ unsigned bucket_count;
+ pgm_sample_t declared_min;
+ pgm_sample_t declared_max;
+ pgm_sample_t* restrict ranges;
+ pgm_sample_set_t sample;
+ bool is_registered;
+ pgm_slist_t histograms_link;
+};
+
+typedef struct pgm_histogram_t pgm_histogram_t;
+
+#define PGM_HISTOGRAM_DEFINE(name, minimum, maximum, count) \
+ static pgm_count_t counts[ (count) ]; \
+ static pgm_sample_t ranges[ (count) + 1 ]; \
+ static pgm_histogram_t counter = { \
+ .histogram_name = (name), \
+ .bucket_count = (count), \
+ .declared_min = (minimum), \
+ .declared_max = (maximum), \
+ .ranges = ranges, \
+ .sample = { \
+ .counts = counts, \
+ .counts_len = (count), \
+ .sum = 0, \
+ .square_sum = 0 \
+ }, \
+ .is_registered = FALSE \
+ }
+
+#ifdef CONFIG_HISTOGRAMS
+
+# define PGM_HISTOGRAM_TIMES(name, sample) do { \
+ PGM_HISTOGRAM_DEFINE(name, pgm_msecs(1), pgm_secs(10), 50); \
+ if (!counter.is_registered) { \
+ memset (counts, 0, sizeof(counts)); \
+ memset (ranges, 0, sizeof(ranges)); \
+ pgm_histogram_init (&counter); \
+ } \
+ pgm_histogram_add_time (&counter, sample); \
+ } while (0)
+
+# define PGM_HISTOGRAM_COUNTS(name, sample) do { \
+ PGM_HISTOGRAM_DEFINE(name, 1, 1000000, 50); \
+ if (!counter.is_registered) { \
+ memset (counts, 0, sizeof(counts)); \
+ memset (ranges, 0, sizeof(ranges)); \
+ pgm_histogram_init (&counter); \
+ } \
+ pgm_histogram_add (&counter, (sample)); \
+ } while (0)
+
+#else /* !CONFIG_HISTOGRAMS */
+
+# define PGM_HISTOGRAM_TIMES(name, sample)
+# define PGM_HISTOGRAM_COUNTS(name, sample)
+
+#endif /* !CONFIG_HISTOGRAMS */
+
+
+extern pgm_slist_t* pgm_histograms;
+
+void pgm_histogram_init (pgm_histogram_t*);
+void pgm_histogram_add (pgm_histogram_t*, int);
+void pgm_histogram_write_html_graph_all (pgm_string_t*);
+
+static inline
+void
+pgm_histogram_add_time (
+ pgm_histogram_t*const histogram,
+ pgm_time_t sample_time
+ )
+{
+ pgm_histogram_add (histogram, (int)pgm_to_msecs (sample_time));
+}
+
+PGM_END_DECLS
+
+#endif /* __PGM_IMPL_HISTOGRAM_H__ */
+
+/* eof */