Fix trigger for tier 1 call counting delay (#17477)
[platform/upstream/coreclr.git] / src / binder / binderinterface.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 // BinderInterface.cpp
7 //
8
9
10 //
11 // Implements the public AssemblyBinder interface
12 //
13 // ============================================================
14
15 #include "assemblybinder.hpp"
16 #include "assemblyname.hpp"
17 #include "applicationcontext.hpp"
18 #include "binderinterface.hpp"
19 #include "bindresult.inl"
20 #include "utils.hpp"
21
22 #include "ex.h"
23
24 using namespace BINDER_SPACE;
25
26 namespace BinderInterface
27 {
28
29     HRESULT Init()
30     {
31         HRESULT hr = S_OK;
32         
33         EX_TRY
34         {
35             hr = AssemblyBinder::Startup();
36         }
37         EX_CATCH_HRESULT(hr);
38
39         return hr;
40     }
41
42     HRESULT SetupContext(LPCWSTR    wszApplicationBase,
43                          DWORD      dwAppDomainId,
44                          IUnknown **ppIApplicationContext)
45     {
46         HRESULT hr = S_OK;
47         
48         EX_TRY
49         {
50             BINDER_LOG_LOCK();
51             BINDER_LOG_ENTER(L"BinderInterface::SetupContext");
52
53             // Verify input arguments
54             IF_FALSE_GO(ppIApplicationContext != NULL);
55
56             {
57                 ReleaseHolder<ApplicationContext> pApplicationContext;
58
59                 SAFE_NEW(pApplicationContext, ApplicationContext);
60                 IF_FAIL_GO(pApplicationContext->Init());
61                 pApplicationContext->SetAppDomainId(dwAppDomainId);
62                 *ppIApplicationContext = static_cast<IUnknown *>(pApplicationContext.Extract());
63             }
64
65         Exit:
66             BINDER_LOG_LEAVE_HR(L"BinderInterface::SetupContext", hr);
67         }
68         EX_CATCH_HRESULT(hr);
69
70         return hr;
71     }
72
73     // See code:BINDER_SPACE::AssemblyBinder::GetAssembly for info on fNgenExplicitBind
74     // and fExplicitBindToNativeImage, and see code:CEECompileInfo::LoadAssemblyByPath
75     // for an example of how they're used.
76     HRESULT Bind(IUnknown    *pIApplicationContext,
77                  SString     &assemblyDisplayName,
78                  LPCWSTR      wszCodeBase,
79                  PEAssembly  *pParentAssembly,
80                  BOOL         fNgenExplicitBind,
81                  BOOL         fExplicitBindToNativeImage,
82                  BINDER_SPACE::Assembly   **ppAssembly)
83     {
84         HRESULT hr = S_OK;
85
86         EX_TRY
87         {
88             BINDER_LOG_LOCK();
89             BINDER_LOG_ENTER(L"BinderInterface::Bind");
90             
91             // Verify input arguments
92             IF_FALSE_GO(pIApplicationContext != NULL);
93             IF_FALSE_GO(ppAssembly != NULL);
94
95             {
96                 ApplicationContext *pApplicationContext =
97                     static_cast<ApplicationContext *>(pIApplicationContext);
98
99                 ReleaseHolder<AssemblyName> pAssemblyName;
100                 if (!assemblyDisplayName.IsEmpty())
101                 {
102                     SAFE_NEW(pAssemblyName, AssemblyName);
103                     IF_FAIL_GO(pAssemblyName->Init(assemblyDisplayName));
104                 }
105                 
106                 IF_FAIL_GO(AssemblyBinder::BindAssembly(pApplicationContext,
107                                                         pAssemblyName,
108                                                         wszCodeBase,
109                                                         pParentAssembly,
110                                                         fNgenExplicitBind,
111                                                         fExplicitBindToNativeImage,
112                                                         false, // excludeAppPaths
113                                                         ppAssembly));
114             }
115
116         Exit:
117             BINDER_LOG_LEAVE_HR(L"BinderInterface::Bind", hr);
118         }
119         EX_CATCH_HRESULT(hr);
120
121         return hr;
122     }
123
124     HRESULT BindToSystem(SString   &sSystemDirectory,
125                          BINDER_SPACE::Assembly **ppSystemAssembly,
126                          bool fBindToNativeImage)
127     {
128         HRESULT hr = S_OK;
129
130         IF_FALSE_GO(ppSystemAssembly != NULL);
131
132         EX_TRY
133         {
134             BINDER_LOG_LOCK();
135
136             IF_FAIL_GO(AssemblyBinder::BindToSystem(sSystemDirectory, ppSystemAssembly, fBindToNativeImage));
137         }
138         EX_CATCH_HRESULT(hr);
139
140     Exit:
141         return hr;
142     }
143
144     HRESULT SetupBindingPaths(IUnknown *pIApplicationContext,
145                             SString &sTrustedPlatformAssemblies,
146                             SString &sPlatformResourceRoots,
147                             SString &sAppPaths,
148                             SString &sAppNiPaths)
149     {
150         HRESULT hr = S_OK;
151
152         EX_TRY
153         {
154             BINDER_LOG_LOCK();
155             BINDER_LOG_ENTER(L"BinderInterface::SetupBindingPaths");
156
157             // Verify input arguments
158             IF_FALSE_GO(pIApplicationContext != NULL);
159
160             {
161                 ApplicationContext *pApplicationContext =
162                     static_cast<ApplicationContext *>(pIApplicationContext);
163                 _ASSERTE(pApplicationContext != NULL);
164
165                 IF_FAIL_GO(pApplicationContext->SetupBindingPaths(sTrustedPlatformAssemblies, sPlatformResourceRoots, sAppPaths, sAppNiPaths, TRUE /* fAcquireLock */));
166             }
167
168         Exit:
169             BINDER_LOG_LEAVE_HR(L"BinderInterface::SetupBindingPaths", hr);
170         }
171         EX_CATCH_HRESULT(hr);
172
173         return hr;
174     }
175
176 #ifdef BINDER_DEBUG_LOG
177     HRESULT Log(LPCWSTR wszMessage)
178     {
179         HRESULT hr = S_OK;
180         
181         EX_TRY
182         {
183             BINDER_LOG_LOCK();
184             BINDER_LOG((WCHAR *) wszMessage);
185         }
186         EX_CATCH_HRESULT(hr);
187
188         return hr;
189     }
190 #endif // BINDER_DEBUG_LOG
191 };