@@ -136,6 +136,22 @@ struct conn_info_head {
136
136
}
137
137
}
138
138
139
+ void clear () noexcept {
140
+ cc_waiter_.clear ();
141
+ wt_waiter_.clear ();
142
+ rd_waiter_.clear ();
143
+ acc_h_.clear ();
144
+ }
145
+
146
+ static void clear_storage (char const * prefix, char const * name) noexcept {
147
+ auto p = ipc::make_string (prefix);
148
+ auto n = ipc::make_string (name);
149
+ ipc::detail::waiter::clear_storage (ipc::make_prefix (p, {" CC_CONN__" , n}).c_str ());
150
+ ipc::detail::waiter::clear_storage (ipc::make_prefix (p, {" WT_CONN__" , n}).c_str ());
151
+ ipc::detail::waiter::clear_storage (ipc::make_prefix (p, {" RD_CONN__" , n}).c_str ());
152
+ ipc::shm::handle::clear_storage (ipc::make_prefix (p, {" AC_CONN__" , n}).c_str ());
153
+ }
154
+
139
155
void quit_waiting () {
140
156
cc_waiter_.quit_waiting ();
141
157
wt_waiter_.quit_waiting ();
@@ -386,6 +402,20 @@ struct queue_generator {
386
402
}
387
403
}
388
404
405
+ void clear () noexcept {
406
+ que_.clear ();
407
+ conn_info_head::clear ();
408
+ }
409
+
410
+ static void clear_storage (char const * prefix, char const * name) noexcept {
411
+ queue_t::clear_storage (ipc::make_prefix (prefix, {
412
+ " QU_CONN__" ,
413
+ ipc::to_string (DataSize), " __" ,
414
+ ipc::to_string (AlignSize), " __" ,
415
+ name}).c_str ());
416
+ conn_info_head::clear_storage (prefix, name);
417
+ }
418
+
389
419
void disconnect_receiver () {
390
420
bool dis = que_.disconnect ();
391
421
this ->quit_waiting ();
@@ -739,6 +769,27 @@ char const * chan_impl<Flag>::name(ipc::handle_t h) {
739
769
return (info == nullptr ) ? nullptr : info->name_ .c_str ();
740
770
}
741
771
772
+ template <typename Flag>
773
+ void chan_impl<Flag>::clear(ipc::handle_t h) noexcept {
774
+ disconnect (h);
775
+ using conn_info_t = typename detail_impl<policy_t <Flag>>::conn_info_t ;
776
+ auto conn_info_p = static_cast <conn_info_t *>(h);
777
+ if (conn_info_p == nullptr ) return ;
778
+ conn_info_p->clear ();
779
+ destroy (h);
780
+ }
781
+
782
+ template <typename Flag>
783
+ void chan_impl<Flag>::clear_storage(char const * name) noexcept {
784
+ chan_impl<Flag>::clear_storage ({nullptr }, name);
785
+ }
786
+
787
+ template <typename Flag>
788
+ void chan_impl<Flag>::clear_storage(prefix pref, char const * name) noexcept {
789
+ using conn_info_t = typename detail_impl<policy_t <Flag>>::conn_info_t ;
790
+ conn_info_t::clear_storage (pref.str , name);
791
+ }
792
+
742
793
template <typename Flag>
743
794
std::size_t chan_impl<Flag>::recv_count(ipc::handle_t h) {
744
795
return detail_impl<policy_t <Flag>>::recv_count (h);
0 commit comments