Fix trigger for tier 1 call counting delay (#17477)
[platform/upstream/coreclr.git] / src / binder / coreclrbindercommon.cpp
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4
5
6 #include "common.h"
7 #include "assemblybinder.hpp"
8 #include "coreclrbindercommon.h"
9 #include "clrprivbindercoreclr.h"
10 #include "clrprivbinderutil.h"
11
12 using namespace BINDER_SPACE;
13
14 //=============================================================================
15 // Init code
16 //-----------------------------------------------------------------------------
17 /* static */
18 HRESULT CCoreCLRBinderHelper::Init()
19 {
20     STANDARD_VM_CONTRACT;
21     HRESULT hr = S_OK;
22     EX_TRY
23     {
24         hr = AssemblyBinder::Startup();
25     }
26     EX_CATCH_HRESULT(hr);
27
28     return hr;
29 }
30
31 HRESULT CCoreCLRBinderHelper::DefaultBinderSetupContext(DWORD dwAppDomainId,CLRPrivBinderCoreCLR **ppTPABinder)
32 {
33     HRESULT hr = S_OK;
34     EX_TRY
35     {
36         if(ppTPABinder != NULL)
37         {
38             ReleaseHolder<CLRPrivBinderCoreCLR> pBinder;
39             SAFE_NEW(pBinder, CLRPrivBinderCoreCLR);
40             
41             BINDER_SPACE::ApplicationContext *pApplicationContext = pBinder->GetAppContext();
42             hr = pApplicationContext->Init();
43             if(SUCCEEDED(hr))
44             {
45                 pApplicationContext->SetAppDomainId(dwAppDomainId);
46                 pBinder->SetManagedAssemblyLoadContext(NULL);
47                 *ppTPABinder = clr::SafeAddRef(pBinder.Extract());
48             }
49         }
50     }
51     EX_CATCH_HRESULT(hr);
52
53 Exit:
54     return hr;
55 }
56
57 HRESULT CCoreCLRBinderHelper::GetAssemblyIdentity(LPCSTR     szTextualIdentity,
58                                                   BINDER_SPACE::ApplicationContext  *pApplicationContext,
59                                                   NewHolder<AssemblyIdentityUTF8> &assemblyIdentityHolder)
60 {
61     HRESULT hr = S_OK;
62     VALIDATE_ARG_RET(szTextualIdentity != NULL);
63
64     EX_TRY
65     {
66         AssemblyIdentityUTF8 *pAssemblyIdentity = NULL;
67         if (pApplicationContext != NULL)
68         {
69             // This returns a cached copy owned by application context
70             hr = pApplicationContext->GetAssemblyIdentity(szTextualIdentity, &pAssemblyIdentity);
71             if(SUCCEEDED(hr))
72             {
73                 assemblyIdentityHolder = pAssemblyIdentity;
74                 assemblyIdentityHolder.SuppressRelease();
75             }
76         }
77         else
78         {
79             SString sTextualIdentity;
80
81             sTextualIdentity.SetUTF8(szTextualIdentity);
82
83             // This is a private copy
84             pAssemblyIdentity = new AssemblyIdentityUTF8();
85             hr = TextualIdentityParser::Parse(sTextualIdentity, pAssemblyIdentity);
86             if(SUCCEEDED(hr))
87             {
88                 pAssemblyIdentity->PopulateUTF8Fields();
89                 assemblyIdentityHolder = pAssemblyIdentity;
90             }
91         }
92     }
93     EX_CATCH_HRESULT(hr);
94
95     return hr;
96 }
97
98 //=============================================================================
99 // Functions that provides binding services beyond the ICLRPrivInterface
100 //-----------------------------------------------------------------------------
101
102 HRESULT CCoreCLRBinderHelper::BindToSystem(ICLRPrivAssembly **ppSystemAssembly, bool fBindToNativeImage)
103 {
104     HRESULT hr = S_OK;
105     VALIDATE_ARG_RET(ppSystemAssembly != NULL);
106     
107     EX_TRY
108     {
109         ReleaseHolder<BINDER_SPACE::Assembly> pAsm;
110         StackSString systemPath(SystemDomain::System()->SystemDirectory());
111         hr = AssemblyBinder::BindToSystem(systemPath, &pAsm, fBindToNativeImage);
112         if(SUCCEEDED(hr))
113         {
114             _ASSERTE(pAsm != NULL);
115             *ppSystemAssembly = pAsm.Extract();
116         }
117     }
118     EX_CATCH_HRESULT(hr);
119
120     return hr;
121 }
122
123 HRESULT CCoreCLRBinderHelper::BindToSystemSatellite(SString            &systemPath,
124                                                     SString           &sSimpleName,
125                                                     SString           &sCultureName,
126                                                     ICLRPrivAssembly **ppSystemAssembly)
127 {
128     HRESULT hr = S_OK;
129     VALIDATE_ARG_RET(ppSystemAssembly != NULL && !systemPath.IsEmpty());
130     
131     EX_TRY
132     {
133         ReleaseHolder<BINDER_SPACE::Assembly> pAsm;
134         hr = AssemblyBinder::BindToSystemSatellite(systemPath, sSimpleName, sCultureName, &pAsm);
135         if(SUCCEEDED(hr))
136         {
137             _ASSERTE(pAsm != NULL);
138             *ppSystemAssembly = pAsm.Extract();
139         }
140     }
141     EX_CATCH_HRESULT(hr);
142
143     return hr;
144 }
145
146 HRESULT CCoreCLRBinderHelper::GetAssemblyFromImage(PEImage           *pPEImage,
147                                                    PEImage           *pNativePEImage,
148                                                    ICLRPrivAssembly **ppAssembly)
149 {
150     HRESULT hr = S_OK;
151     VALIDATE_ARG_RET(pPEImage != NULL && ppAssembly != NULL);
152
153     EX_TRY
154     {
155         ReleaseHolder<BINDER_SPACE::Assembly> pAsm;
156         hr = AssemblyBinder::GetAssemblyFromImage(pPEImage, pNativePEImage, &pAsm);
157         if(SUCCEEDED(hr))
158         {
159             _ASSERTE(pAsm != nullptr);
160             *ppAssembly = pAsm.Extract();
161         }
162     }
163     EX_CATCH_HRESULT(hr);
164
165     return hr;
166 }
167
168 //=============================================================================
169 // Explicitly bind to an assembly by filepath
170 //=============================================================================
171 /* static */
172 HRESULT CCoreCLRBinderHelper::GetAssembly(/* in */  SString     &assemblyPath,
173                                    /* in */  BOOL         fInspectionOnly,
174                                    /* in */  BOOL         fIsInGAC,
175                                    /* in */  BOOL         fExplicitBindToNativeImage,
176                                    /* out */ BINDER_SPACE::Assembly   **ppAssembly)
177 {
178     return AssemblyBinder::GetAssembly(assemblyPath,
179                                          fInspectionOnly,
180                                          fIsInGAC,
181                                          fExplicitBindToNativeImage,
182                                          ppAssembly
183                                          );
184 }