Fixed memory allocation in netlist code. This caused a number of memory

leaks to disappear. (nw)
This commit is contained in:
couriersud 2015-01-18 01:43:59 +01:00
parent 8cea1bf9e6
commit 2904503923
18 changed files with 285 additions and 186 deletions

View File

@ -69,10 +69,16 @@ netlist_matrix_solver_direct_t<m_N, _storage_N>::~netlist_matrix_solver_direct_t
{
//delete[] m_A[k];
}
//delete[] m_last_RHS;
for (int k = 0; k < N(); k++)
{
nl_free(m_terms[k]);
nl_free(m_row_ops[k]);
}
nl_free(m_row_ops[N()]);
//delete[] m_last_RHS;
//delete[] m_RHS;
delete[] m_terms;
delete[] m_rails_temp;
nl_free_array(m_terms);
nl_free_array(m_rails_temp);
//delete[] m_row_ops;
}
@ -452,12 +458,12 @@ netlist_matrix_solver_direct_t<m_N, _storage_N>::netlist_matrix_solver_direct_t(
, m_dim(size)
, m_lp_fact(0)
{
m_terms = new terms_t *[N()];
m_rails_temp = new terms_t[N()];
m_terms = nl_alloc_array(terms_t *, N());
m_rails_temp = nl_alloc_array(terms_t, N());
for (int k = 0; k < N(); k++)
{
m_terms[k] = new terms_t;
m_terms[k] = nl_alloc(terms_t);
m_row_ops[k] = vector_ops_t::create_ops(k);
}
m_row_ops[N()] = vector_ops_t::create_ops(N());
@ -469,12 +475,12 @@ netlist_matrix_solver_direct_t<m_N, _storage_N>::netlist_matrix_solver_direct_t(
, m_dim(size)
, m_lp_fact(0)
{
m_terms = new terms_t *[N()];
m_rails_temp = new terms_t[N()];
m_terms = nl_alloc_array(terms_t *, N());
m_rails_temp = nl_alloc_array(terms_t, N());
for (int k = 0; k < N(); k++)
{
m_terms[k] = new terms_t;
m_terms[k] = nl_alloc(terms_t);
m_row_ops[k] = vector_ops_t::create_ops(k);
}
m_row_ops[N()] = vector_ops_t::create_ops(N());

View File

@ -44,31 +44,31 @@ vector_ops_t *vector_ops_t::create_ops(const int size)
switch (size)
{
case 1:
return new vector_ops_impl_t<1>();
return nl_alloc(vector_ops_impl_t<1>);
case 2:
return new vector_ops_impl_t<2>();
return nl_alloc(vector_ops_impl_t<2>);
case 3:
return new vector_ops_impl_t<3>();
return nl_alloc(vector_ops_impl_t<3>);
case 4:
return new vector_ops_impl_t<4>();
return nl_alloc(vector_ops_impl_t<4>);
case 5:
return new vector_ops_impl_t<5>();
return nl_alloc(vector_ops_impl_t<5>);
case 6:
return new vector_ops_impl_t<6>();
return nl_alloc(vector_ops_impl_t<6>);
case 7:
return new vector_ops_impl_t<7>();
return nl_alloc(vector_ops_impl_t<7>);
case 8:
return new vector_ops_impl_t<8>();
return nl_alloc(vector_ops_impl_t<8>);
case 9:
return new vector_ops_impl_t<9>();
return nl_alloc(vector_ops_impl_t<9>);
case 10:
return new vector_ops_impl_t<10>();
return nl_alloc(vector_ops_impl_t<10>);
case 11:
return new vector_ops_impl_t<11>();
return nl_alloc(vector_ops_impl_t<11>);
case 12:
return new vector_ops_impl_t<12>();
return nl_alloc(vector_ops_impl_t<12>);
default:
return new vector_ops_impl_t<0>(size);
return nl_alloc(vector_ops_impl_t<0>, size);
}
}
@ -91,8 +91,6 @@ ATTR_COLD void terms_t::set_pointers()
m_term[i]->m_Idr1 = &m_Idr[i];
m_other_curanalog[i] = &m_term[i]->m_otherterm->net().as_analog().m_cur_Analog;
}
m_ops = vector_ops_t::create_ops(m_gt.count());
}
// ----------------------------------------------------------------------------------------
@ -112,7 +110,7 @@ ATTR_COLD netlist_matrix_solver_t::netlist_matrix_solver_t(const eSolverType typ
ATTR_COLD netlist_matrix_solver_t::~netlist_matrix_solver_t()
{
for (int i = 0; i < m_inps.count(); i++)
delete m_inps[i];
global_free(m_inps[i]);
}
ATTR_COLD void netlist_matrix_solver_t::setup(netlist_analog_net_t::list_t &nets)
@ -176,7 +174,7 @@ ATTR_COLD void netlist_matrix_solver_t::setup(netlist_analog_net_t::list_t &nets
if (net_proxy_output == NULL)
{
net_proxy_output = new netlist_analog_output_t();
net_proxy_output = nl_alloc(netlist_analog_output_t);
net_proxy_output->init_object(*this, this->name() + "." + pstring::sprintf("m%d", m_inps.count()));
m_inps.add(net_proxy_output);
net_proxy_output->m_proxied_net = &p->net().as_analog();
@ -380,7 +378,7 @@ NETLIB_NAME(solver)::~NETLIB_NAME(solver)()
while (e != NULL)
{
netlist_matrix_solver_t * const *en = m_mat_solvers.next(e);
delete *e;
global_free(*e);
e = en;
}
@ -435,15 +433,16 @@ template <int m_N, int _storage_N>
netlist_matrix_solver_t * NETLIB_NAME(solver)::create_solver(int size, const int gs_threshold, const bool use_specific)
{
if (use_specific && m_N == 1)
return new netlist_matrix_solver_direct1_t(m_params);
return nl_alloc(netlist_matrix_solver_direct1_t, m_params);
else if (use_specific && m_N == 2)
return new netlist_matrix_solver_direct2_t(m_params);
return nl_alloc(netlist_matrix_solver_direct2_t, m_params);
else
{
typedef netlist_matrix_solver_gauss_seidel_t<m_N,_storage_N> solver_N;
if (size >= gs_threshold)
return new netlist_matrix_solver_gauss_seidel_t<m_N,_storage_N>(m_params, size);
return nl_alloc(solver_N, m_params, size);
else
return new netlist_matrix_solver_direct_t<m_N, _storage_N>(m_params, size);
return nl_alloc(solver_N, m_params, size);
}
}

View File

@ -155,7 +155,7 @@ class ATTR_ALIGNED(64) terms_t
NETLIST_PREVENT_COPYING(terms_t)
public:
ATTR_COLD terms_t() : m_railstart(0), m_ops(NULL)
ATTR_COLD terms_t() : m_railstart(0)
{}
ATTR_COLD void clear()
@ -175,7 +175,6 @@ class ATTR_ALIGNED(64) terms_t
ATTR_HOT inline double *go() { return m_go; }
ATTR_HOT inline double *Idr() { return m_Idr; }
ATTR_HOT inline double **other_curanalog() { return m_other_curanalog; }
ATTR_HOT vector_ops_t *ops() { return m_ops; }
ATTR_COLD void set_pointers();
@ -188,7 +187,6 @@ private:
plinearlist_t<double> m_gt;
plinearlist_t<double> m_Idr;
plinearlist_t<double *> m_other_curanalog;
vector_ops_t * m_ops;
};
class netlist_matrix_solver_t : public netlist_device_t

View File

@ -49,6 +49,7 @@
#include "net_lib.h"
#include "nld_system.h"
#include "../nl_factory.h"
NETLIST_START(diode_models)
NET_MODEL(".model 1N914 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)")
@ -64,24 +65,10 @@ NETLIST_END()
#define xstr(s) # s
#define ENTRY1(_nic, _name, _defparam) register_device<_nic>( # _name, xstr(_nic), _defparam );
#define ENTRY1(_nic, _name, _defparam) factory.register_device<_nic>( # _name, xstr(_nic), _defparam );
#define ENTRY(_nic, _name, _defparam) ENTRY1(NETLIB_NAME(_nic), _name, _defparam)
netlist_factory_t::netlist_factory_t()
{
}
netlist_factory_t::~netlist_factory_t()
{
for (net_device_t_base_factory * const *e = m_list.first(); e != NULL; e = m_list.next(e))
{
net_device_t_base_factory *p = *e;
delete p;
}
m_list.clear();
}
void netlist_factory_t::initialize()
void nl_initialize_factory(netlist_factory_t &factory)
{
ENTRY(R, RES, "R")
ENTRY(POT, POT, "R")
@ -162,39 +149,3 @@ void netlist_factory_t::initialize()
ENTRY(NE555_dip, NE555_DIP, "-")
}
netlist_device_t *netlist_factory_t::new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const
{
for (net_device_t_base_factory * const *e = m_list.first(); e != NULL; e = m_list.next(e))
{
net_device_t_base_factory *p = *e;
if (strcmp(p->classname(), classname) == 0)
{
netlist_device_t *ret = p->Create();
return ret;
}
p++;
}
setup.netlist().error("Class %s not found!\n", classname.cstr());
return NULL; // appease code analysis
}
netlist_device_t *netlist_factory_t::new_device_by_name(const pstring &name, netlist_setup_t &setup) const
{
net_device_t_base_factory *f = factory_by_name(name, setup);
return f->Create();
}
net_device_t_base_factory * netlist_factory_t::factory_by_name(const pstring &name, netlist_setup_t &setup) const
{
for (net_device_t_base_factory * const *e = m_list.first(); e != NULL; e = m_list.next(e))
{
net_device_t_base_factory *p = *e;
if (strcmp(p->name(), name) == 0)
{
return p;
}
p++;
}
setup.netlist().error("Class %s not found!\n", name.cstr());
return NULL; // appease code analysis
}

View File

@ -99,4 +99,6 @@
NETLIST_EXTERNAL(diode_models);
NETLIST_EXTERNAL(bjt_models);
void nl_initialize_factory(netlist_factory_t &factory);
#endif

View File

@ -26,6 +26,7 @@ NETLISTOBJS+= \
$(NETLISTOBJ)/nl_base.o \
$(NETLISTOBJ)/nl_parser.o \
$(NETLISTOBJ)/nl_setup.o \
$(NETLISTOBJ)/nl_factory.o \
$(NETLISTOBJ)/pstring.o \
$(NETLISTOBJ)/pstate.o \
$(NETLISTOBJ)/analog/nld_bjt.o \

View File

@ -152,7 +152,7 @@ netlist_base_t::~netlist_base_t()
{
if (!m_nets[i]->isRailNet())
{
delete m_nets[i];
global_free(m_nets[i]);
}
}

View File

@ -1370,80 +1370,4 @@ ATTR_HOT inline void netlist_analog_output_t::set_Q(const double newQ)
}
}
// -----------------------------------------------------------------------------
// net_dev class factory
// -----------------------------------------------------------------------------
class net_device_t_base_factory
{
NETLIST_PREVENT_COPYING(net_device_t_base_factory)
public:
ATTR_COLD net_device_t_base_factory(const pstring &name, const pstring &classname,
const pstring &def_param)
: m_name(name), m_classname(classname), m_def_param(def_param)
{}
ATTR_COLD virtual ~net_device_t_base_factory() {}
ATTR_COLD virtual netlist_device_t *Create() const = 0;
ATTR_COLD const pstring &name() const { return m_name; }
ATTR_COLD const pstring &classname() const { return m_classname; }
ATTR_COLD const pstring &param_desc() const { return m_def_param; }
ATTR_COLD const nl_util::pstring_list term_param_list();
ATTR_COLD const nl_util::pstring_list def_params();
protected:
pstring m_name; /* device name */
pstring m_classname; /* device class name */
pstring m_def_param; /* default parameter */
};
template <class C>
class net_device_t_factory : public net_device_t_base_factory
{
NETLIST_PREVENT_COPYING(net_device_t_factory)
public:
ATTR_COLD net_device_t_factory(const pstring &name, const pstring &classname,
const pstring &def_param)
: net_device_t_base_factory(name, classname, def_param) { }
ATTR_COLD netlist_device_t *Create() const
{
netlist_device_t *r = new C();
//r->init(setup, name);
return r;
}
};
class netlist_factory_t
{
public:
typedef plinearlist_t<net_device_t_base_factory *> list_t;
ATTR_COLD netlist_factory_t();
ATTR_COLD ~netlist_factory_t();
ATTR_COLD void initialize();
template<class _C>
ATTR_COLD void register_device(const pstring &name, const pstring &classname,
const pstring &def_param)
{
m_list.add(new net_device_t_factory< _C >(name, classname, def_param) );
}
ATTR_COLD netlist_device_t *new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const;
ATTR_COLD netlist_device_t *new_device_by_name(const pstring &name, netlist_setup_t &setup) const;
ATTR_COLD net_device_t_base_factory * factory_by_name(const pstring &name, netlist_setup_t &setup) const;
const list_t &list() { return m_list; }
private:
list_t m_list;
};
#endif /* NLBASE_H_ */

View File

@ -109,6 +109,10 @@
// this macro passes an item followed by a string version of itself as two consecutive parameters
#define NLNAME(x) x, #x
//============================================================
// Exceptions
//============================================================
// emu_fatalerror is a generic fatal exception that provides an error string
class nl_fatalerror : public std::exception
{
@ -130,6 +134,21 @@ public:
}
};
//============================================================
// Memory allocation
//============================================================
#define nl_alloc(T, ...) global_alloc(T(__VA_ARGS__))
#define nl_alloc_array(T, N) global_alloc_array(T, N)
#define nl_free(_ptr) global_free(_ptr)
#define nl_free_array(_ptr) global_free_array(_ptr)
//============================================================
// Asserts
//============================================================
#ifdef MAME_DEBUG
#define nl_assert(x) do { if (!(x)) throw nl_fatalerror("assert: %s:%d: %s", __FILE__, __LINE__, #x); } while (0)
#define nl_assert_always(x, msg) do { if (!(x)) throw nl_fatalerror("Fatal error: %s\nCaused by assert: %s:%d: %s", msg, __FILE__, __LINE__, #x); } while (0)

