X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fprofiler%2Fproflog.c;h=ed46b6d4cc9b1b5fe9dba94b1980c8cc8f02e09b;hb=58e8a9f85176c9607e605b888ef45db01a0f6997;hp=9120ae06916850b4154f96828b7bb34757b40a41;hpb=88dbb8625b735a08dbd36c9fa1a48bfb67073272;p=mono.git diff --git a/mono/profiler/proflog.c b/mono/profiler/proflog.c index 9120ae06916..ed46b6d4cc9 100644 --- a/mono/profiler/proflog.c +++ b/mono/profiler/proflog.c @@ -7,6 +7,7 @@ * * Copyright 2010 Novell, Inc (http://www.novell.com) * Copyright 2011 Xamarin Inc (http://www.xamarin.com) + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include @@ -33,6 +34,9 @@ #ifdef HAVE_UNISTD_H #include #endif +#ifdef HAVE_SCHED_GETAFFINITY +#include +#endif #include #include #if defined(HOST_WIN32) || defined(DISABLE_SOCKETS) @@ -80,9 +84,10 @@ #include #include -#include "perf_event.h" #ifdef ENABLE_PERF_EVENTS +#include + #define USE_PERF_EVENTS 1 static int read_perf_mmap (MonoProfiler* prof, int cpu); @@ -2492,12 +2497,12 @@ dump_sample_hits (MonoProfiler *prof, StatBuffer *sbuf) static int mono_cpu_count (void) { - int count = 0; #ifdef PLATFORM_ANDROID /* Android tries really hard to save power by powering off CPUs on SMP phones which * means the normal way to query cpu count returns a wrong value with userspace API. * Instead we use /sys entries to query the actual hardware CPU count. */ + int count = 0; char buffer[8] = {'\0'}; int present = open ("/sys/devices/system/cpu/present", O_RDONLY); /* Format of the /sys entry is a cpulist of indexes which in the case @@ -2512,13 +2517,42 @@ mono_cpu_count (void) if (count > 0) return count + 1; #endif + +#if defined(HOST_ARM) || defined (HOST_ARM64) + + /* ARM platforms tries really hard to save power by powering off CPUs on SMP phones which + * means the normal way to query cpu count returns a wrong value with userspace API. */ + +#ifdef _SC_NPROCESSORS_CONF + { + int count = sysconf (_SC_NPROCESSORS_CONF); + if (count > 0) + return count; + } +#endif + +#else + +#ifdef HAVE_SCHED_GETAFFINITY + { + cpu_set_t set; + if (sched_getaffinity (getpid (), sizeof (set), &set) == 0) + return CPU_COUNT (&set); + } +#endif #ifdef _SC_NPROCESSORS_ONLN - count = sysconf (_SC_NPROCESSORS_ONLN); - if (count > 0) - return count; + { + int count = sysconf (_SC_NPROCESSORS_ONLN); + if (count > 0) + return count; + } #endif + +#endif /* defined(HOST_ARM) || defined (HOST_ARM64) */ + #ifdef USE_SYSCTL { + int count; int mib [2]; size_t len = sizeof (int); mib [0] = CTL_HW; @@ -3580,6 +3614,7 @@ create_method_node (MonoMethod *method) static gboolean coverage_filter (MonoProfiler *prof, MonoMethod *method) { + MonoError error; MonoClass *klass; MonoImage *image; MonoAssembly *assembly; @@ -3690,7 +3725,8 @@ coverage_filter (MonoProfiler *prof, MonoMethod *method) } COVERAGE_DEBUG(fprintf (stderr, " Handling coverage for %s\n", mono_method_get_name (method));) - header = mono_method_get_header (method); + header = mono_method_get_header_checked (method, &error); + mono_error_cleanup (&error); mono_method_header_get_code (header, &code_size, NULL);