diff -r e4d67989cc36 -r 47c74d1534e1 genericopenlibs/liboil/src/liboilprofile.c --- /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 + * 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 +#endif + +#include +#include + +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#include +#include + +#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;ihist_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(); +} +