summaryrefslogtreecommitdiffstats
path: root/src/frontend/mame/luaengine_mem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/luaengine_mem.cpp')
-rw-r--r--src/frontend/mame/luaengine_mem.cpp140
1 files changed, 25 insertions, 115 deletions
diff --git a/src/frontend/mame/luaengine_mem.cpp b/src/frontend/mame/luaengine_mem.cpp
index 26518931e9e..8ad5d6300bb 100644
--- a/src/frontend/mame/luaengine_mem.cpp
+++ b/src/frontend/mame/luaengine_mem.cpp
@@ -205,21 +205,19 @@ public:
: m_callback(std::move(callback))
, m_engine(engine)
, m_space(space)
- , m_handler(nullptr)
+ , m_handler()
, m_name(std::move(name))
, m_start(start)
, m_end(end)
, m_mode(mode)
- , m_installing(false)
- , m_installed(false)
+ , m_installing(0U)
{
reinstall();
}
~tap_helper()
{
- if (m_handler && m_installed)
- m_handler->remove();
+ remove();
}
offs_t start() const noexcept { return m_start; }
@@ -239,11 +237,9 @@ public:
void remove()
{
- if (m_handler)
- {
- m_handler->remove();
- m_installed = false;
- }
+ ++m_installing;
+ m_handler.remove();
+ --m_installing;
}
private:
@@ -252,9 +248,8 @@ private:
{
if (m_installing)
return;
- m_installing = true;
- if (m_handler)
- m_handler->remove();
+ ++m_installing;
+ m_handler.remove();
switch (m_mode)
{
@@ -269,7 +264,7 @@ private:
if (result)
data = *result;
},
- m_handler);
+ &m_handler);
break;
case read_or_write::WRITE:
m_handler = m_space.install_write_tap(
@@ -282,118 +277,25 @@ private:
if (result)
data = *result;
},
- m_handler);
+ &m_handler);
break;
case read_or_write::READWRITE:
// won't ever get here, but compilers complain about unhandled enum value
break;
}
- m_installed = true;
- m_installing = false;
+ --m_installing;
};
sol::protected_function m_callback;
lua_engine &m_engine;
address_space &m_space;
- memory_passthrough_handler *m_handler;
+ memory_passthrough_handler m_handler;
std::string m_name;
offs_t const m_start;
offs_t const m_end;
read_or_write const m_mode;
- bool m_installing;
- bool m_installed;
-};
-
-
-//-------------------------------------------------
-// addr_space_change_notif - helper for hanging
-// on to an address space change notification
-// subscription
-//-------------------------------------------------
-
-class lua_engine::addr_space_change_notif
-{
-public:
- addr_space_change_notif(addr_space_change_notif const &) = delete;
-
- addr_space_change_notif(addr_space_change_notif &&that)
- : m_callback(std::move(that.m_callback))
- , m_engine(that.m_engine)
- , m_space(that.m_space)
- , m_id(-1)
- {
- that.remove();
- install();
- }
-
- addr_space_change_notif &operator=(addr_space_change_notif &&that)
- {
- if (&that != this)
- {
- remove();
- m_callback = std::move(that.m_callback);
- m_engine = that.m_engine;
- m_space = that.m_space;
- that.remove();
- install();
- }
- return *this;
- }
-
- addr_space_change_notif(lua_engine &engine, address_space &space, sol::protected_function &&callback)
- : m_callback(std::move(callback))
- , m_engine(&engine)
- , m_space(&space)
- , m_id(-1)
- {
- install();
- }
-
- ~addr_space_change_notif()
- {
- if (m_space)
- m_space->remove_change_notifier(m_id);
- }
-
- void remove()
- {
- if (m_space)
- {
- m_space->remove_change_notifier(m_id);
- m_space = nullptr;
- m_id = -1;
- }
- }
-
-private:
- void install()
- {
- if (m_space)
- {
- m_id = m_space->add_change_notifier(
- [this] (read_or_write mode)
- {
- char const *modestr = "";
- switch (mode)
- {
- case read_or_write::READ: modestr = "r"; break;
- case read_or_write::WRITE: modestr = "w"; break;
- case read_or_write::READWRITE: modestr = "rw"; break;
- }
- m_engine->invoke(m_callback, modestr);
- });
- }
- else
- {
- m_id = -1;
- }
- }
-
- sol::protected_function m_callback;
- lua_engine *m_engine;
- address_space *m_space;
- int m_id;
+ unsigned m_installing;
};
@@ -724,7 +626,18 @@ void lua_engine::initialize_memory(sol::table &emu)
addr_space_type["add_change_notifier"] =
[this] (addr_space &sp, sol::protected_function &&cb)
{
- return addr_space_change_notif(*this, sp.space, std::move(cb));
+ return sp.space.add_change_notifier(
+ [this, callback = std::move(cb)] (read_or_write mode)
+ {
+ char const *modestr = "";
+ switch (mode)
+ {
+ case read_or_write::READ: modestr = "r"; break;
+ case read_or_write::WRITE: modestr = "w"; break;
+ case read_or_write::READWRITE: modestr = "rw"; break;
+ }
+ invoke(callback, modestr);
+ });
};
addr_space_type["install_read_tap"] =
[this] (addr_space &sp, offs_t start, offs_t end, std::string &&name, sol::protected_function &&cb)
@@ -745,9 +658,6 @@ void lua_engine::initialize_memory(sol::table &emu)
addr_space_type["map"] = sol::property([] (addr_space &sp) { return sp.space.map(); });
- auto change_notif_type = sol().registry().new_usertype<addr_space_change_notif>("addr_space_change", sol::no_constructor);
- change_notif_type["remove"] = &addr_space_change_notif::remove;
-
auto tap_type = sol().registry().new_usertype<tap_helper>("mempassthrough", sol::no_constructor);
tap_type["reinstall"] = &tap_helper::reinstall;
tap_type["remove"] = &tap_helper::remove;