Skip to content

Commit 01236f0

Browse files
committed
[L0 v2] Remove ur_shared_handle
as it's error prone to use - similarly to shared_ptr we should not create multiple instances of shared_handle from a single raw pointer. Also, fix error in kernel.cpp: program handle was not being retained, leading to segfaults.
1 parent 509de91 commit 01236f0

File tree

5 files changed

+17
-90
lines changed

5 files changed

+17
-90
lines changed

source/adapters/level_zero/v2/common.hpp

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -87,70 +87,6 @@ struct ze_handle_wrapper {
8787
bool ownZeHandle;
8888
};
8989

90-
template <typename URHandle, ur_result_t (*retain)(URHandle),
91-
ur_result_t (*release)(URHandle)>
92-
struct ur_shared_handle {
93-
using handle_t = URHandle;
94-
95-
ur_shared_handle() : handle(nullptr) {}
96-
explicit ur_shared_handle(handle_t handle) : handle(handle) {}
97-
~ur_shared_handle() {
98-
try {
99-
reset();
100-
} catch (...) {
101-
}
102-
}
103-
104-
ur_shared_handle(const ur_shared_handle &other) : handle(other.handle) {
105-
retain(handle);
106-
}
107-
ur_shared_handle(ur_shared_handle &&other) : handle(other.handle) {
108-
other.handle = nullptr;
109-
}
110-
ur_shared_handle(std::nullptr_t) : handle(nullptr) {}
111-
112-
void reset() {
113-
if (!handle) {
114-
return;
115-
}
116-
117-
UR_CALL_THROWS(release(handle));
118-
handle = nullptr;
119-
}
120-
121-
ur_shared_handle &operator=(const ur_shared_handle &other) {
122-
if (handle) {
123-
release(handle);
124-
}
125-
handle = other.handle;
126-
retain(handle);
127-
return *this;
128-
}
129-
ur_shared_handle &operator=(ur_shared_handle &&other) {
130-
if (handle) {
131-
release(handle);
132-
}
133-
handle = other.handle;
134-
other.handle = nullptr;
135-
return *this;
136-
}
137-
ur_shared_handle &operator=(std::nullptr_t) {
138-
if (handle) {
139-
release(handle);
140-
}
141-
new (this) ur_shared_handle(nullptr);
142-
return *this;
143-
}
144-
145-
handle_t *ptr() { return &handle; }
146-
handle_t get() const { return handle; }
147-
handle_t operator->() { return handle; }
148-
operator handle_t() { return handle; }
149-
150-
private:
151-
handle_t handle;
152-
};
153-
15490
using ze_kernel_handle_t =
15591
ze_handle_wrapper<::ze_kernel_handle_t, zeKernelDestroy>;
15692

@@ -166,11 +102,5 @@ using ze_context_handle_t =
166102
using ze_command_list_handle_t =
167103
ze_handle_wrapper<::ze_command_list_handle_t, zeCommandListDestroy>;
168104

169-
using ur_queue_shared_handle_t =
170-
ur_shared_handle<ur_queue_handle_t, urQueueRetain, urQueueRelease>;
171-
172-
using ur_kernel_shared_handle_t =
173-
ur_shared_handle<ur_kernel_handle_t, urKernelRetain, urKernelRelease>;
174-
175105
} // namespace raii
176106
} // namespace v2

source/adapters/level_zero/v2/kernel.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ ur_result_t ur_single_device_kernel_t::release() {
3232
return UR_RESULT_SUCCESS;
3333
}
3434