View File

@ -13,7 +13,7 @@
* -------------------------------------------------------------------- */
//#define CHIP(_n, _t) netlist.register_dev(NET_NEW(_t ## _dip), _n);
#define CHIP(_n, _t) setup.register_dev( new nld_ ## _t ## _dip(), _n);
#define CHIP(_n, _t) setup.register_dev( nL_alloc(nld_ ## _t ## _dip()), _n);
#define CONNECTION( ... ) CONNECTIONY( CONNECTIONX( __VA_ARGS__ ) )
#define CONNECTIONY(_a) _a

View File

@ -0,0 +1,102 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
/***************************************************************************
nl_factory.c
Discrete netlist implementation.
****************************************************************************
Couriersud reserves the right to license the code under a less restrictive
license going forward.
Copyright Nicola Salmoria and the MAME team
All rights reserved.
Redistribution and use of this code or any derivative works are permitted
provided that the following conditions are met:
* Redistributions may not be sold, nor may they be used in a commercial
product or activity.
* Redistributions that are modified from the original source must include the
complete source code, including the source code for all components used by a
binary built from the modified sources. However, as a special exception, the
source code distributed need not include anything that is normally distributed
(in either source or binary form) with the major components (compiler, kernel,
and so on) of the operating system on which the executable runs, unless that
component itself accompanies the executable.
* Redistributions must reproduce the above copyright notice, this list of
conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
****************************************************************************/
#include "nl_factory.h"
#include "nl_setup.h"
netlist_factory_t::netlist_factory_t()
{
}
netlist_factory_t::~netlist_factory_t()
{
for (net_device_t_base_factory * const *e = m_list.first(); e != NULL; e = m_list.next(e))
{
net_device_t_base_factory *p = *e;
global_free(p);
}
m_list.clear();
}
netlist_device_t *netlist_factory_t::new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const
{
for (net_device_t_base_factory * const *e = m_list.first(); e != NULL; e = m_list.next(e))
{
net_device_t_base_factory *p = *e;
if (strcmp(p->classname(), classname) == 0)
{
netlist_device_t *ret = p->Create();
return ret;
}
p++;
}
setup.netlist().error("Class %s not found!\n", classname.cstr());
return NULL; // appease code analysis
}
netlist_device_t *netlist_factory_t::new_device_by_name(const pstring &name, netlist_setup_t &setup) const
{
net_device_t_base_factory *f = factory_by_name(name, setup);
return f->Create();
}
net_device_t_base_factory * netlist_factory_t::factory_by_name(const pstring &name, netlist_setup_t &setup) const
{
for (net_device_t_base_factory * const *e = m_list.first(); e != NULL; e = m_list.next(e))
{
net_device_t_base_factory *p = *e;
if (strcmp(p->name(), name) == 0)
{
return p;
}
p++;
}
setup.netlist().error("Class %s not found!\n", name.cstr());
return NULL; // appease code analysis
}

