Skip to content

Commit

Permalink
Fix memory leak in Device
Browse files Browse the repository at this point in the history
  • Loading branch information
jmirabel committed Sep 5, 2016
1 parent 9dbf0e2 commit 59c824a
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 28 deletions.
6 changes: 3 additions & 3 deletions include/hpp/pinocchio/device-object-vector.hh
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ namespace hpp {
struct DeviceObjectVector
: public FakeContainer<CollisionObjectPtr_t,CollisionObjectConstPtr_t>
{
DeviceObjectVector(DevicePtr_t device)
DeviceObjectVector(DeviceWkPtr_t device)
: FakeContainer<CollisionObjectPtr_t,CollisionObjectConstPtr_t>(device) {}
DeviceObjectVector() {}

Expand All @@ -52,7 +52,7 @@ namespace hpp {
JointIndex jointIndex;
InOutType inOutType;

ObjectVector(DevicePtr_t device,const JointIndex i, InOutType inout)
ObjectVector(DeviceWkPtr_t device,const JointIndex i, InOutType inout)
: FakeContainer<CollisionObjectPtr_t,CollisionObjectConstPtr_t>(device)
, jointIndex(i), inOutType(inout) {}
ObjectVector() {}
Expand All @@ -78,7 +78,7 @@ namespace hpp {
struct JointVector
: public FakeContainer<JointPtr_t,JointConstPtr_t>
{
JointVector(DevicePtr_t device) : FakeContainer<JointPtr_t,JointConstPtr_t>(device) {}
JointVector(DeviceWkPtr_t device) : FakeContainer<JointPtr_t,JointConstPtr_t>(device) {}
JointVector() {}
virtual ~JointVector() {}

Expand Down
24 changes: 13 additions & 11 deletions include/hpp/pinocchio/fake-container.hh
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ namespace hpp {
virtual size_type ibegin() const { return 0; }
virtual size_type iend () const { return size(); }

DevicePtr_t devicePtr;
FakeContainer( DevicePtr_t device ) : devicePtr(device) {}
FakeContainer() : devicePtr() {}
DeviceWkPtr_t deviceWkPtr_;
FakeContainer( DeviceWkPtr_t device ) : deviceWkPtr_(device) {}
FakeContainer() : deviceWkPtr_() {}

struct iterator
{
Expand Down Expand Up @@ -76,18 +76,20 @@ namespace hpp {
bool operator!= (const const_iterator & i2){ return idx!=i2.idx; }
};

iterator begin() { assert(devicePtr); return iterator (*this,ibegin() ); }
iterator end() { assert(devicePtr); return iterator (*this,iend() ); }
iterator rbegin() { assert(devicePtr); return iterator (*this,iend()-1 ); }
iterator rend() { assert(devicePtr); return iterator (*this,ibegin()-1); }
iterator begin() { return iterator (*this,ibegin() ); }
iterator end() { return iterator (*this,iend() ); }
iterator rbegin() { return iterator (*this,iend()-1 ); }
iterator rend() { return iterator (*this,ibegin()-1); }

const_iterator begin() const { assert(devicePtr); return const_iterator(*this,ibegin() ); }
const_iterator end() const { assert(devicePtr); return const_iterator(*this,iend() ); }
const_iterator rbegin() const { assert(devicePtr); return const_iterator(*this,iend()-1 ); }
const_iterator rend() const { assert(devicePtr); return const_iterator(*this,ibegin()-1); }
const_iterator begin() const { return const_iterator(*this,ibegin() ); }
const_iterator end() const { return const_iterator(*this,iend() ); }
const_iterator rbegin() const { return const_iterator(*this,iend()-1 ); }
const_iterator rend() const { return const_iterator(*this,ibegin()-1); }

T operator[](const int idx) { return at(idx); }
Tconst operator[](const int idx) const { return at(idx); }

DevicePtr_t device () const { assert(!deviceWkPtr_.expired()); return deviceWkPtr_.lock(); }
};

} // namespace pinocchio
Expand Down
28 changes: 14 additions & 14 deletions src/device-object-vector.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,33 +31,33 @@ namespace hpp {
CollisionObjectPtr_t DeviceObjectVector::at(const size_type i)
{
selfAssert();
return CollisionObjectPtr_t (new CollisionObject(devicePtr,i));
return CollisionObjectPtr_t (new CollisionObject(device(),i));
}

CollisionObjectConstPtr_t DeviceObjectVector::at(const size_type i) const
{
selfAssert();
return CollisionObjectConstPtr_t (new CollisionObject(devicePtr,i));
return CollisionObjectConstPtr_t (new CollisionObject(device(),i));
}

size_type DeviceObjectVector::size() const
{ return devicePtr->geomModel().ngeoms; }
{ return device()->geomModel().ngeoms; }

void DeviceObjectVector::selfAssert(size_type i) const
{
assert(devicePtr);
assert(device());
assert(i<size());
}

/* --- ObjectVector --------------------------------------------------------- */
CollisionObjectPtr_t ObjectVector::at(const size_type i)
{
return CollisionObjectPtr_t(new CollisionObject(devicePtr, geometries()[i]));
return CollisionObjectPtr_t(new CollisionObject(device(), geometries()[i]));
}

CollisionObjectConstPtr_t ObjectVector::at(const size_type i) const
{
return CollisionObjectConstPtr_t(new CollisionObject(devicePtr, geometries()[i]));
return CollisionObjectConstPtr_t(new CollisionObject(device(), geometries()[i]));
}

size_type ObjectVector::size() const
Expand All @@ -67,36 +67,36 @@ namespace hpp {

void ObjectVector::selfAssert(size_type i) const
{
assert(devicePtr);
assert(int(jointIndex)<devicePtr->model().njoint);
assert(device());
assert(int(jointIndex)<device()->model().njoint);
assert(i<size());
}

const ObjectVector::GeomIndexList & ObjectVector::geometries() const
{
if(inOutType==INNER) return devicePtr->geomModel().innerObjects[jointIndex];
else return devicePtr->geomModel().outerObjects[jointIndex];
if(inOutType==INNER) return device()->geomModel().innerObjects[jointIndex];
else return device()->geomModel().outerObjects[jointIndex];
}

/* --- JointVector --------------------------------------------------------- */

/* Access to pinocchio index + 1 because pinocchio first joint is the universe. */
JointPtr_t JointVector::at(const size_type i)
{ selfAssert(i); return JointPtr_t(new Joint(devicePtr,i+1)); }
{ selfAssert(i); return JointPtr_t(new Joint(device(),i+1)); }

/* Access to pinocchio index + 1 because pinocchio first joint is the universe. */
JointConstPtr_t JointVector::at(const size_type i) const
{ selfAssert(i); return JointConstPtr_t(new Joint(devicePtr,i+1)); }
{ selfAssert(i); return JointConstPtr_t(new Joint(device(),i+1)); }

size_type JointVector::size() const
{ return devicePtr->model().njoint - 1; }
{ return device()->model().njoint - 1; }

size_type JointVector::iend() const
{ return size(); }

void JointVector::selfAssert(size_type i) const
{
assert(devicePtr);
assert(device());
assert(i>=ibegin());
assert(i<iend());
}
Expand Down

0 comments on commit 59c824a

Please sign in to comment.