Skip to content

Commit df5fd8b

Browse files
committed
fix destruction
1 parent 05f0c61 commit df5fd8b

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed

source/loader/layers/sanitizer/asan_interceptor.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ SanitizerInterceptor::SanitizerInterceptor(logger::Logger &logger)
158158
SanitizerInterceptor::~SanitizerInterceptor() {
159159
DestroyShadowMemoryOnCPU();
160160
DestroyShadowMemoryOnPVC();
161+
162+
for (auto Adapter : m_Adapters) {
163+
getContext()->urDdiTable.Global.pfnAdapterRelease(Adapter);
164+
}
161165
}
162166

163167
/// The memory chunk allocated from the underlying allocator looks like this:

source/loader/layers/sanitizer/asan_interceptor.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,12 @@ class SanitizerInterceptor {
201201
ur_result_t eraseMemBuffer(ur_mem_handle_t MemHandle);
202202
std::shared_ptr<MemBuffer> getMemBuffer(ur_mem_handle_t MemHandle);
203203

204+
ur_result_t holdAdapter(ur_adapter_handle_t Adapter) {
205+
UR_CALL(getContext()->urDdiTable.Global.pfnAdapterRetain(Adapter));
206+
m_Adapters.push_back(Adapter);
207+
return UR_RESULT_SUCCESS;
208+
}
209+
204210
std::optional<AllocationIterator> findAllocInfoByAddress(uptr Address);
205211

206212
std::shared_ptr<ContextInfo> getContextInfo(ur_context_handle_t Context) {
@@ -262,6 +268,8 @@ class SanitizerInterceptor {
262268

263269
std::unique_ptr<Quarantine> m_Quarantine;
264270
logger::Logger &logger;
271+
272+
std::vector<ur_adapter_handle_t> m_Adapters;
265273
};
266274

267275
} // namespace ur_sanitizer_layer

source/loader/layers/sanitizer/ur_sanddi.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,38 @@ ur_result_t setupContext(ur_context_handle_t Context, uint32_t numDevices,
3737

3838
} // namespace
3939

40+
///////////////////////////////////////////////////////////////////////////////
41+
/// @brief Intercept function for urAdapterGet
42+
__urdlllocal ur_result_t UR_APICALL urAdapterGet(
43+
uint32_t
44+
NumEntries, ///< [in] the number of adapters to be added to phAdapters.
45+
///< If phAdapters is not NULL, then NumEntries should be greater than
46+
///< zero, otherwise ::UR_RESULT_ERROR_INVALID_SIZE,
47+
///< will be returned.
48+
ur_adapter_handle_t *
49+
phAdapters, ///< [out][optional][range(0, NumEntries)] array of handle of adapters.
50+
///< If NumEntries is less than the number of adapters available, then
51+
///< ::urAdapterGet shall only retrieve that number of platforms.
52+
uint32_t *
53+
pNumAdapters ///< [out][optional] returns the total number of adapters available.
54+
) {
55+
auto pfnAdapterGet = getContext()->urDdiTable.Global.pfnAdapterGet;
56+
57+
if (nullptr == pfnAdapterGet) {
58+
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
59+
}
60+
61+
ur_result_t result = pfnAdapterGet(NumEntries, phAdapters, pNumAdapters);
62+
if (result == UR_RESULT_SUCCESS) {
63+
const uint32_t NumAdapters = pNumAdapters ? *pNumAdapters : NumEntries;
64+
for (uint32_t i = 0; i < NumAdapters; ++i) {
65+
getContext()->interceptor->holdAdapter(phAdapters[i]);
66+
}
67+
}
68+
69+
return result;
70+
}
71+
4072
///////////////////////////////////////////////////////////////////////////////
4173
/// @brief Intercept function for urUSMHostAlloc
4274
__urdlllocal ur_result_t UR_APICALL urUSMHostAlloc(
@@ -1274,6 +1306,38 @@ __urdlllocal ur_result_t UR_APICALL urKernelSetArgLocal(
12741306
return result;
12751307
}
12761308

1309+
///////////////////////////////////////////////////////////////////////////////
1310+
/// @brief Exported function for filling application's Global table
1311+
/// with current process' addresses
1312+
///
1313+
/// @returns
1314+
/// - ::UR_RESULT_SUCCESS
1315+
/// - ::UR_RESULT_ERROR_INVALID_NULL_POINTER
1316+
/// - ::UR_RESULT_ERROR_UNSUPPORTED_VERSION
1317+
__urdlllocal ur_result_t UR_APICALL urGetGlobalProcAddrTable(
1318+
ur_api_version_t version, ///< [in] API version requested
1319+
ur_global_dditable_t
1320+
*pDdiTable ///< [in,out] pointer to table of DDI function pointers
1321+
) {
1322+
auto &dditable = ur_sanitizer_layer::getContext()->urDdiTable.Global;
1323+
1324+
if (nullptr == pDdiTable) {
1325+
return UR_RESULT_ERROR_INVALID_NULL_POINTER;
1326+
}
1327+
1328+
if (UR_MAJOR_VERSION(ur_sanitizer_layer::getContext()->version) !=
1329+
UR_MAJOR_VERSION(version) ||
1330+
UR_MINOR_VERSION(ur_sanitizer_layer::getContext()->version) >
1331+
UR_MINOR_VERSION(version)) {
1332+
return UR_RESULT_ERROR_UNSUPPORTED_VERSION;
1333+
}
1334+
1335+
ur_result_t result = UR_RESULT_SUCCESS;
1336+
1337+
pDdiTable->pfnAdapterGet = ur_sanitizer_layer::urAdapterGet;
1338+
1339+
return result;
1340+
}
12771341
///////////////////////////////////////////////////////////////////////////////
12781342
/// @brief Exported function for filling application's Context table
12791343
/// with current process' addresses
@@ -1545,6 +1609,11 @@ ur_result_t context_t::init(ur_dditable_t *dditable,
15451609

15461610
urDdiTable = *dditable;
15471611

1612+
if (UR_RESULT_SUCCESS == result) {
1613+
result = ur_sanitizer_layer::urGetGlobalProcAddrTable(
1614+
UR_API_VERSION_CURRENT, &dditable->Global);
1615+
}
1616+
15481617
if (UR_RESULT_SUCCESS == result) {
15491618
result = ur_sanitizer_layer::urGetContextProcAddrTable(
15501619
UR_API_VERSION_CURRENT, &dditable->Context);

0 commit comments

Comments
 (0)