View File

@ -0,0 +1,95 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nl_factory.h
*
*
*/
#ifndef NLFACTORY_H_
#define NLFACTORY_H_
#include "nl_config.h"
#include "plists.h"
#include "nl_base.h"
#if 0
#include "nl_time.h"
#include "nl_util.h"
#include "pstate.h"
#endif
#include "pstring.h"
// -----------------------------------------------------------------------------
// net_dev class factory
// -----------------------------------------------------------------------------
class net_device_t_base_factory
{
NETLIST_PREVENT_COPYING(net_device_t_base_factory)
public:
ATTR_COLD net_device_t_base_factory(const pstring &name, const pstring &classname,
const pstring &def_param)
: m_name(name), m_classname(classname), m_def_param(def_param)
{}
ATTR_COLD virtual ~net_device_t_base_factory() {}
ATTR_COLD virtual netlist_device_t *Create() const = 0;
ATTR_COLD const pstring &name() const { return m_name; }
ATTR_COLD const pstring &classname() const { return m_classname; }
ATTR_COLD const pstring &param_desc() const { return m_def_param; }
ATTR_COLD const nl_util::pstring_list term_param_list();
ATTR_COLD const nl_util::pstring_list def_params();
protected:
pstring m_name; /* device name */
pstring m_classname; /* device class name */
pstring m_def_param; /* default parameter */
};
template <class C>
class net_device_t_factory : public net_device_t_base_factory
{
NETLIST_PREVENT_COPYING(net_device_t_factory)
public:
ATTR_COLD net_device_t_factory(const pstring &name, const pstring &classname,
const pstring &def_param)
: net_device_t_base_factory(name, classname, def_param) { }
ATTR_COLD netlist_device_t *Create() const
{
netlist_device_t *r = nl_alloc(C);
//r->init(setup, name);
return r;
}
};
class netlist_factory_t
{
public:
typedef plinearlist_t<net_device_t_base_factory *> list_t;
ATTR_COLD netlist_factory_t();
ATTR_COLD ~netlist_factory_t();
template<class _C>
ATTR_COLD void register_device(const pstring &name, const pstring &classname,
const pstring &def_param)
{
m_list.add(nl_alloc(net_device_t_factory< _C >, name, classname, def_param));
}
ATTR_COLD netlist_device_t *new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const;
ATTR_COLD netlist_device_t *new_device_by_name(const pstring &name, netlist_setup_t &setup) const;
ATTR_COLD net_device_t_base_factory * factory_by_name(const pstring &name, netlist_setup_t &setup) const;
const list_t &list() { return m_list; }
private:
list_t m_list;
};
#endif /* NLFACTORY_H_ */

