Merge pull request #1997 from alalek:tapi_fix_memleaks

pull/2000/merge
Andrey Pavlenko 11 years ago committed by OpenCV Buildbot
commit 59cab94fc7
  1. 2
      modules/core/include/opencv2/core/mat.inl.hpp
  2. 8
      modules/core/src/matrix.cpp
  3. 8
      modules/core/src/ocl.cpp
  4. 4
      modules/core/src/umatrix.cpp

@ -617,9 +617,9 @@ inline void Mat::release()
{ {
if( u && CV_XADD(&u->refcount, -1) == 1 ) if( u && CV_XADD(&u->refcount, -1) == 1 )
deallocate(); deallocate();
u = NULL;
data = datastart = dataend = datalimit = 0; data = datastart = dataend = datalimit = 0;
size.p[0] = 0; size.p[0] = 0;
u = 0;
} }
inline inline

@ -56,7 +56,10 @@ void MatAllocator::map(UMatData*, int) const
void MatAllocator::unmap(UMatData* u) const void MatAllocator::unmap(UMatData* u) const
{ {
if(u->urefcount == 0 && u->refcount == 0) if(u->urefcount == 0 && u->refcount == 0)
{
deallocate(u); deallocate(u);
u = NULL;
}
} }
void MatAllocator::download(UMatData* u, void* dstptr, void MatAllocator::download(UMatData* u, void* dstptr,
@ -179,7 +182,6 @@ public:
UMatData* u = new UMatData(this); UMatData* u = new UMatData(this);
u->data = u->origdata = data; u->data = u->origdata = data;
u->size = total; u->size = total;
u->refcount = data0 == 0;
if(data0) if(data0)
u->flags |= UMatData::USER_ALLOCATED; u->flags |= UMatData::USER_ALLOCATED;
@ -195,6 +197,8 @@ public:
void deallocate(UMatData* u) const void deallocate(UMatData* u) const
{ {
CV_Assert(u->urefcount >= 0);
CV_Assert(u->refcount >= 0);
if(u && u->refcount == 0) if(u && u->refcount == 0)
{ {
if( !(u->flags & UMatData::USER_ALLOCATED) ) if( !(u->flags & UMatData::USER_ALLOCATED) )
@ -392,6 +396,7 @@ void Mat::create(int d, const int* _sizes, int _type)
CV_Assert( step[dims-1] == (size_t)CV_ELEM_SIZE(flags) ); CV_Assert( step[dims-1] == (size_t)CV_ELEM_SIZE(flags) );
} }
addref();
finalizeHdr(*this); finalizeHdr(*this);
} }
@ -409,6 +414,7 @@ void Mat::deallocate()
{ {
if(u) if(u)
(u->currAllocator ? u->currAllocator : allocator ? allocator : getStdAllocator())->unmap(u); (u->currAllocator ? u->currAllocator : allocator ? allocator : getStdAllocator())->unmap(u);
u = NULL;
} }
Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange) Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange)

@ -1524,6 +1524,7 @@ struct Device::Impl
Impl(void* d) Impl(void* d)
{ {
handle = (cl_device_id)d; handle = (cl_device_id)d;
refcount = 1;
} }
template<typename _TpCL, typename _TpOut> template<typename _TpCL, typename _TpOut>
@ -2784,8 +2785,6 @@ public:
UMatData* defaultAllocate(int dims, const int* sizes, int type, void* data, size_t* step, int flags) const UMatData* defaultAllocate(int dims, const int* sizes, int type, void* data, size_t* step, int flags) const
{ {
UMatData* u = matStdAllocator->allocate(dims, sizes, type, data, step, flags); UMatData* u = matStdAllocator->allocate(dims, sizes, type, data, step, flags);
u->urefcount = 1;
u->refcount = 0;
return u; return u;
} }
@ -2827,7 +2826,6 @@ public:
u->data = 0; u->data = 0;
u->size = total; u->size = total;
u->handle = handle; u->handle = handle;
u->urefcount = 1;
u->flags = flags0; u->flags = flags0;
return u; return u;
@ -2866,7 +2864,6 @@ public:
} }
if(accessFlags & ACCESS_WRITE) if(accessFlags & ACCESS_WRITE)
u->markHostCopyObsolete(true); u->markHostCopyObsolete(true);
CV_XADD(&u->urefcount, 1);
return true; return true;
} }
@ -2905,6 +2902,9 @@ public:
if(!u) if(!u)
return; return;
CV_Assert(u->urefcount >= 0);
CV_Assert(u->refcount >= 0);
// TODO: !!! when we add Shared Virtual Memory Support, // TODO: !!! when we add Shared Virtual Memory Support,
// this function (as well as the others) should be corrected // this function (as well as the others) should be corrected
CV_Assert(u->handle != 0 && u->urefcount == 0); CV_Assert(u->handle != 0 && u->urefcount == 0);

@ -217,6 +217,7 @@ UMat Mat::getUMat(int accessFlags) const
if(!a) if(!a)
a = a0; a = a0;
temp_u = a->allocate(dims, size.p, type(), data, step.p, accessFlags); temp_u = a->allocate(dims, size.p, type(), data, step.p, accessFlags);
temp_u->refcount = 1;
} }
UMat::getStdAllocator()->allocate(temp_u, accessFlags); UMat::getStdAllocator()->allocate(temp_u, accessFlags);
hdr.flags = flags; hdr.flags = flags;
@ -224,6 +225,7 @@ UMat Mat::getUMat(int accessFlags) const
finalizeHdr(hdr); finalizeHdr(hdr);
hdr.u = temp_u; hdr.u = temp_u;
hdr.offset = data - datastart; hdr.offset = data - datastart;
hdr.addref();
return hdr; return hdr;
} }
@ -271,6 +273,7 @@ void UMat::create(int d, const int* _sizes, int _type)
} }
finalizeHdr(*this); finalizeHdr(*this);
addref();
} }
void UMat::copySize(const UMat& m) void UMat::copySize(const UMat& m)
@ -294,6 +297,7 @@ UMat::~UMat()
void UMat::deallocate() void UMat::deallocate()
{ {
u->currAllocator->deallocate(u); u->currAllocator->deallocate(u);
u = NULL;
} }

Loading…
Cancel
Save