1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
6
#include "CorProfilerCallbackImpl.h"
10
#include "ProfilerMetaData.h"
12
#include "SharedMemory.h"
13
#include "CircularBuffer.h"
14
#include "CriticalSection.h"
16
// Disable: conditional expression is constant (C4127)
17
#pragma warning (disable: 4127)
19
#pragma warning (default: 4127)
24
#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
26
MIDL_DEFINE_GUID(CLSID, CLSID_Profiler,0xE7E2C111,0x3471,0x4AC7,0xB2,0x78,0x11,0xF4,0xC2,0x6E,0xDB,0xCF);
32
struct ThreadLocalData;
34
typedef std::map<FunctionID, int> TFunctionIDMap;
35
typedef std::pair<FunctionID, int> TFunctionIDPair;
37
typedef std::map<ThreadID, ThreadInfo*> TThreadIDMap;
38
typedef std::pair<ThreadID, ThreadInfo*> TThreadIDPair;
40
typedef std::map<DWORD, ThreadInfo*> TUThreadIDMap;
41
typedef std::pair<DWORD, ThreadInfo*> TUThreadIDPair;
43
typedef std::map<ModuleID, HandlerInfo> TMethodTokenMap;
44
typedef std::pair<ModuleID, HandlerInfo> TMethodTokenPair;
47
class CProfiler : public CCorProfilerCallbackImpl
50
STDMETHOD(QueryInterface)(REFIID riid,LPVOID *ppv);
51
STDMETHOD_(ULONG,AddRef)() ;
52
STDMETHOD_(ULONG,Release)() ;
54
// STARTUP/SHUTDOWN EVENTS
55
STDMETHOD(Initialize)(IUnknown *pICorProfilerInfoUnk);
56
STDMETHOD(Shutdown)();
59
STDMETHOD(ThreadAssignedToOSThread)(ThreadID managedThreadID, DWORD osThreadID);
60
STDMETHOD(ThreadNameChanged)(ThreadID threadID, ULONG cchName, WCHAR name[]);
61
STDMETHOD(ThreadCreated)(ThreadID threadID);
62
STDMETHOD(ThreadDestroyed)(ThreadID threadID);
65
// ECMA-335, page 82 (12.4.2 Exception handling)
66
// ECMA-335, page 96 (Partition II, 19 Exception handling)
69
STDMETHOD(ExceptionThrown)(ObjectID thrownObjectID);
71
// STDMETHOD(ExceptionSearchFunctionEnter)(FunctionID functionID);
72
// STDMETHOD(ExceptionSearchFunctionLeave)();
73
// STDMETHOD(ExceptionSearchFilterEnter)(FunctionID functionID);
74
// STDMETHOD(ExceptionSearchFilterLeave)();
75
// STDMETHOD(ExceptionSearchCatcherFound)(FunctionID functionID);
76
// STDMETHOD(ExceptionCLRCatcherFound)();
77
// STDMETHOD(ExceptionCLRCatcherExecute)();
78
// STDMETHOD(ExceptionOSHandlerEnter)(FunctionID functionID);
79
// STDMETHOD(ExceptionOSHandlerLeave)(FunctionID functionID);
81
// STDMETHOD(ExceptionUnwindFunctionEnter)(FunctionID functionID);
82
STDMETHOD(ExceptionUnwindFunctionLeave)();
83
// STDMETHOD(ExceptionUnwindFinallyEnter)(FunctionID functionID);
84
// STDMETHOD(ExceptionUnwindFinallyLeave)();
85
// STDMETHOD(ExceptionCatcherEnter)(FunctionID functionID, ObjectID objectID);
86
// STDMETHOD(ExceptionCatcherLeave)();
89
STDMETHOD(FunctionUnloadStarted)(FunctionID functionID);
92
STDMETHOD(JITCompilationStarted)(FunctionID functionID, BOOL fIsSafeToBlock);
95
STDMETHOD(ModuleLoadFinished)(ModuleID moduleID, HRESULT hrStatus);
100
static UINT_PTR _stdcall FunctionMapper(FunctionID functionId, BOOL *pbHookFunction);
101
UINT_PTR MapFunction(FunctionID functionID, const WCHAR **name);
102
FunctionInfo *CreateNewRoot();
103
void MovedRootChild(FunctionInfo *newRootChild);
104
void EnterLock(ThreadLocalData *);
109
void LogString(WCHAR* pszFmtString, ... );
111
// container for ICorProfilerInfo reference
112
ICorProfilerInfo *pICorProfilerInfo;
113
// container for ICorProfilerInfo2 reference
114
ICorProfilerInfo2 *pICorProfilerInfo2;
115
// variables needed for interprocess communication
116
CSharedMemory *sharedMemory;
117
CCircularBuffer *nativeToManagedBuffer;
118
CriticalSection nativeToManagedCriticalSection;
119
CriticalSection rootElementCriticalSection;
120
CriticalSection mapFunctionCriticalSection;
121
CriticalSection threadMapCriticalSection;
122
CriticalSection methodMapCriticalSection;
123
CEventWaitHandle *accessEventHandle;
125
SignatureReader *sigReader;
126
TFunctionIDMap functionIDMap;
127
TThreadIDMap threadIDMap;
128
TUThreadIDMap unmanagedThreadIDMap;
129
TMethodTokenMap methodMap;
131
// function to set up our event mask
132
HRESULT SetEventMask();
133
void Rewrite(FunctionID functionID, int type, int nameId);
134
void ConvertToFat(byte *target, int *size);
135
void FixSEHSections(const COR_ILMETHOD_SECT *sections, int offset);
136
int SetInjectionCode(IMetaDataImport *, byte *buffer, int *size, mdMethodDef activateCall, mdMethodDef loggerCall, mdMethodDef deactivateCall, int type, int nameId);
137
bool CreateMethod(IMetaDataEmit *, const WCHAR *, PCCOR_SIGNATURE, mdMethodDef *, mdToken);
138
int InitializeCommunication();
141
void DetachFromThread(ThreadLocalData *data);
b'\\ No newline at end of file'