Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
0def2dbb
O
Opencv
项目概览
Greenplum
/
Opencv
大约 1 年 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0def2dbb
编写于
1月 18, 2018
作者:
A
Alexander Alekhin
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #10605 from alalek:ocl_fix_deadlock
上级
1b0ff575
cec70052
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
78 addition
and
15 deletion
+78
-15
modules/core/include/opencv2/core/mat.hpp
modules/core/include/opencv2/core/mat.hpp
+0
-8
modules/core/include/opencv2/core/mat.inl.hpp
modules/core/include/opencv2/core/mat.inl.hpp
+0
-3
modules/core/src/ocl.cpp
modules/core/src/ocl.cpp
+3
-2
modules/core/src/umatrix.cpp
modules/core/src/umatrix.cpp
+55
-2
modules/core/src/umatrix.hpp
modules/core/src/umatrix.hpp
+20
-0
未找到文件。
modules/core/include/opencv2/core/mat.hpp
浏览文件 @
0def2dbb
...
...
@@ -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
);
...
...
modules/core/include/opencv2/core/mat.inl.hpp
浏览文件 @
0def2dbb
...
...
@@ -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
...
...
modules/core/src/ocl.cpp
浏览文件 @
0def2dbb
...
...
@@ -123,6 +123,8 @@
#include "opencv2/core/opencl/opencl_svm.hpp"
#endif
#include "umatrix.hpp"
namespace
cv
{
namespace
ocl
{
#define IMPLEMENT_REFCOUNTABLE() \
...
...
@@ -5424,8 +5426,7 @@ public:
srcrawofs
,
new_srcofs
,
new_srcstep
,
dstrawofs
,
new_dstofs
,
new_dststep
);
UMatDataAutoLock
src_autolock
(
src
);
UMatDataAutoLock
dst_autolock
(
dst
);
UMatDataAutoLock
src_autolock
(
src
,
dst
);
if
(
!
src
->
handle
||
(
src
->
data
&&
src
->
hostCopyObsolete
()
<
src
->
deviceCopyObsolete
())
)
{
...
...
modules/core/src/umatrix.cpp
浏览文件 @
0def2dbb
...
...
@@ -41,6 +41,7 @@
#include "precomp.hpp"
#include "opencl_kernels_core.hpp"
#include "umatrix.hpp"
///////////////////////////////// UMat implementation ///////////////////////////////
...
...
@@ -127,14 +128,66 @@ UMatData::~UMatData()
}
}
static
size_t
getUMatDataLockIndex
(
const
UMatData
*
u
)
{
size_t
idx
=
((
size_t
)(
void
*
)
u
)
%
UMAT_NLOCKS
;
return
idx
;
}
void
UMatData
::
lock
()
{
umatLocks
[(
size_t
)(
void
*
)
this
%
UMAT_NLOCKS
].
lock
();
size_t
idx
=
getUMatDataLockIndex
(
this
);
//printf("%d lock(%d)\n", cv::utils::getThreadID(), (int)idx);
umatLocks
[
idx
].
lock
();
}
void
UMatData
::
unlock
()
{
umatLocks
[(
size_t
)(
void
*
)
this
%
UMAT_NLOCKS
].
unlock
();
size_t
idx
=
getUMatDataLockIndex
(
this
);
//printf("%d unlock(%d)\n", cv::utils::getThreadID(), (int)idx);
umatLocks
[
idx
].
unlock
();
}
struct
UMatDataAutoLockUsage
{
int
count
;
UMatDataAutoLockUsage
()
:
count
(
0
)
{
}
};
static
TLSData
<
UMatDataAutoLockUsage
>&
getUMatDataAutoLockUsageTLS
()
{
CV_SINGLETON_LAZY_INIT_REF
(
TLSData
<
UMatDataAutoLockUsage
>
,
new
TLSData
<
UMatDataAutoLockUsage
>
());
}
static
int
&
getUMatDataAutoLockUsage
()
{
return
getUMatDataAutoLockUsageTLS
().
get
()
->
count
;
}
UMatDataAutoLock
::
UMatDataAutoLock
(
UMatData
*
u
)
:
u1
(
u
),
u2
(
NULL
)
{
int
&
usage_count
=
getUMatDataAutoLockUsage
();
CV_Assert
(
usage_count
==
0
);
// UMatDataAutoLock can't be used multiple times from the same thread
usage_count
=
1
;
u1
->
lock
();
}
UMatDataAutoLock
::
UMatDataAutoLock
(
UMatData
*
u1_
,
UMatData
*
u2_
)
:
u1
(
u1_
),
u2
(
u2_
)
{
int
&
usage_count
=
getUMatDataAutoLockUsage
();
CV_Assert
(
usage_count
==
0
);
// UMatDataAutoLock can't be used multiple times from the same thread
usage_count
=
1
;
if
(
getUMatDataLockIndex
(
u1
)
>
getUMatDataLockIndex
(
u2
))
{
std
::
swap
(
u1
,
u2
);
}
u1
->
lock
();
u2
->
lock
();
}
UMatDataAutoLock
::~
UMatDataAutoLock
()
{
int
&
usage_count
=
getUMatDataAutoLockUsage
();
CV_Assert
(
usage_count
==
1
);
usage_count
=
0
;
u1
->
unlock
();
if
(
u2
)
u2
->
unlock
();
}
...
...
modules/core/src/umatrix.hpp
0 → 100644
浏览文件 @
0def2dbb
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.
#ifndef OPENCV_CORE_SRC_UMATRIX_HPP
#define OPENCV_CORE_SRC_UMATRIX_HPP
namespace
cv
{
struct
CV_EXPORTS
UMatDataAutoLock
{
explicit
UMatDataAutoLock
(
UMatData
*
u
);
UMatDataAutoLock
(
UMatData
*
u1
,
UMatData
*
u2
);
~
UMatDataAutoLock
();
UMatData
*
u1
;
UMatData
*
u2
;
};
}
#endif // OPENCV_CORE_SRC_UMATRIX_HPP
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录