summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2022-02-14 01:40:31 +1100
committer Vas Crabb <vas@vastheman.com>2022-02-14 01:40:31 +1100
commitbd7f27c6f258f4a2f2703bd5a250baf5131d3e8f (patch)
tree99bfefabaff86c6e365a093dd4d32a87d6583b16
parente4588d1f454e283d7df8c60be42641570928571f (diff)
-emu/emumem.h: Hold onto memory cache handler change subscriptions.
-cpu/mips: Replaced a std::function with a marginally more efficient delegate.
-rw-r--r--src/devices/cpu/mips/mips3.cpp16
-rw-r--r--src/devices/cpu/mips/mips3.h2
-rw-r--r--src/emu/emumem.h27
-rw-r--r--src/lib/util/notifier.h2
4 files changed, 25 insertions, 22 deletions
diff --git a/src/devices/cpu/mips/mips3.cpp b/src/devices/cpu/mips/mips3.cpp
index b209baa6558..f34de33c24f 100644
--- a/src/devices/cpu/mips/mips3.cpp
+++ b/src/devices/cpu/mips/mips3.cpp
@@ -402,14 +402,14 @@ void mips3_device::device_start()
if (m_data_bits == 32)
{
m_program->cache(m_cache32le);
- m_pr32 = [this](offs_t address) -> u32 { return m_cache32le.read_dword(address); };
- m_prptr = [this](offs_t address) -> const void * { return m_cache32le.read_ptr(address); };
+ m_pr32 = delegate<u32 (offs_t)>(&memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache::read_dword, &m_cache32le);
+ m_prptr = [this] (offs_t address) -> const void * { return m_cache32le.read_ptr(address); };
}
else
{
m_program->cache(m_cache64le);
- m_pr32 = [this](offs_t address) -> u32 { return m_cache64le.read_dword(address); };
- m_prptr = [this](offs_t address) -> const void * { return m_cache64le.read_ptr(address); };
+ m_pr32 = delegate<u32 (offs_t)>(&memory_access<32, 3, 0, ENDIANNESS_LITTLE>::cache::read_dword, &m_cache64le);
+ m_prptr = [this] (offs_t address) -> const void * { return m_cache64le.read_ptr(address); };
}
}
else
@@ -417,14 +417,14 @@ void mips3_device::device_start()
if (m_data_bits == 32)
{
m_program->cache(m_cache32be);
- m_pr32 = [this](offs_t address) -> u32 { return m_cache32be.read_dword(address); };
- m_prptr = [this](offs_t address) -> const void * { return m_cache32be.read_ptr(address); };
+ m_pr32 = delegate<u32 (offs_t)>(&memory_access<32, 2, 0, ENDIANNESS_BIG>::cache::read_dword, &m_cache32be);
+ m_prptr = [this] (offs_t address) -> const void * { return m_cache32be.read_ptr(address); };
}
else
{
m_program->cache(m_cache64be);
- m_pr32 = [this](offs_t address) -> u32 { return m_cache64be.read_dword(address); };
- m_prptr = [this](offs_t address) -> const void * { return m_cache64be.read_ptr(address); };
+ m_pr32 = delegate<u32 (offs_t)>(&memory_access<32, 3, 0, ENDIANNESS_BIG>::cache::read_dword, &m_cache64be);
+ m_prptr = [this] (offs_t address) -> const void * { return m_cache64be.read_ptr(address); };
}
}
diff --git a/src/devices/cpu/mips/mips3.h b/src/devices/cpu/mips/mips3.h
index 0657a511a48..2f67e6f0be2 100644
--- a/src/devices/cpu/mips/mips3.h
+++ b/src/devices/cpu/mips/mips3.h
@@ -431,7 +431,7 @@ protected:
address_space * m_program;
uint32_t m_data_bits;
- std::function<u32(offs_t)> m_pr32;
+ delegate<u32 (offs_t)> m_pr32;
std::function<const void * (offs_t)> m_prptr;
uint32_t c_system_clock;
uint32_t m_cpu_clock;
diff --git a/src/emu/emumem.h b/src/emu/emumem.h
index 3e01ecfc121..c805de6155c 100644
--- a/src/emu/emumem.h
+++ b/src/emu/emumem.h
@@ -1573,6 +1573,8 @@ private:
handler_entry_read <Width, AddrShift> *m_root_read; // decode tree roots
handler_entry_write<Width, AddrShift> *m_root_write;
+ util::notifier_subscription m_subscription;
+
NativeType read_native(offs_t address, NativeType mask = ~NativeType(0));
void write_native(offs_t address, NativeType data, NativeType mask = ~NativeType(0));
std::pair<NativeType, u16> read_native_flags(offs_t address, NativeType mask = ~NativeType(0));
@@ -2444,18 +2446,19 @@ set(address_space *space, std::pair<void *, void *> rw)
m_space = space;
m_addrmask = space->addrmask();
- space->add_change_notifier([this](read_or_write mode) {
- if(u32(mode) & u32(read_or_write::READ)) {
- m_addrend_r = 0;
- m_addrstart_r = 1;
- m_cache_r = nullptr;
- }
- if(u32(mode) & u32(read_or_write::WRITE)) {
- m_addrend_w = 0;
- m_addrstart_w = 1;
- m_cache_w = nullptr;
- }
- });
+ m_subscription = space->add_change_notifier(
+ [this] (read_or_write mode) {
+ if(u32(mode) & u32(read_or_write::READ)) {
+ m_addrend_r = 0;
+ m_addrstart_r = 1;
+ m_cache_r = nullptr;
+ }
+ if(u32(mode) & u32(read_or_write::WRITE)) {
+ m_addrend_w = 0;
+ m_addrstart_w = 1;
+ m_cache_w = nullptr;
+ }
+ });
m_root_read = (handler_entry_read <Width, AddrShift> *)(rw.first);
m_root_write = (handler_entry_write<Width, AddrShift> *)(rw.second);
diff --git a/src/lib/util/notifier.h b/src/lib/util/notifier.h
index b5dfaaa0f3c..237417e49ab 100644
--- a/src/lib/util/notifier.h
+++ b/src/lib/util/notifier.h
@@ -91,7 +91,7 @@ public:
/// inactive if it is default constructed, reset, transferred away,
/// or if the underlying notifier is destructed.
/// \return True if the subscription is active, false otherwise.
- explicit operator bool() const noexcept { return bool(m_token.lock()); }
+ explicit operator bool() const noexcept { return !m_token.expired(); }
/// \brief Transfer ownership of a subscription
///