summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-04-10 18:54:01 +0200
committerMaxime Coste <frrrwww@gmail.com>2013-04-10 18:54:01 +0200
commit9999e5698d50b384eb95181ef06db4cc99c90bb2 (patch)
tree2e1fb8eafc82fa4c662afd75c044589283c39ad2 /src
parent441f9a69efc18630b4c508688ef403b0ed81b19d (diff)
Use the buffer manager to delete buffer, throw when a client is inserting
Diffstat (limited to 'src')
-rw-r--r--src/buffer_manager.cc21
-rw-r--r--src/buffer_manager.hh3
-rw-r--r--src/client_manager.cc4
-rw-r--r--src/commands.cc4
-rw-r--r--src/file.cc3
5 files changed, 30 insertions, 5 deletions
diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc
index 16ba65cf..37bef1bb 100644
--- a/src/buffer_manager.cc
+++ b/src/buffer_manager.cc
@@ -37,15 +37,34 @@ void BufferManager::unregister_buffer(Buffer& buffer)
{
if (*it == &buffer)
{
+ m_buffers.erase(it);
+ return;
+ }
+ }
+ kak_assert(false);
+}
+
+void BufferManager::delete_buffer(Buffer& buffer)
+{
+ for (auto it = m_buffers.begin(); it != m_buffers.end(); ++it)
+ {
+ if (*it == &buffer)
+ {
if (ClientManager::has_instance())
ClientManager::instance().ensure_no_client_uses_buffer(buffer);
- m_buffers.erase(it);
+ delete it->get();
return;
}
}
kak_assert(false);
}
+void BufferManager::delete_buffer_if_exists(const String& name)
+{
+ if (Buffer* buf = get_buffer_ifp(name))
+ delete_buffer(*buf);
+}
+
Buffer* BufferManager::get_buffer_ifp(const String& name)
{
for (auto& buf : m_buffers)
diff --git a/src/buffer_manager.hh b/src/buffer_manager.hh
index 3d90c1f8..01c30e81 100644
--- a/src/buffer_manager.hh
+++ b/src/buffer_manager.hh
@@ -22,6 +22,9 @@ public:
void register_buffer(Buffer& buffer);
void unregister_buffer(Buffer& buffer);
+ void delete_buffer(Buffer& buffer);
+ void delete_buffer_if_exists(const String& name);
+
iterator begin() const { return m_buffers.cbegin(); }
iterator end() const { return m_buffers.cend(); }
size_t count() const { return m_buffers.size(); }
diff --git a/src/client_manager.cc b/src/client_manager.cc
index 6db8afd4..d651a057 100644
--- a/src/client_manager.cc
+++ b/src/client_manager.cc
@@ -138,6 +138,10 @@ void ClientManager::ensure_no_client_uses_buffer(Buffer& buffer)
if (&client->context().buffer() != &buffer)
continue;
+ if (client->context().editor().is_editing())
+ throw runtime_error("client '" + client->name + "' is inserting in '" +
+ buffer.display_name() + '\'');
+
// change client context to edit the first buffer which is not the
// specified one. As BufferManager stores buffer according to last
// access, this selects a sensible buffer to display.
diff --git a/src/commands.cc b/src/commands.cc
index f1e7a484..02f816f4 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -52,7 +52,7 @@ Buffer* open_fifo(const String& name , const String& filename, Context& context)
if (fd < 0)
throw runtime_error("unable to open " + filename);
- delete BufferManager::instance().get_buffer_ifp(name);
+ BufferManager::instance().delete_buffer_if_exists(name);
Buffer* buffer = new Buffer(name, Buffer::Flags::Fifo | Buffer::Flags::NoUndo);
@@ -234,7 +234,7 @@ void delete_buffer(const CommandParameters& params, Context& context)
if (manager.count() == 1)
throw runtime_error("buffer " + buffer.name() + " is the last one");
- delete &buffer;
+ manager.delete_buffer(buffer);
}
template<typename Group>
diff --git a/src/file.cc b/src/file.cc
index 86597681..1e9b7327 100644
--- a/src/file.cc
+++ b/src/file.cc
@@ -133,8 +133,7 @@ Buffer* create_buffer_from_file(String filename)
const char* data = (const char*)mmap(nullptr, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
auto cleanup = on_scope_end([&]{ munmap((void*)data, st.st_size); close(fd); });
- if (Buffer* buffer = BufferManager::instance().get_buffer_ifp(filename))
- delete buffer;
+ BufferManager::instance().delete_buffer_if_exists(filename);
const char* pos = data;
bool crlf = false;