summaryrefslogtreecommitdiff
path: root/src/buffer_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2016-07-10 16:01:33 +0100
committerMaxime Coste <frrrwww@gmail.com>2016-07-10 16:34:16 +0100
commit530ecf212eedce7ae62c185873ae42033eeee925 (patch)
treeb968beadab5905f1e43ad450ce94e3d6ddd48ed3 /src/buffer_manager.cc
parent6bcfc7268f9a0b642cdda802b072034f587c5370 (diff)
Ensure buffer create/close hooks are run at appropriate times
They used to be ran before the buffer was added to the buffer list we now run them afterwards.
Diffstat (limited to 'src/buffer_manager.cc')
-rw-r--r--src/buffer_manager.cc15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc
index e743bff0..98dfc7f1 100644
--- a/src/buffer_manager.cc
+++ b/src/buffer_manager.cc
@@ -22,6 +22,9 @@ BufferManager::~BufferManager()
// hook while clearing m_buffers
m_buffer_trash = std::move(m_buffers);
+ for (auto& buffer : m_buffer_trash)
+ buffer->on_unregistered();
+
// Make sure not clients exists
ClientManager::instance().clear();
}
@@ -37,9 +40,12 @@ Buffer* BufferManager::create_buffer(String name, Buffer::Flags flags,
throw name_not_unique();
}
- m_buffers.emplace(m_buffers.begin(), new Buffer{std::move(name), flags,
- data, fs_timestamp});
- return m_buffers.front().get();
+ m_buffers.emplace(m_buffers.begin(),
+ new Buffer{std::move(name), flags, data, fs_timestamp});
+ auto& buffer = *m_buffers.front();
+ buffer.on_registered();
+
+ return &buffer;
}
void BufferManager::delete_buffer(Buffer& buffer)
@@ -48,10 +54,13 @@ void BufferManager::delete_buffer(Buffer& buffer)
{ return p.get() == &buffer; });
kak_assert(it != m_buffers.end());
+
ClientManager::instance().ensure_no_client_uses_buffer(buffer);
m_buffer_trash.emplace_back(std::move(*it));
m_buffers.erase(it);
+
+ buffer.on_unregistered();
}
Buffer* BufferManager::get_buffer_ifp(StringView name)