X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fprofiler%2Futils.c;h=8bf57a72f7c10e0e68e48ef63215d79e455a1a1c;hb=6f76efaedfbbd4be65d20073b7389c59111cf7d8;hp=b6e83963e58108831d97cd1db9794c88b7e984fa;hpb=5fc8a5719a1bc1af414a931ff5c48a5d4d9389f3;p=mono.git diff --git a/mono/profiler/utils.c b/mono/profiler/utils.c index b6e83963e58..8bf57a72f7c 100644 --- a/mono/profiler/utils.c +++ b/mono/profiler/utils.c @@ -18,6 +18,7 @@ #include #include #include +#include #ifdef HOST_WIN32 #include #else @@ -40,13 +41,13 @@ static mach_timebase_info_data_t timebase_info; #endif -#ifndef MAP_ANON +#ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS MAP_ANON #endif #define TICKS_PER_SEC 1000000000LL -#if (defined(TARGET_X86) || defined(TARGET_AMD64)) && defined(__linux__) +#if (defined(TARGET_X86) || defined(TARGET_AMD64)) && defined(__linux__) && defined(HAVE_SCHED_GETCPU) #define HAVE_RDTSC 1 #endif @@ -73,10 +74,12 @@ static pthread_key_t tls_data; #ifdef HOST_WIN32 static CRITICAL_SECTION log_lock; +static LARGE_INTEGER pcounter_freq; #else static pthread_mutex_t log_lock = PTHREAD_MUTEX_INITIALIZER; #endif +static int timer_overhead = 0; static uint64_t time_inc = 0; typedef uint64_t (*TimeFunc)(void); @@ -88,14 +91,22 @@ clock_time (void) #if defined(__APPLE__) uint64_t time = mach_absolute_time (); - time *= info.numer; - time /= info.denom; + time *= timebase_info.numer; + time /= timebase_info.denom; return time; -#else +#elif defined(HOST_WIN32) + LARGE_INTEGER value; + QueryPerformanceCounter (&value); + return value.QuadPart * TICKS_PER_SEC / pcounter_freq.QuadPart; +#elif defined(CLOCK_MONOTONIC) struct timespec tspec; clock_gettime (CLOCK_MONOTONIC, &tspec); return ((uint64_t)tspec.tv_sec * TICKS_PER_SEC + tspec.tv_nsec); +#else + struct timeval tv; + gettimeofday (&tv, NULL); + return ((uint64_t)tv.tv_sec * TICKS_PER_SEC + tv.tv_usec * 1000); #endif } @@ -208,9 +219,12 @@ null_time (void) void utils_init (int fast_time) { + int i; + uint64_t time_start, time_end; TLS_INIT (tls_data); #ifdef HOST_WIN32 InitializeCriticalSection (&log_lock); + QueryPerformanceFrequency (&pcounter_freq); #endif #if defined (__APPLE__) mach_timebase_info (&timebase_info); @@ -233,6 +247,17 @@ utils_init (int fast_time) } else { time_func = clock_time; } + time_start = time_func (); + for (i = 0; i < 256; ++i) + time_func (); + time_end = time_func (); + timer_overhead = (time_end - time_start) / 256; +} + +int +get_timer_overhead (void) +{ + return timer_overhead; } uint64_t @@ -388,3 +413,13 @@ thread_id (void) #endif } +uintptr_t +process_id (void) +{ +#ifdef HOST_WIN32 + return 0; /* FIXME */ +#else + return (uintptr_t)getpid (); +#endif +} +