@@ -121,6 +121,14 @@ class _pi_device {
121121// / See proposal for details.
122122// /
123123struct _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+
124132 using native_type = CUcontext;
125133
126134 enum class kind { primary, user_defined } kind_;
@@ -138,20 +146,17 @@ struct _pi_context {
138146
139147 ~_pi_context () { cuda_piDeviceRelease (deviceId_); }
140148
141- void invoke_callback ()
142- {
149+ void invoke_extended_deleters () {
143150 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 ();
147153 }
148154 }
149155
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) {
153158 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} );
155160 }
156161
157162 pi_device get_device () const noexcept { return deviceId_; }
@@ -168,7 +173,7 @@ struct _pi_context {
168173
169174private:
170175 std::mutex mutex_;
171- std::vector<std::function< void ( void )>> destruction_callbacks_ ;
176+ std::vector<deleter_data> extended_deleters_ ;
172177};
173178
174179// / PI Mem mapping to a CUDA memory allocation
0 commit comments