/*
 * The contents of this file are subject to the Netscape Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/NPL/

 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.

 * The Original Code is Rhino code, released
 * May 6, 1999.

 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1997-1999 Netscape Communications Corporation. All
 * Rights Reserved.

 * Contributor(s): 

 * Alternatively, the contents of this file may be used under the
 * terms of the GNU Public License (the "GPL"), in which case the
 * provisions of the GPL are applicable instead of those above.
 * If you wish to allow use of your version of this file only
 * under the terms of the GPL and not to allow others to use your
 * version of this file under the NPL, indicate your decision by
 * deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL.  If you do not delete
 * the provisions above, a recipient may use your version of this
 * file under either the NPL or the GPL.
 */
#ifdef PROFILE
/* Header files */
#include <vxWorks.h>
#include <tickLib.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "js-utils.h"
#include "js-profilep.h"

/* Internal data */
static	jsProfile_t	*profiles = NULL;

/* Procedures */
void
JS_EnterFunction(jsString_t name)
{
    jsProfile_t *p;

    for (p = profiles; p != NULL; p = p->next) {
	if (strcmp(p->name, name) == 0) {
	    break;
	}
    }
    if (p == NULL) {
	p = (jsProfile_t *) malloc(sizeof (*p));
	p->name = (jsString_t) malloc(sizeof (*p->name) * (strlen(name) + 1));
	strcpy(p->name, name);
	p->calls = 0;
 	p->ticks = 0;
	p->next = profiles;
	profiles = p;
    } else if (p->clockOn) {
	fprintf(stderr, "Clock already started: %s\n", name);
	return;
    }
    p->clockOn = TRUE;
    p->lastTime = tickGet();
    p->calls += 1;
}
void
JS_ExitFunction(jsString_t name)
{
    jsProfile_t *p;
    int	ticks = tickGet();

    for (p = profiles; p != NULL; p = p->next) {
        if (strcmp(p->name, name) == 0) {
            break;
        }
    }
    if (p == NULL) {
	fprintf(stderr, "Clock not found: %s\n", name);
	return;
    } else if (!p->clockOn) {
	fprintf(stderr, "Clock not started: %s\n", name);
	return;
    }
    p->clockOn = FALSE;
    p->ticks += ticks - p->lastTime;
}
void
JS_ResetProfile()
{
    for (jsProfile_t *p = profiles; p != NULL; p = p->next) {
	p->calls = 0;
	p->ticks = 0;
	p->clockOn = FALSE;
    }
}
void
JS_ReportProfile()
{
    for (jsProfile_t *p = profiles; p != NULL; p = p->next) {
 	printf("name: %s\n", p->name);
 	printf("\tcalls: %d\n", p->calls);
 	printf("\tticks: %d\n", p->ticks);
 	printf("\tcall avg: %lf\n", (double) p->ticks / (double) p->calls);
    }
}
#endif /* PROFILE */

