From 2204b7cf0667cc1124606c9882aba82dcf650fc3 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Tue, 12 Aug 2014 19:24:09 +0100 Subject: Defer deletion of buffers to after the event loop We can have SelectionList in flights on the buffer, so mark it for deletion by moving it in a buffer trash, and effectively delete it later, at a point where there should not be any further access to it. --- src/buffer_manager.cc | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'src/buffer_manager.cc') diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc index bb03ef6d..a521ad58 100644 --- a/src/buffer_manager.cc +++ b/src/buffer_manager.cc @@ -41,6 +41,14 @@ void BufferManager::unregister_buffer(Buffer& buffer) return; } } + for (auto it = m_buffer_trash.begin(); it != m_buffer_trash.end(); ++it) + { + if (*it == &buffer) + { + m_buffer_trash.erase(it); + return; + } + } kak_assert(false); } @@ -52,7 +60,9 @@ void BufferManager::delete_buffer(Buffer& buffer) { if (ClientManager::has_instance()) ClientManager::instance().ensure_no_client_uses_buffer(buffer); - delete it->get(); + + m_buffers.erase(it); + m_buffer_trash.emplace_back(&buffer); return; } } @@ -121,4 +131,10 @@ CandidateList BufferManager::complete_buffer_name(StringView prefix, return result.empty() ? subsequence_result : result; } +void BufferManager::clear_buffer_trash() +{ + while (not m_buffer_trash.empty()) + delete m_buffer_trash.back().get(); +} + } -- cgit v1.2.3