Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
codyshao
TDengine
提交
c5c197f5
T
TDengine
项目概览
codyshao
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c5c197f5
编写于
4月 16, 2020
作者:
J
Jeff Tao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
remove the memory leak for timer module when it cleans up
上级
dcbf5972
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
37 addition
and
5 deletion
+37
-5
src/os/linux/src/tlinux.c
src/os/linux/src/tlinux.c
+15
-4
src/rpc/src/rpcMain.c
src/rpc/src/rpcMain.c
+1
-0
src/util/src/ttimer.c
src/util/src/ttimer.c
+21
-1
未找到文件。
src/os/linux/src/tlinux.c
浏览文件 @
c5c197f5
...
...
@@ -227,6 +227,11 @@ int taosOpenUDServerSocket(char *ip, uint16_t port) {
return
sockFd
;
}
static
void
taosDeleteTimer
(
void
*
tharg
)
{
timer_t
*
pTimer
=
tharg
;
timer_delete
(
*
pTimer
);
}
void
*
taosProcessAlarmSignal
(
void
*
tharg
)
{
// Block the signal
sigset_t
sigset
;
...
...
@@ -235,7 +240,7 @@ void *taosProcessAlarmSignal(void *tharg) {
sigprocmask
(
SIG_BLOCK
,
&
sigset
,
NULL
);
void
(
*
callback
)(
int
)
=
tharg
;
timer_t
timerId
;
static
timer_t
timerId
;
struct
sigevent
sevent
=
{
0
};
#ifdef _ALPINE
...
...
@@ -252,6 +257,8 @@ void *taosProcessAlarmSignal(void *tharg) {
tmrError
(
"Failed to create timer"
);
}
pthread_cleanup_push
(
taosDeleteTimer
,
&
timerId
);
struct
itimerspec
ts
;
ts
.
it_value
.
tv_sec
=
0
;
ts
.
it_value
.
tv_nsec
=
1000000
*
MSECONDS_PER_TICK
;
...
...
@@ -273,6 +280,8 @@ void *taosProcessAlarmSignal(void *tharg) {
callback
(
0
);
}
pthread_cleanup_pop
(
1
);
return
NULL
;
}
...
...
@@ -282,13 +291,15 @@ int taosInitTimer(void (*callback)(int), int ms) {
pthread_attr_t
tattr
;
pthread_attr_init
(
&
tattr
);
pthread_attr_setdetachstate
(
&
tattr
,
PTHREAD_CREATE_DETACHED
);
if
(
pthread_create
(
&
thread
,
&
tattr
,
taosProcessAlarmSignal
,
callback
)
!=
0
)
{
int
code
=
pthread_create
(
&
thread
,
&
tattr
,
taosProcessAlarmSignal
,
callback
);
pthread_detach
(
thread
);
pthread_attr_destroy
(
&
tattr
);
if
(
code
!=
0
)
{
tmrError
(
"failed to create timer thread"
);
return
-
1
;
}
pthread_attr_destroy
(
&
tattr
);
return
0
;
return
thread
;
}
ssize_t
tread
(
int
fd
,
void
*
buf
,
size_t
count
)
{
...
...
src/rpc/src/rpcMain.c
浏览文件 @
c5c197f5
...
...
@@ -302,6 +302,7 @@ void rpcClose(void *param) {
tfree
(
pRpc
->
connList
);
pthread_mutex_destroy
(
&
pRpc
->
mutex
);
tTrace
(
"%s RPC is closed"
,
pRpc
->
label
);
tfree
(
pRpc
);
}
...
...
src/util/src/ttimer.c
浏览文件 @
c5c197f5
...
...
@@ -84,6 +84,8 @@ static tmr_ctrl_t* tmrCtrls;
static
tmr_ctrl_t
*
unusedTmrCtrl
=
NULL
;
static
void
*
tmrQhandle
;
static
int
numOfTmrCtrl
=
0
;
//static void* tmrContext = NULL;
static
int
athread
=
0
;
int
taosTmrThreads
=
1
;
...
...
@@ -517,7 +519,7 @@ static void taosTmrModuleInit(void) {
}
tmrQhandle
=
taosInitScheduler
(
10000
,
taosTmrThreads
,
"tmr"
);
taosInitTimer
(
taosTimerLoopFunc
,
MSECONDS_PER_TICK
);
athread
=
taosInitTimer
(
taosTimerLoopFunc
,
MSECONDS_PER_TICK
);
tmrTrace
(
"timer module is initialized, number of threads: %d"
,
taosTmrThreads
);
}
...
...
@@ -558,4 +560,22 @@ void taosTmrCleanUp(void* handle) {
numOfTmrCtrl
--
;
unusedTmrCtrl
=
ctrl
;
pthread_mutex_unlock
(
&
tmrCtrlMutex
);
if
(
numOfTmrCtrl
<=
0
)
{
pthread_cancel
(
athread
);
for
(
int
i
=
0
;
i
<
tListLen
(
wheels
);
i
++
)
{
time_wheel_t
*
wheel
=
wheels
+
i
;
pthread_mutex_destroy
(
&
wheel
->
mutex
);
free
(
wheel
->
slots
);
}
pthread_mutex_destroy
(
&
tmrCtrlMutex
);
free
(
timerMap
.
slots
);
free
(
tmrCtrls
);
taosCleanUpScheduler
(
tmrQhandle
);
tmrModuleInit
=
PTHREAD_ONCE_INIT
;
tmrTrace
(
"timer module is cleaned up"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录