@@ -121,6 +121,14 @@ class _pi_device {
121
121
// / See proposal for details.
122
122
// /
123
123
struct _pi_context {
124
+
125
+ struct deleter_data {
126
+ pi_context_extended_deleter function;
127
+ void *user_data;
128
+
129
+ void operator ()() { function (user_data); }
130
+ };
131
+
124
132
using native_type = CUcontext;
125
133
126
134
enum class kind { primary, user_defined } kind_;
@@ -138,20 +146,17 @@ struct _pi_context {
138
146
139
147
~_pi_context () { cuda_piDeviceRelease (deviceId_); }
140
148
141
- void invoke_callback ()
142
- {
149
+ void invoke_extended_deleters () {
143
150
std::lock_guard<std::mutex> guard (mutex_);
144
- for (const auto & callback : destruction_callbacks_)
145
- {
146
- callback ();
151
+ for (auto &deleter : extended_deleters_) {
152
+ deleter ();
147
153
}
148
154
}
149
155
150
- template <typename Func>
151
- void register_callback (Func&& callback)
152
- {
156
+ void set_extended_deleter (pi_context_extended_deleter function,
157
+ void *user_data) {
153
158
std::lock_guard<std::mutex> guard (mutex_);
154
- destruction_callbacks_ .emplace_back (std::forward<Func>(callback) );
159
+ extended_deleters_ .emplace_back (deleter_data{function, user_data} );
155
160
}
156
161
157
162
pi_device get_device () const noexcept { return deviceId_; }
@@ -168,7 +173,7 @@ struct _pi_context {
168
173
169
174
private:
170
175
std::mutex mutex_;
171
- std::vector<std::function< void ( void )>> destruction_callbacks_ ;
176
+ std::vector<deleter_data> extended_deleters_ ;
172
177
};
173
178
174
179
// / PI Mem mapping to a CUDA memory allocation
0 commit comments