35-
ur_kernel_handle_t_::ur_kernel_handle_t_(ur_program_shared_handle_t hProgram,
35+
ur_kernel_handle_t_::ur_kernel_handle_t_(ur_program_handle_t hProgram,
3636
const char *kernelName)
3737
: hProgram(hProgram),
3838
deviceKernels(hProgram->Context->getPlatform()->getNumDevices()) {
39+
urProgramRetain(hProgram);
40+
3941
for (auto [zeDevice, zeModule] : hProgram->ZeModuleMap) {
4042
ZeStruct<ze_kernel_desc_t> zeKernelDesc;
4143
zeKernelDesc.pKernelName = kernelName;
@@ -78,7 +80,8 @@ ur_result_t ur_kernel_handle_t_::release() {
7880
singleDeviceKernelOpt.value().hKernel.reset();
7981
}
8082
}
81-
hProgram.reset();
83+
84+
UR_CALL_THROWS(urProgramRelease(hProgram));
8285

8386
return UR_RESULT_SUCCESS;
8487
}
@@ -190,7 +193,7 @@ ur_result_t ur_kernel_handle_t_::setArgPointer(
190193
}
191194

192195
ur_program_handle_t ur_kernel_handle_t_::getProgramHandle() const {
193-
return hProgram.get();
196+
return hProgram;
194197
}
195198

196199
ur_result_t ur_kernel_handle_t_::setExecInfo(ur_kernel_exec_info_t propName,
@@ -238,8 +241,7 @@ ur_result_t ur_kernel_handle_t_::setExecInfo(ur_kernel_exec_info_t propName,
238241
UR_APIEXPORT ur_result_t UR_APICALL
239242
urKernelCreate(ur_program_handle_t hProgram, const char *pKernelName,
240243
ur_kernel_handle_t *phKernel) {
241-
*phKernel = new ur_kernel_handle_t_(
242-
ur_kernel_handle_t_::ur_program_shared_handle_t(hProgram), pKernelName);
244+
*phKernel = new ur_kernel_handle_t_(hProgram, pKernelName);
243245
return UR_RESULT_SUCCESS;
244246
}
245247

source/adapters/level_zero/v2/kernel.hpp

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,8 @@ struct ur_single_device_kernel_t {
2626

2727
struct ur_kernel_handle_t_ : _ur_object {
2828
private:
29-
static inline ur_result_t
30-
internalProgramRelease(ur_program_handle_t hProgram) {
31-
// do a release on the program this kernel was part of without delete of the
32-
// program handle.
33-
hProgram->ur_release_program_resources(false);
34-
return UR_RESULT_SUCCESS;
35-
}
36-
3729
public:
38-
using ur_program_shared_handle_t =
39-
v2::raii::ur_shared_handle<ur_program_handle_t, urProgramRetain,
40-
internalProgramRelease>;
41-
42-
ur_kernel_handle_t_(ur_program_shared_handle_t hProgram,
43-
const char *kernelName);
30+
ur_kernel_handle_t_(ur_program_handle_t hProgram, const char *kernelName);
4431

4532
// From native handle
4633
ur_kernel_handle_t_(ur_native_handle_t hNativeKernel,
@@ -79,7 +66,7 @@ struct ur_kernel_handle_t_ : _ur_object {
7966

8067
private:
8168
// Keep the program of the kernel.
82-
ur_program_shared_handle_t hProgram;
69+
ur_program_handle_t hProgram;
8370

8471
// Vector of ur_single_device_kernel_t indexed by device->Id
8572
std::vector<std::optional<ur_single_device_kernel_t>> deviceKernels;

test/conformance/kernel/kernel_adapter_native_cpu.match

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ urKernelGetSubGroupInfoTest.InvalidEnumeration/SYCL_NATIVE_CPU___SYCL_Native_CPU
104104
urKernelGetSubGroupInfoTest.InvalidEnumeration/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}}__UR_KERNEL_SUB_GROUP_INFO_SUB_GROUP_SIZE_INTEL
105105
urKernelGetSubGroupInfoSingleTest.CompileNumSubgroupsIsZero/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}}
106106
urKernelReleaseTest.Success/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}}
107+
urKernelReleaseTest.KernelReleaseAfterProgramRelease/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}}
107108
urKernelReleaseTest.InvalidNullHandleKernel/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}}
108109
urKernelRetainTest.Success/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}}
109110
urKernelRetainTest.InvalidNullHandleKernel/SYCL_NATIVE_CPU___SYCL_Native_CPU__{{.*}}

test/conformance/kernel/urKernelRelease.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ TEST_P(urKernelReleaseTest, Success) {
1313
ASSERT_SUCCESS(urKernelRelease(kernel));
1414
}
1515

16+
TEST_P(urKernelReleaseTest, KernelReleaseAfterProgramRelease) {
17+
ASSERT_SUCCESS(urKernelRetain(kernel));
18+
ASSERT_SUCCESS(urProgramRelease(program));
19+
program = nullptr;
20+
ASSERT_SUCCESS(urKernelRelease(kernel));
21+
}
22+
1623
TEST_P(urKernelReleaseTest, InvalidNullHandleKernel) {
1724
ASSERT_EQ_RESULT(UR_RESULT_ERROR_INVALID_NULL_HANDLE,
1825
urKernelRelease(nullptr));

0 commit comments

Comments
 (0)