genericopenlibs/liboil/src/liboilprofile.c
changeset 18 47c74d1534e1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/liboil/src/liboilprofile.c	Fri Apr 16 16:46:38 2010 +0300
@@ -0,0 +1,185 @@
+/*
+ * LIBOIL - Library of Optimized Inner Loops
+ * Copyright (c) 2003,2004 David A. Schleef <ds@schleef.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+//Portions Copyright (c)  2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <liboil/liboilprofile.h>
+#include <liboil/liboildebug.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <time.h>
+#include <string.h>
+#include <math.h>
+
+#ifdef __SYMBIAN32__
+#ifdef __ARMCC__
+#pragma diag_remark 68
+#endif//__ARMCC__
+#endif//__SYMBIAN32__
+
+/**
+ * SECTION:liboilprofile
+ * @title:OilProfile
+ * @short_description:
+ * Measuring the length of time needed to execute Liboil functions.
+ *
+ */
+
+/**
+ * oil_profile_init:
+ * @prof: the OilProfile structure
+ *
+ * Initializes a profiling structure.
+ */
+#ifdef __SYMBIAN32__
+EXPORT_C
+#endif
+void
+oil_profile_init (OilProfile *prof)
+{
+  memset(prof, 0, sizeof(OilProfile));
+
+  prof->min = -1;
+
+}
+
+/**
+ * oil_profile_stop_handle:
+ * @prof: the OilProfile structure
+ *
+ * Handles post-processing of a single profiling run.
+ *
+ * FIXME: need more info
+ */
+ #ifdef __SYMBIAN32__
+EXPORT_C
+#endif
+void
+oil_profile_stop_handle (OilProfile *prof)
+{
+  int i;
+
+  prof->last = prof->stop - prof->start;
+
+  prof->total += prof->last;
+  prof->n++;
+
+  if (prof->last < prof->min) prof->min = prof->last;
+  
+  for(i=0;i<prof->hist_n;i++) {
+    if (prof->last == prof->hist_time[i]) {
+      prof->hist_count[i]++;
+      break;
+    }
+  }
+  if (i == prof->hist_n && prof->hist_n < OIL_PROFILE_HIST_LENGTH) {
+    prof->hist_time[prof->hist_n] = prof->last;
+    prof->hist_count[prof->hist_n] = 1;
+    prof->hist_n++;
+  }
+}
+
+/**
+ * oil_profile_get_ave_std:
+ * @prof: the OilProfile structure
+ * @ave_p: pointer to average
+ * @std_p: pointer to standard deviation
+ *
+ * Calculates the average and standard deviation of a number of
+ * profiling runs, and places the results in the locations
+ * provided by @ave_p and @std_p.  Either @ave_p and @std_p may
+ * be NULL, in which case the values will not be written.
+ */
+ #ifdef __SYMBIAN32__
+EXPORT_C
+#endif
+void
+oil_profile_get_ave_std (OilProfile *prof, double *ave_p, double *std_p)
+{
+  double ave;
+  double std;
+  int max_i;
+  double off;
+  double s;
+  double s2;
+  int i;
+  int n;
+  double x;
+
+  do {
+    s = s2 = 0;
+    n = 0;
+    max_i = -1;
+    for(i=0;i<10;i++){
+      x = prof->hist_time[i];
+      s2 += x * x * prof->hist_count[i];
+      s += x * prof->hist_count[i];
+      n += prof->hist_count[i];
+      if (prof->hist_count[i] > 0) {
+        if (max_i == -1 || prof->hist_time[i] > prof->hist_time[max_i]) {
+          max_i = i;
+        }
+      }
+    }
+
+    ave = s / n;
+    std = sqrt (s2 - s * s / n + n*n) / (n-1);
+    off = (prof->hist_time[max_i] - ave)/std;
+
+    if (off > 4.0) {
+      prof->hist_count[max_i] = 0;
+    }
+  } while (off > 4.0);
+
+  if (ave_p) *ave_p = ave;
+  if (std_p) *std_p = std;
+}
+
+unsigned long (*_oil_profile_stamp)(void);
+
+/**
+ * oil_profile_stamp:
+ *
+ * Creates a timestamp based on a CPU-specific high-frequency
+ * counter, if available.
+ *
+ * Returns: a timestamp
+ */
+ #ifdef __SYMBIAN32__
+EXPORT_C
+#endif
+unsigned long
+oil_profile_stamp (void)
+{
+  return _oil_profile_stamp();
+}
+