Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYauk <33248368+Yauk@users.noreply.github.com>2021-07-11 01:23:25 +0300
committerGitHub <noreply@github.com>2021-07-11 01:23:25 +0300
commitfce412be7779966533b94ba879e98e4eecbd94fc (patch)
tree0125c7e3d0ba36cd240ec9ba6d254b9845b1a616 /src/coreclr
parent960e7b352d5f4166193b2ca35c2f627ce0b60332 (diff)
Support filtering ObjectAllocated callback for pinned object heap allocation only (#55448)
* Prototype allocation profiler * Add callback for pinned objects * Fix the build issue caused by corprof.idl change * Improve the test * Misc changes for the tests Co-authored-by: Andrew Au <andrewau@microsoft.com> Co-authored-by: Yauk Jia <yaujia@microsoft.com>
Diffstat (limited to 'src/coreclr')
-rw-r--r--src/coreclr/inc/corprof.idl3
-rw-r--r--src/coreclr/inc/profilepriv.inl15
-rw-r--r--src/coreclr/pal/prebuilt/inc/corprof.h1
-rw-r--r--src/coreclr/vm/eeprofinterfaces.inl8
-rw-r--r--src/coreclr/vm/gchelpers.cpp3
5 files changed, 29 insertions, 1 deletions
diff --git a/src/coreclr/inc/corprof.idl b/src/coreclr/inc/corprof.idl
index 8fc965a84f6..d1c58f96cf9 100644
--- a/src/coreclr/inc/corprof.idl
+++ b/src/coreclr/inc/corprof.idl
@@ -667,6 +667,9 @@ typedef enum
COR_PRF_HIGH_MONITOR_EVENT_PIPE = 0x00000080,
+ // Enables the pinned object allocation monitoring.
+ COR_PRF_HIGH_MONITOR_PINNEDOBJECT_ALLOCATED = 0x00000100,
+
COR_PRF_HIGH_ALLOWABLE_AFTER_ATTACH = COR_PRF_HIGH_IN_MEMORY_SYMBOLS_UPDATED |
COR_PRF_HIGH_MONITOR_DYNAMIC_FUNCTION_UNLOADS |
COR_PRF_HIGH_BASIC_GC |
diff --git a/src/coreclr/inc/profilepriv.inl b/src/coreclr/inc/profilepriv.inl
index 08ba58f5623..e99591c5ffd 100644
--- a/src/coreclr/inc/profilepriv.inl
+++ b/src/coreclr/inc/profilepriv.inl
@@ -1860,6 +1860,21 @@ inline BOOL CORProfilerTrackLargeAllocations()
(&g_profControlBlock)->globalEventMask.IsEventMaskHighSet(COR_PRF_HIGH_MONITOR_LARGEOBJECT_ALLOCATED));
}
+inline BOOL CORProfilerTrackPinnedAllocations()
+{
+ CONTRACTL
+ {
+ NOTHROW;
+ GC_NOTRIGGER;
+ CANNOT_TAKE_LOCK;
+ }
+ CONTRACTL_END;
+
+ return
+ (CORProfilerPresent() &&
+ (&g_profControlBlock)->globalEventMask.IsEventMaskHighSet(COR_PRF_HIGH_MONITOR_PINNEDOBJECT_ALLOCATED));
+}
+
inline BOOL CORProfilerEnableRejit()
{
CONTRACTL
diff --git a/src/coreclr/pal/prebuilt/inc/corprof.h b/src/coreclr/pal/prebuilt/inc/corprof.h
index 85ce86870bf..e82623d0c09 100644
--- a/src/coreclr/pal/prebuilt/inc/corprof.h
+++ b/src/coreclr/pal/prebuilt/inc/corprof.h
@@ -574,6 +574,7 @@ enum __MIDL___MIDL_itf_corprof_0000_0000_0006
COR_PRF_HIGH_REQUIRE_PROFILE_IMAGE = 0,
COR_PRF_HIGH_MONITOR_LARGEOBJECT_ALLOCATED = 0x40,
COR_PRF_HIGH_MONITOR_EVENT_PIPE = 0x80,
+ COR_PRF_HIGH_MONITOR_PINNEDOBJECT_ALLOCATED = 0x100,
COR_PRF_HIGH_ALLOWABLE_AFTER_ATTACH = ( ( ( ( ( COR_PRF_HIGH_IN_MEMORY_SYMBOLS_UPDATED | COR_PRF_HIGH_MONITOR_DYNAMIC_FUNCTION_UNLOADS ) | COR_PRF_HIGH_BASIC_GC ) | COR_PRF_HIGH_MONITOR_GC_MOVED_OBJECTS ) | COR_PRF_HIGH_MONITOR_LARGEOBJECT_ALLOCATED ) | COR_PRF_HIGH_MONITOR_EVENT_PIPE ) ,
COR_PRF_HIGH_ALLOWABLE_NOTIFICATION_PROFILER = ( ( ( ( ( ( COR_PRF_HIGH_IN_MEMORY_SYMBOLS_UPDATED | COR_PRF_HIGH_MONITOR_DYNAMIC_FUNCTION_UNLOADS ) | COR_PRF_HIGH_DISABLE_TIERED_COMPILATION ) | COR_PRF_HIGH_BASIC_GC ) | COR_PRF_HIGH_MONITOR_GC_MOVED_OBJECTS ) | COR_PRF_HIGH_MONITOR_LARGEOBJECT_ALLOCATED ) | COR_PRF_HIGH_MONITOR_EVENT_PIPE ) ,
COR_PRF_HIGH_MONITOR_IMMUTABLE = COR_PRF_HIGH_DISABLE_TIERED_COMPILATION
diff --git a/src/coreclr/vm/eeprofinterfaces.inl b/src/coreclr/vm/eeprofinterfaces.inl
index 250b3700f80..da6e9788329 100644
--- a/src/coreclr/vm/eeprofinterfaces.inl
+++ b/src/coreclr/vm/eeprofinterfaces.inl
@@ -31,5 +31,13 @@ FORCEINLINE BOOL TrackLargeAllocations()
#endif // PROFILING_SUPPORTED
}
+FORCEINLINE BOOL TrackPinnedAllocations()
+{
+#ifdef PROFILING_SUPPORTED
+ return CORProfilerTrackPinnedAllocations();
+#else
+ return FALSE;
+#endif // PROFILING_SUPPORTED
+}
#endif
diff --git a/src/coreclr/vm/gchelpers.cpp b/src/coreclr/vm/gchelpers.cpp
index 0cecfc624a7..01ffd5305d9 100644
--- a/src/coreclr/vm/gchelpers.cpp
+++ b/src/coreclr/vm/gchelpers.cpp
@@ -324,7 +324,8 @@ void PublishObjectAndNotify(TObj* &orObject, GC_ALLOC_FLAGS flags)
// Notify the profiler of the allocation
// do this after initializing bounds so callback has size information
if (TrackAllocations() ||
- (TrackLargeAllocations() && flags & GC_ALLOC_LARGE_OBJECT_HEAP))
+ (TrackLargeAllocations() && flags & GC_ALLOC_LARGE_OBJECT_HEAP) ||
+ (TrackPinnedAllocations() && flags & GC_ALLOC_PINNED_OBJECT_HEAP))
{
OBJECTREF objref = ObjectToOBJECTREF((Object*)orObject);
GCPROTECT_BEGIN(objref);