diff options
| author | 2019-02-17 23:52:05 +0100 | |
|---|---|---|
| committer | 2019-02-17 23:52:05 +0100 | |
| commit | 17d784d83bf43ca0ab995711d8e2da82ba0cc38b (patch) | |
| tree | d30008a1a9198d4b9b8b9edfda5ce379366a0d97 /src/lib | |
| parent | 11c3b63c412e8de1e78b4a17d784311b5a22860b (diff) | |
netlist: remove locked-in context from sources. (nw)
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/netlist/nl_base.cpp | 8 | ||||
| -rw-r--r-- | src/lib/netlist/nl_base.h | 9 | ||||
| -rw-r--r-- | src/lib/netlist/nl_lists.h | 4 | ||||
| -rw-r--r-- | src/lib/netlist/nl_setup.cpp | 10 | ||||
| -rw-r--r-- | src/lib/netlist/nl_setup.h | 30 | ||||
| -rw-r--r-- | src/lib/netlist/prg/nltool.cpp | 15 |
6 files changed, 36 insertions, 40 deletions
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index d032ad45b02..c99bc1d116b 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -237,13 +237,13 @@ detail::terminal_type detail::core_terminal_t::type() const // ---------------------------------------------------------------------------------------- netlist_t::netlist_t(const pstring &aname, std::unique_ptr<callbacks_t> callbacks) - : m_time(netlist_time::zero()) - , m_mainclock(nullptr) - , m_state(plib::make_unique<netlist_state_t>(aname, + : m_state(plib::make_unique<netlist_state_t>(aname, std::move(callbacks), plib::make_unique<setup_t>(*this))) // FIXME, ugly but needed to have netlist_state_t constructed first - , m_queue(*m_state) , m_solver(nullptr) + , m_time(netlist_time::zero()) + , m_mainclock(nullptr) + , m_queue(*m_state) { devices::initialize_factory(nlstate().setup().factory()); NETLIST_NAME(base)(nlstate().setup()); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index bee5ffe9b38..24f57c979c1 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1453,19 +1453,16 @@ namespace netlist void print_stats() const; private: + std::unique_ptr<netlist_state_t> m_state; + devices::NETLIB_NAME(solver) * m_solver; + /* mostly rw */ PALIGNAS_CACHELINE() netlist_time m_time; - PALIGNAS_CACHELINE() devices::NETLIB_NAME(mainclock) * m_mainclock; - PALIGNAS_CACHELINE() - std::unique_ptr<netlist_state_t> m_state; - PALIGNAS_CACHELINE() detail::queue_t m_queue; - devices::NETLIB_NAME(solver) * m_solver; - // performance nperftime_t<NL_KEEP_STATISTICS> m_stat_mainloop; nperfcount_t<NL_KEEP_STATISTICS> m_perf_out_processed; diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index 7dfe8139e19..39f4343be30 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -37,6 +37,7 @@ namespace netlist void lock() noexcept{ while (m_lock.test_and_set(std::memory_order_acquire)) { } } void unlock() noexcept { m_lock.clear(std::memory_order_release); } private: + PALIGNAS_CACHELINE() std::atomic_flag m_lock = ATOMIC_FLAG_INIT; }; @@ -96,7 +97,7 @@ namespace netlist /* Use TS = true for a threadsafe queue */ template <class T, bool TS, bool KEEPSTAT, class QueueOp = typename T::QueueOp> - class PALIGNAS_CACHELINE() timed_queue_linear : plib::nocopyassignmove + class timed_queue_linear : plib::nocopyassignmove { public: @@ -192,6 +193,7 @@ namespace netlist using lock_guard_type = std::lock_guard<mutex_type>; mutex_type m_lock; + PALIGNAS_CACHELINE() T * m_end; std::vector<T> m_list; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index b8fba6f03aa..b9196852878 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -101,7 +101,7 @@ namespace netlist { for (auto &source : m_sources) { - if (source->parse(netlist_name)) + if (source->parse(*this, netlist_name)) return; } log().fatal(MF_1_NOT_FOUND_IN_SOURCE_COLLECTION, netlist_name); @@ -1136,13 +1136,13 @@ void setup_t::prepare_to_run() // base sources // ---------------------------------------------------------------------------------------- -bool source_t::parse(const pstring &name) +bool source_t::parse(nlparse_t &setup, const pstring &name) { if (m_type != SOURCE) return false; else { - return m_setup.parse_stream(stream(name), name); + return setup.parse_stream(stream(name), name); } } @@ -1164,11 +1164,11 @@ std::unique_ptr<plib::pistream> source_file_t::stream(const pstring &name) return plib::make_unique<plib::pifilestream>(m_filename); } -bool source_proc_t::parse(const pstring &name) +bool source_proc_t::parse(nlparse_t &setup, const pstring &name) { if (name == m_setup_func_name) { - m_setup_func(setup()); + m_setup_func(setup); return true; } else diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index bbffba1257a..448df3490da 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -67,7 +67,7 @@ void NETLIST_NAME(name)(netlist::nlparse_t &setup) \ #define NETLIST_END() } #define LOCAL_SOURCE(name) \ - setup.register_source(plib::make_unique<netlist::source_proc_t>(setup, # name, &NETLIST_NAME(name))); + setup.register_source(plib::make_unique<netlist::source_proc_t>(# name, &NETLIST_NAME(name))); #define LOCAL_LIB_ENTRY(name) \ LOCAL_SOURCE(name) \ @@ -182,24 +182,22 @@ namespace netlist using list_t = std::vector<std::unique_ptr<source_t>>; - source_t(nlparse_t &setup, const type_t type = SOURCE) - : m_setup(setup) - , m_type(type) + source_t(const type_t type = SOURCE) + : m_type(type) {} COPYASSIGNMOVE(source_t, delete) virtual ~source_t() noexcept = default; - virtual bool parse(const pstring &name); - nlparse_t &setup() { return m_setup; } + virtual bool parse(nlparse_t &setup, const pstring &name); + type_t type() const { return m_type; } protected: virtual std::unique_ptr<plib::pistream> stream(const pstring &name) = 0; private: - nlparse_t &m_setup; const type_t m_type; }; @@ -400,8 +398,8 @@ namespace netlist { public: - source_string_t(setup_t &setup, const pstring &source) - : source_t(setup), m_str(source) + source_string_t(const pstring &source) + : source_t(), m_str(source) { } @@ -416,8 +414,8 @@ namespace netlist { public: - source_file_t(setup_t &setup, const pstring &filename) - : source_t(setup), m_filename(filename) + source_file_t(const pstring &filename) + : source_t(), m_filename(filename) { } @@ -431,8 +429,8 @@ namespace netlist class source_mem_t : public source_t { public: - source_mem_t(setup_t &setup, const char *mem) - : source_t(setup), m_str(mem) + source_mem_t(const char *mem) + : source_t(), m_str(mem) { } @@ -446,14 +444,14 @@ namespace netlist class source_proc_t : public source_t { public: - source_proc_t(nlparse_t &setup, pstring name, void (*setup_func)(nlparse_t &)) - : source_t(setup), + source_proc_t(pstring name, void (*setup_func)(nlparse_t &)) + : source_t(), m_setup_func(setup_func), m_setup_func_name(name) { } - bool parse(const pstring &name) override; + bool parse(nlparse_t &setup, const pstring &name) override; protected: std::unique_ptr<plib::pistream> stream(const pstring &name) override; diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index 37b2ba6565d..ea7e1426626 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -120,9 +120,8 @@ NETLIST_END() class netlist_data_folder_t : public netlist::source_t { public: - netlist_data_folder_t(netlist::setup_t &setup, - pstring folder) - : netlist::source_t(setup, netlist::source_t::DATA) + netlist_data_folder_t(pstring folder) + : netlist::source_t(netlist::source_t::DATA) , m_folder(folder) { } @@ -189,9 +188,9 @@ public: setup().add_define(d); for (auto & r : roms) - setup().register_source(plib::make_unique<netlist_data_folder_t>(setup(), r)); + setup().register_source(plib::make_unique<netlist_data_folder_t>(r)); - setup().register_source(plib::make_unique<netlist::source_file_t>(setup(), filename)); + setup().register_source(plib::make_unique<netlist::source_file_t>(filename)); setup().include(name); create_dynamic_logs(logs); @@ -524,7 +523,7 @@ void tool_app_t::create_header() nt.log().verbose.set_enabled(false); nt.log().warning.set_enabled(false); - nt.setup().register_source(plib::make_unique<netlist::source_proc_t>(nt.setup(), "dummy", &netlist_dummy)); + nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy)); nt.setup().include("dummy"); pout("// license:GPL-2.0+\n"); @@ -568,7 +567,7 @@ void tool_app_t::create_docheader() nt.log().verbose.set_enabled(false); nt.log().warning.set_enabled(false); - nt.setup().register_source(plib::make_unique<netlist::source_proc_t>(nt.setup(), "dummy", &netlist_dummy)); + nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy)); nt.setup().include("dummy"); std::vector<pstring> devs; @@ -620,7 +619,7 @@ void tool_app_t::listdevices() netlist::factory::list_t &list = nt.setup().factory(); - nt.setup().register_source(plib::make_unique<netlist::source_proc_t>(nt.setup(), "dummy", &netlist_dummy)); + nt.setup().register_source(plib::make_unique<netlist::source_proc_t>("dummy", &netlist_dummy)); nt.setup().include("dummy"); |
