diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2014-08-12 19:24:09 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2014-08-12 19:24:09 +0100 |
| commit | 2204b7cf0667cc1124606c9882aba82dcf650fc3 (patch) | |
| tree | 8a892df4dbf8cacc8178f12ced9a61570e463750 /src/buffer_manager.cc | |
| parent | e2b3dd0ca4b71fd7cfcceeba35b97497631e72bd (diff) | |
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.
Diffstat (limited to 'src/buffer_manager.cc')
| -rw-r--r-- | src/buffer_manager.cc | 18 |
1 files changed, 17 insertions, 1 deletions
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(); +} + } |
