core(ocl): fix deadlock in UMatDataAutoLock

UMatData locks are not mapped on real locks (they are mapped to some "pre-initialized" pool).

Concurrent execution of these statements may lead to deadlock:
- a.copyTo(b) from thread 1
- c.copyTo(d) from thread 2
where:
- 'a' and 'd' are mapped to single lock "A".
- 'b' and 'c' are mapped to single lock "B".

Workaround is to process locks with strict order.
This commit is contained in:
Alexander Alekhin
2018-01-16 17:33:06 +03:00
parent ab8cf31ae9
commit cec700525c
5 changed files with 78 additions and 15 deletions
@@ -545,14 +545,6 @@ struct CV_EXPORTS UMatData
};
struct CV_EXPORTS UMatDataAutoLock
{
explicit UMatDataAutoLock(UMatData* u);
~UMatDataAutoLock();
UMatData* u;
};
struct CV_EXPORTS MatSize
{
explicit MatSize(int* _p);
@@ -3911,9 +3911,6 @@ inline void UMatData::markDeviceCopyObsolete(bool flag)
flags &= ~DEVICE_COPY_OBSOLETE;
}
inline UMatDataAutoLock::UMatDataAutoLock(UMatData* _u) : u(_u) { u->lock(); }
inline UMatDataAutoLock::~UMatDataAutoLock() { u->unlock(); }
//! @endcond
} //cv