/* src/vm/rt-timing.hpp - POSIX real-time timing utilities

   Copyright (C) 1996-2013
   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO

   This file is part of CACAO.

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2, or (at
   your option) any later version.

   This program 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
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
   02110-1301, USA.

*/


#ifndef _RT_TIMING_HPP
#define _RT_TIMING_HPP

#include "config.h"

#if defined(ENABLE_RT_TIMING)

#include <time.h>

#include "vm/types.h"

#include "mm/memory.hpp"

#include "vm/global.h"


#define RT_TIMING_GET_TIME(ts) \
	rt_timing_gettime(&(ts));

#define RT_TIMING_TIME_DIFF(a,b,index) \
	rt_timing_time_diff(&(a),&(b),(index));

#define RT_TIMING_JIT_CHECKS       0
#define RT_TIMING_JIT_PARSE        1
#define RT_TIMING_JIT_STACK        2
#define RT_TIMING_JIT_TYPECHECK    3
#define RT_TIMING_JIT_LOOP         4
#define RT_TIMING_JIT_IFCONV       5
#define RT_TIMING_JIT_ALLOC        6
#define RT_TIMING_JIT_RPLPOINTS    7
#define RT_TIMING_JIT_CODEGEN      8
#define RT_TIMING_JIT_TOTAL        9

#define RT_TIMING_LINK_RESOLVE     10
#define RT_TIMING_LINK_C_VFTBL     11
#define RT_TIMING_LINK_ABSTRACT    12
#define RT_TIMING_LINK_C_IFTBL     13
#define RT_TIMING_LINK_F_VFTBL     14
#define RT_TIMING_LINK_OFFSETS     15
#define RT_TIMING_LINK_F_IFTBL     16
#define RT_TIMING_LINK_FINALIZER   17
#define RT_TIMING_LINK_EXCEPTS     18
#define RT_TIMING_LINK_SUBCLASS    19
#define RT_TIMING_LINK_TOTAL       20

#define RT_TIMING_LOAD_CHECKS      21
#define RT_TIMING_LOAD_NDPOOL      22
#define RT_TIMING_LOAD_CPOOL       23
#define RT_TIMING_LOAD_SETUP       24
#define RT_TIMING_LOAD_FIELDS      25
#define RT_TIMING_LOAD_METHODS     26
#define RT_TIMING_LOAD_CLASSREFS   27
#define RT_TIMING_LOAD_DESCS       28
#define RT_TIMING_LOAD_SETREFS     29
#define RT_TIMING_LOAD_PARSEFDS    30
#define RT_TIMING_LOAD_PARSEMDS    31
#define RT_TIMING_LOAD_PARSECP     32
#define RT_TIMING_LOAD_VERIFY      33
#define RT_TIMING_LOAD_ATTRS       34
#define RT_TIMING_LOAD_TOTAL       35

#define RT_TIMING_LOAD_BOOT_LOOKUP 36
#define RT_TIMING_LOAD_BOOT_ARRAY  37
#define RT_TIMING_LOAD_BOOT_SUCK   38
#define RT_TIMING_LOAD_BOOT_LOAD   39
#define RT_TIMING_LOAD_BOOT_CACHE  40
#define RT_TIMING_LOAD_BOOT_TOTAL  41

#define RT_TIMING_LOAD_CL_LOOKUP   42
#define RT_TIMING_LOAD_CL_PREPARE  43
#define RT_TIMING_LOAD_CL_JAVA     44
#define RT_TIMING_LOAD_CL_CACHE    45

#define RT_TIMING_NEW_OBJECT       46
#define RT_TIMING_NEW_ARRAY        47

#define RT_TIMING_GC_ALLOC         48
#define RT_TIMING_GC_SUSPEND       49
#define RT_TIMING_GC_ROOTSET1      50
#define RT_TIMING_GC_MARK          51
#define RT_TIMING_GC_COMPACT       52
#define RT_TIMING_GC_ROOTSET2      53
#define RT_TIMING_GC_TOTAL         54

#define RT_TIMING_REPLACE          55

#define RT_TIMING_1                56
#define RT_TIMING_2                57
#define RT_TIMING_3                58
#define RT_TIMING_4                59

#define RT_TIMING_N                60

#ifdef __cplusplus
extern "C" {
#endif

void rt_timing_gettime(struct timespec *ts);

void rt_timing_time_diff(struct timespec *a,struct timespec *b,int index);

long rt_timing_diff_usec(struct timespec *a,struct timespec *b);

void rt_timing_print_time_stats(FILE *file);

#ifdef __cplusplus
}
#endif

#else /* !defined(ENABLE_RT_TIMING) */

#define RT_TIMING_GET_TIME(ts)
#define RT_TIMING_TIME_DIFF(a,b,index)

#endif /* defined(ENABLE_RT_TIMING) */

#endif /* _RT_TIMING_HPP */

/*
 * These are local overrides for various environment variables in Emacs.
 * Please do not remove this and leave it at the end of the file, where
 * Emacs will automagically detect them.
 * ---------------------------------------------------------------------
 * Local variables:
 * mode: c++
 * indent-tabs-mode: t
 * c-basic-offset: 4
 * tab-width: 4
 * End:
 * vim:noexpandtab:sw=4:ts=4:
 */
