summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2019-02-17 23:52:05 +0100
committer couriersud <couriersud@gmx.org>2019-02-17 23:52:05 +0100
commit17d784d83bf43ca0ab995711d8e2da82ba0cc38b (patch)
treed30008a1a9198d4b9b8b9edfda5ce379366a0d97 /src/lib
parent11c3b63c412e8de1e78b4a17d784311b5a22860b (diff)
netlist: remove locked-in context from sources. (nw)
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/netlist/nl_base.cpp8
-rw-r--r--src/lib/netlist/nl_base.h9
-rw-r--r--src/lib/netlist/nl_lists.h4
-rw-r--r--src/lib/netlist/nl_setup.cpp10
-rw-r--r--src/lib/netlist/nl_setup.h30
-rw-r--r--src/lib/netlist/prg/nltool.cpp15
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");