View File

@ -41,7 +41,7 @@ netlist_setup_t::netlist_setup_t(netlist_base_t &netlist)
void netlist_setup_t::init()
{
m_factory.initialize();
nl_initialize_factory(factory());
NETLIST_NAME(base)(*this);
}
@ -390,7 +390,7 @@ nld_base_d_to_a_proxy *netlist_setup_t::get_d_a_proxy(netlist_output_t &out)
if (proxy == NULL)
{
// create a new one ...
proxy = new nld_d_to_a_proxy(out);
proxy = nl_alloc(nld_d_to_a_proxy ,out);
pstring x = pstring::sprintf("proxy_da_%s_%d", out.name().cstr(), m_proxy_cnt);
m_proxy_cnt++;
@ -419,7 +419,7 @@ void netlist_setup_t::connect_input_output(netlist_input_t &in, netlist_output_t
{
if (out.isFamily(netlist_terminal_t::ANALOG) && in.isFamily(netlist_terminal_t::LOGIC))
{
nld_a_to_d_proxy *proxy = new nld_a_to_d_proxy(in);
nld_a_to_d_proxy *proxy = nl_alloc(nld_a_to_d_proxy, in);
pstring x = pstring::sprintf("proxy_ad_%s_%d", in.name().cstr(), m_proxy_cnt);
m_proxy_cnt++;
@ -455,7 +455,7 @@ void netlist_setup_t::connect_terminal_input(netlist_terminal_t &term, netlist_i
else if (inp.isFamily(netlist_terminal_t::LOGIC))
{
NL_VERBOSE_OUT(("connect_terminal_input: connecting proxy\n"));
nld_a_to_d_proxy *proxy = new nld_a_to_d_proxy(inp);
nld_a_to_d_proxy *proxy = nl_alloc(nld_a_to_d_proxy, inp);
pstring x = pstring::sprintf("proxy_ad_%s_%d", inp.name().cstr(), m_proxy_cnt);
m_proxy_cnt++;
@ -523,7 +523,7 @@ void netlist_setup_t::connect_terminals(netlist_core_terminal_t &t1, netlist_cor
else
{
NL_VERBOSE_OUT(("adding net ...\n"));
netlist_analog_net_t *anet = new netlist_analog_net_t();
netlist_analog_net_t *anet = nl_alloc(netlist_analog_net_t);
t1.set_net(*anet);
//m_netlist.solver()->m_nets.add(anet);
// FIXME: Nets should have a unique name

View File

@ -11,6 +11,7 @@
#define NLSETUP_H_
#include "nl_base.h"
#include "nl_factory.h"
//============================================================
// MACROS / inline netlist definitions

View File

@ -28,7 +28,7 @@ public:
if (m_num_elements == 0)
m_list = NULL;
else
m_list = new _ListClass[m_num_elements];
m_list = nl_alloc_array(_ListClass, m_num_elements);
m_count = 0;
}
@ -38,7 +38,7 @@ public:
if (m_num_elements == 0)
m_list = NULL;
else
m_list = new _ListClass[m_num_elements];
m_list = nl_alloc_array(_ListClass, m_num_elements);
m_count = 0;
for (int i=0; i<rhs.count(); i++)
{
@ -60,7 +60,7 @@ public:
ATTR_COLD ~plinearlist_t()
{
if (m_list != NULL)
delete[] m_list;
nl_free_array(m_list);
m_list = NULL;
}
@ -157,18 +157,18 @@ public:
{
for (_ListClass *i = m_list; i < m_list + m_count; i++)
{
delete *i;
nl_free(*i);
}
clear();
}
private:
ATTR_HOT inline void resize(const int new_size)
ATTR_COLD void resize(const int new_size)
{
int cnt = count();
if (new_size > 0)
{
_ListClass *m_new = new _ListClass[new_size];
_ListClass *m_new = nl_alloc_array(_ListClass, new_size);
_ListClass *pd = m_new;
if (cnt > new_size)
@ -176,14 +176,14 @@ private:
for (_ListClass *ps = m_list; ps < m_list + cnt; ps++, pd++)
*pd = *ps;
if (m_list != NULL)
delete[] m_list;
nl_free_array(m_list);
m_list = m_new;
m_count = cnt;
}
else
{
if (m_list != NULL)
delete[] m_list;
nl_free_array(m_list);
m_list = NULL;
m_count = 0;
}

View File

@ -27,7 +27,7 @@ ATTR_COLD void pstate_manager_t::save_state_ptr(const pstring &stname, const pst
};
NL_VERBOSE_OUT(("SAVE: <%s> %s(%d) %p\n", fullname.cstr(), ts[dt].cstr(), size, ptr));
pstate_entry_t *p = new pstate_entry_t(stname, dt, owner, size, count, ptr, is_ptr);
pstate_entry_t *p = nl_alloc(pstate_entry_t, stname, dt, owner, size, count, ptr, is_ptr);
m_save.add(p);
}
@ -60,3 +60,11 @@ ATTR_COLD void pstate_manager_t::post_load()
if (m_save[i]->m_dt == DT_CUSTOM)
m_save[i]->m_callback->on_post_load();
}
template<> ATTR_COLD void pstate_manager_t::save_item(pstate_callback_t &state, const void *owner, const pstring &stname)
{
//save_state_ptr(stname, DT_CUSTOM, 0, 1, &state);
pstate_entry_t *p = nl_alloc(pstate_entry_t, stname, owner, &state);
m_save.add(p);
state.register_state(*this, stname);
}

View File

@ -145,13 +145,7 @@ private:
pstate_entry_t::list_t m_save;
};
template<> ATTR_COLD inline void pstate_manager_t::save_item(pstate_callback_t &state, const void *owner, const pstring &stname)
{
//save_state_ptr(stname, DT_CUSTOM, 0, 1, &state);
pstate_entry_t *p = new pstate_entry_t(stname, owner, &state);
m_save.add(p);
state.register_state(*this, stname);
}
template<> ATTR_COLD void pstate_manager_t::save_item(pstate_callback_t &state, const void *owner, const pstring &stname);
template<> ATTR_COLD inline void pstate_manager_t::save_item(netlist_time &nlt, const void *owner, const pstring &stname)
{

View File

@ -14,7 +14,6 @@
//pstring::str_t *pstring::m_zero = new(pstring::m_pool, 0) pstring::str_t(0);
pblockpool pstring::m_pool;
pstring::str_t pstring::m_zero;
/*