Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 89a45357 authored by hhakim's avatar hhakim
Browse files

Complete/Correct memory management of Faust::Transform by RefManager.

- Fix missing RefManager::acquire() calls in Transform::push_back(), push_first(), constructors, operator=.
- Adjust move ctor and move operator= (resize src Transform::data to zero).
- New ctor in RefManager to allow RAII for the callback.
parent dcfee93d
No related branches found
No related tags found
No related merge requests found
...@@ -162,6 +162,12 @@ namespace Faust ...@@ -162,6 +162,12 @@ namespace Faust
faust_unsigned_int getNbRow() const; faust_unsigned_int getNbRow() const;
faust_unsigned_int getNbCol() const; faust_unsigned_int getNbCol() const;
void print_file(const char* filename) const; void print_file(const char* filename) const;
void print_data_ptrs() const
{
for(int i=0;i<data.size();i++)
cout << data[i] << " ";
cout << endl;
}
void init_from_file(const char* filename); void init_from_file(const char* filename);
/** /**
* \brief Writes the FAuST into a Matlab file. The product is written as a cell array with the matrix factors as elements. * \brief Writes the FAuST into a Matlab file. The product is written as a cell array with the matrix factors as elements.
...@@ -228,7 +234,6 @@ namespace Faust ...@@ -228,7 +234,6 @@ namespace Faust
#ifdef FAUST_VERBOSE #ifdef FAUST_VERBOSE
std::cout << "~Transform()" << std::endl; std::cout << "~Transform()" << std::endl;
#endif #endif
ref_man.set_free_cb(Faust::Transform<FPP,Cpu>::delete_fact);
for (int i=0;i<data.size();i++) for (int i=0;i<data.size();i++)
if(this->dtor_delete_data) if(this->dtor_delete_data)
delete data[i]; delete data[i];
...@@ -277,6 +282,7 @@ namespace Faust ...@@ -277,6 +282,7 @@ namespace Faust
private: private:
void disable_data_deletion() { this->dtor_delete_data = false; } void disable_data_deletion() { this->dtor_delete_data = false; }
void enable_data_deletion() { this->dtor_delete_data = true; }
private: private:
long long int totalNonZeros; long long int totalNonZeros;
......
...@@ -179,6 +179,7 @@ Faust::Transform<FPP,Cpu>::Transform(const Faust::Transform<FPP,Cpu> & A) : ...@@ -179,6 +179,7 @@ Faust::Transform<FPP,Cpu>::Transform(const Faust::Transform<FPP,Cpu> & A) :
{ {
//std::cout<<"iter "<<i<<"/"<<data.size()<<std::endl; //std::cout<<"iter "<<i<<"/"<<data.size()<<std::endl;
data[i]=A.data[i]->Clone(); data[i]=A.data[i]->Clone();
if(!dtor_delete_data) ref_man.acquire(data[i]);
} }
//std::cout<<"fin inside copy constructor"<<std::endl; //std::cout<<"fin inside copy constructor"<<std::endl;
#ifdef __COMPILE_TIMERS__ #ifdef __COMPILE_TIMERS__
...@@ -200,7 +201,6 @@ Faust::Transform<FPP,Cpu>::Transform(const std::vector<Faust::MatGeneric<FPP,Cpu ...@@ -200,7 +201,6 @@ Faust::Transform<FPP,Cpu>::Transform(const std::vector<Faust::MatGeneric<FPP,Cpu
} }
else else
data[0] = facts[0]; data[0] = facts[0];
ref_man.acquire(data[0]);
totalNonZeros += data[0]->getNonZeros(); totalNonZeros += data[0]->getNonZeros();
for (int i=1 ; i<data.size() ; i++) for (int i=1 ; i<data.size() ; i++)
{ {
...@@ -209,11 +209,13 @@ Faust::Transform<FPP,Cpu>::Transform(const std::vector<Faust::MatGeneric<FPP,Cpu ...@@ -209,11 +209,13 @@ Faust::Transform<FPP,Cpu>::Transform(const std::vector<Faust::MatGeneric<FPP,Cpu
else else
data[i] = facts[i]; data[i] = facts[i];
totalNonZeros += data[i]->getNonZeros(); totalNonZeros += data[i]->getNonZeros();
ref_man.acquire(data[i]); if(!dtor_delete_data) ref_man.acquire(data[i]);
} }
if(lambda_ != FPP(1.0)) if(lambda_ != FPP(1.0))
(*data[0]) *= lambda_; (*data[0]) *= lambda_;
if(!dtor_delete_data) ref_man.acquire(data[0]);
} }
#ifdef __COMPILE_TIMERS__ #ifdef __COMPILE_TIMERS__
...@@ -227,6 +229,8 @@ template<typename FPP> ...@@ -227,6 +229,8 @@ template<typename FPP>
Faust::Transform<FPP,Cpu>::Transform(Faust::Transform<FPP,Cpu>&& T) : totalNonZeros(T.totalNonZeros), dtor_delete_data(T.dtor_delete_data) Faust::Transform<FPP,Cpu>::Transform(Faust::Transform<FPP,Cpu>&& T) : totalNonZeros(T.totalNonZeros), dtor_delete_data(T.dtor_delete_data)
{ {
data = std::move(T.data); data = std::move(T.data);
totalNonZeros = T.totalNonZeros;
T.data.resize(0);
} }
...@@ -240,7 +244,7 @@ Faust::Transform<FPP,Cpu>::Transform(const std::vector<Faust::MatDense<FPP,Cpu> ...@@ -240,7 +244,7 @@ Faust::Transform<FPP,Cpu>::Transform(const std::vector<Faust::MatDense<FPP,Cpu>
for (int i=0 ; i<data.size() ; i++) for (int i=0 ; i<data.size() ; i++)
{ {
data[i]=facts[i].Clone(optimizedCopy); data[i]=facts[i].Clone(optimizedCopy);
ref_man.acquire(data[i]); if(!dtor_delete_data) ref_man.acquire(data[i]);
totalNonZeros += data[i]->getNonZeros(); totalNonZeros += data[i]->getNonZeros();
} }
...@@ -255,6 +259,7 @@ Faust::Transform<FPP,Cpu>::Transform(const std::vector<Faust::MatSparse<FPP,Cpu> ...@@ -255,6 +259,7 @@ Faust::Transform<FPP,Cpu>::Transform(const std::vector<Faust::MatSparse<FPP,Cpu>
{ {
data[i]=facts[i].Clone(optimizedCopy); data[i]=facts[i].Clone(optimizedCopy);
totalNonZeros += data[i]->getNonZeros(); totalNonZeros += data[i]->getNonZeros();
if(!dtor_delete_data) ref_man.acquire(data[i]);
} }
} }
...@@ -284,6 +289,7 @@ Faust::Transform<FPP,Cpu>::Transform(const Transform<FPP, Cpu>* A, const bool tr ...@@ -284,6 +289,7 @@ Faust::Transform<FPP,Cpu>::Transform(const Transform<FPP, Cpu>* A, const bool tr
} }
if(conj_A) data[j]->conjugate(); if(conj_A) data[j]->conjugate();
totalNonZeros += data[j]->getNonZeros(); totalNonZeros += data[j]->getNonZeros();
if(!dtor_delete_data) ref_man.acquire(data[j]);
j++; j++;
} }
i = transpose_B?B->size()-1:0; i = transpose_B?B->size()-1:0;
...@@ -304,6 +310,7 @@ Faust::Transform<FPP,Cpu>::Transform(const Transform<FPP, Cpu>* A, const bool tr ...@@ -304,6 +310,7 @@ Faust::Transform<FPP,Cpu>::Transform(const Transform<FPP, Cpu>* A, const bool tr
} }
if(conj_B) data[j]->conjugate(); if(conj_B) data[j]->conjugate();
totalNonZeros += data[j]->getNonZeros(); totalNonZeros += data[j]->getNonZeros();
if(!dtor_delete_data) ref_man.acquire(data[j]);
j++; j++;
} }
this->check_factors_validity(); this->check_factors_validity();
...@@ -333,7 +340,7 @@ void Faust::Transform<FPP,Cpu>::check_factors_validity() const ...@@ -333,7 +340,7 @@ void Faust::Transform<FPP,Cpu>::check_factors_validity() const
template<typename FPP> template<typename FPP>
Faust::RefManager Faust::Transform<FPP,Cpu>::ref_man; Faust::RefManager Faust::Transform<FPP,Cpu>::ref_man(Faust::Transform<FPP,Cpu>::delete_fact);
template<typename FPP> template<typename FPP>
void Faust::Transform<FPP,Cpu>::print_file(const char* filename) const void Faust::Transform<FPP,Cpu>::print_file(const char* filename) const
...@@ -603,14 +610,24 @@ double Faust::Transform<FPP,Cpu>::normFro() const ...@@ -603,14 +610,24 @@ double Faust::Transform<FPP,Cpu>::normFro() const
template<typename FPP> template<typename FPP>
void Faust::Transform<FPP,Cpu>::operator=(const Transform<FPP,Cpu>& f) void Faust::Transform<FPP,Cpu>::operator=(const Transform<FPP,Cpu>& f)
{ {
for (int i=0;i<size();i++) for (int i=0;i<size();i++)
delete data[i]; {
if(dtor_delete_data)
delete data[i];
else
{
ref_man.release(data[i]);
}
}
data.resize(0); data.resize(0);
data.resize(f.size()); data.resize(f.size());
for (int i=0;i<f.size();i++) for (int i=0;i<f.size();i++)
{
data[i]=f.data[i]->Clone(); data[i]=f.data[i]->Clone();
if(!dtor_delete_data) ref_man.acquire(data[i]);
}
this->totalNonZeros=f.totalNonZeros; this->totalNonZeros=f.totalNonZeros;
...@@ -625,6 +642,7 @@ Faust::Transform<FPP,Cpu>& Faust::Transform<FPP,Cpu>::operator=(Faust::Transform ...@@ -625,6 +642,7 @@ Faust::Transform<FPP,Cpu>& Faust::Transform<FPP,Cpu>::operator=(Faust::Transform
data = std::move(T.data); data = std::move(T.data);
totalNonZeros = T.totalNonZeros; totalNonZeros = T.totalNonZeros;
dtor_delete_data = T.dtor_delete_data; dtor_delete_data = T.dtor_delete_data;
T.data.resize(0);
} }
template<typename FPP> template<typename FPP>
...@@ -848,6 +866,7 @@ void Faust::Transform<FPP,Cpu>::push_back(const Faust::MatGeneric<FPP,Cpu>* M,co ...@@ -848,6 +866,7 @@ void Faust::Transform<FPP,Cpu>::push_back(const Faust::MatGeneric<FPP,Cpu>* M,co
Faust::MatGeneric<FPP,Cpu>* M_copy = M->Clone(optimizedCopy); Faust::MatGeneric<FPP,Cpu>* M_copy = M->Clone(optimizedCopy);
if(conjugate) M_copy->conjugate(); if(conjugate) M_copy->conjugate();
data.push_back(M_copy); data.push_back(M_copy);
if(!dtor_delete_data) ref_man.acquire(M_copy);
totalNonZeros += M_copy->getNonZeros(); totalNonZeros += M_copy->getNonZeros();
#ifdef __COMPILE_TIMERS__ #ifdef __COMPILE_TIMERS__
...@@ -868,6 +887,7 @@ void Faust::Transform<FPP,Cpu>::push_first(const Faust::MatGeneric<FPP,Cpu>* M, ...@@ -868,6 +887,7 @@ void Faust::Transform<FPP,Cpu>::push_first(const Faust::MatGeneric<FPP,Cpu>* M,
Faust::MatGeneric<FPP,Cpu>* M_copy = M->Clone(optimizedCopy); Faust::MatGeneric<FPP,Cpu>* M_copy = M->Clone(optimizedCopy);
data.insert(data.begin(),M_copy); data.insert(data.begin(),M_copy);
if(!dtor_delete_data) ref_man.acquire(M_copy);
totalNonZeros += M_copy->getNonZeros(); totalNonZeros += M_copy->getNonZeros();
#ifdef __COMPILE_TIMERS__ #ifdef __COMPILE_TIMERS__
......
...@@ -46,3 +46,12 @@ void Faust::RefManager::set_free_cb(void(*cb)(void*)) ...@@ -46,3 +46,12 @@ void Faust::RefManager::set_free_cb(void(*cb)(void*))
{ {
this->cb = cb; this->cb = cb;
} }
Faust::RefManager::RefManager()
{
}
Faust::RefManager::RefManager(void(*cb)(void*))
{
set_free_cb(cb);
}
...@@ -7,7 +7,6 @@ using namespace std; ...@@ -7,7 +7,6 @@ using namespace std;
namespace Faust { namespace Faust {
class RefManager { class RefManager {
map<void*,unsigned int> refCounts; map<void*,unsigned int> refCounts;
typedef void (RefManager::*free_cb)(void*);
void(*cb)(void*); void(*cb)(void*);
public: public:
...@@ -16,6 +15,9 @@ namespace Faust { ...@@ -16,6 +15,9 @@ namespace Faust {
void release(void* ref); void release(void* ref);
void set_free_cb(void (*cb)(void*)); void set_free_cb(void (*cb)(void*));
RefManager();
RefManager(void(*cb)(void*));
}; };
} }
#endif #endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment