mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
SmartPtr: Support detect memory leak by valgrind. v6.0.132 (#4102)
1. Support detect memory leak by valgrind. 2. Free the http handler entry. 3. Free the stack of ST. --- Co-authored-by: Jacob Su <suzp1984@gmail.com>
This commit is contained in:
parent
ea7e2c2849
commit
7ab012c60f
18 changed files with 286 additions and 69 deletions
3
trunk/3rdparty/st-srs/Makefile
vendored
3
trunk/3rdparty/st-srs/Makefile
vendored
|
@ -191,6 +191,9 @@ endif
|
|||
#
|
||||
# make EXTRA_CFLAGS=-DDEBUG_STATS
|
||||
#
|
||||
# or cache the stack and reuse it:
|
||||
# make EXTRA_CFLAGS=-DMD_CACHE_STACK
|
||||
#
|
||||
# or enable the coverage for utest:
|
||||
# make UTEST_FLAGS="-fprofile-arcs -ftest-coverage"
|
||||
#
|
||||
|
|
31
trunk/3rdparty/st-srs/stk.c
vendored
31
trunk/3rdparty/st-srs/stk.c
vendored
|
@ -57,13 +57,15 @@ __thread int _st_num_free_stacks = 0;
|
|||
__thread int _st_randomize_stacks = 0;
|
||||
|
||||
static char *_st_new_stk_segment(int size);
|
||||
static void _st_delete_stk_segment(char *vaddr, int size);
|
||||
|
||||
_st_stack_t *_st_stack_new(int stack_size)
|
||||
{
|
||||
_st_clist_t *qp;
|
||||
_st_stack_t *ts;
|
||||
int extra;
|
||||
|
||||
|
||||
#ifdef MD_CACHE_STACK
|
||||
for (qp = _st_free_stacks.next; qp != &_st_free_stacks; qp = qp->next) {
|
||||
ts = _ST_THREAD_STACK_PTR(qp);
|
||||
if (ts->stk_size >= stack_size) {
|
||||
|
@ -75,11 +77,31 @@ _st_stack_t *_st_stack_new(int stack_size)
|
|||
return ts;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
extra = _st_randomize_stacks ? _ST_PAGE_SIZE : 0;
|
||||
#ifndef MD_CACHE_STACK
|
||||
for (qp = _st_free_stacks.next; qp != &_st_free_stacks;) {
|
||||
ts = _ST_THREAD_STACK_PTR(qp);
|
||||
// Before qp is freed, move to next one, because the qp will be freed when free the ts.
|
||||
qp = qp->next;
|
||||
|
||||
ST_REMOVE_LINK(&ts->links);
|
||||
_st_num_free_stacks--;
|
||||
|
||||
#if defined(DEBUG) && !defined(MD_NO_PROTECT)
|
||||
mprotect(ts->vaddr, REDZONE, PROT_READ | PROT_WRITE);
|
||||
mprotect(ts->stk_top + extra, REDZONE, PROT_READ | PROT_WRITE);
|
||||
#endif
|
||||
|
||||
_st_delete_stk_segment(ts->vaddr, ts->vaddr_size);
|
||||
free(ts);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Make a new thread stack object. */
|
||||
if ((ts = (_st_stack_t *)calloc(1, sizeof(_st_stack_t))) == NULL)
|
||||
return NULL;
|
||||
extra = _st_randomize_stacks ? _ST_PAGE_SIZE : 0;
|
||||
ts->vaddr_size = stack_size + 2*REDZONE + extra;
|
||||
ts->vaddr = _st_new_stk_segment(ts->vaddr_size);
|
||||
if (!ts->vaddr) {
|
||||
|
@ -114,7 +136,7 @@ void _st_stack_free(_st_stack_t *ts)
|
|||
{
|
||||
if (!ts)
|
||||
return;
|
||||
|
||||
|
||||
/* Put the stack on the free list */
|
||||
ST_APPEND_LINK(&ts->links, _st_free_stacks.prev);
|
||||
_st_num_free_stacks++;
|
||||
|
@ -152,8 +174,6 @@ static char *_st_new_stk_segment(int size)
|
|||
}
|
||||
|
||||
|
||||
/* Not used */
|
||||
#if 0
|
||||
void _st_delete_stk_segment(char *vaddr, int size)
|
||||
{
|
||||
#ifdef MALLOC_STACK
|
||||
|
@ -162,7 +182,6 @@ void _st_delete_stk_segment(char *vaddr, int size)
|
|||
(void) munmap(vaddr, size);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
int st_randomize_stacks(int on)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue