mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 14:02:32 +01:00
2779f0aad1
Before this fix, the server could crash during shutdown, due to race conditions, that occured when killing the server. In particular, the performance schema instrumentation handle, PSI_server, and the performance schema itself would be cleaned up too soon, causing race conditions with a running kill server thread. The specifics of the race condition found are that: the main thread executing "PSI_server= NULL" can cause crashes in other threads still running, which are executing "if (PSI_server != NULL) PSI_server->xxx()" as part of the performance schema instrumentation. While the bug was reported for the kill server thread, in theory the same crash could happen with the signal thread, as found by code analysis. The correct fix would be to only shutdown the performance schema and set PSI_server to NULL after every other thread is guaranteed to be completed, including the kill_server_thread. However, due to the existing mysqld server design, this is not the case. See in particular bug number 56666. The work around used to fix this race condition is to simply not perform the call to shutdown_performance_schema() when the server exits, and to keep the PSI_server pointer unchanged. This will cause memory leaks to be reported by tools like valgrind, but no memory leak actually happen because the process is about to exit(). As a result, the file mysql-test/valgrind.supp has been updated to filter out these false positive messages. This code has been tested with running in a loop the following tests in parallel, which have been known to fail with race conditions in the past: - rpl_change_master - binlog_max_extension - events_restart - rpl_heartbeat_basic and no crash of test failure has been seen with the changed code.
772 lines
13 KiB
Text
772 lines
13 KiB
Text
# Suppress some common (not fatal) errors in system libraries found by valgrind
|
|
#
|
|
|
|
#
|
|
# Pthread doesn't free all thread specific memory before program exists
|
|
#
|
|
{
|
|
pthread allocate_tls memory loss
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:_dl_allocate_tls
|
|
fun:allocate_stack
|
|
fun:pthread_create*
|
|
}
|
|
|
|
{
|
|
pthread allocate_tls memory loss
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:_dl_allocate_tls
|
|
fun:pthread_create*
|
|
|
|
}
|
|
|
|
{
|
|
pthead_exit memory loss 1
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:_dl_new_object
|
|
fun:_dl_map_object_from_fd
|
|
}
|
|
|
|
{
|
|
pthread_exit memory loss 2
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:_dl_map_object
|
|
fun:dl_open_worker
|
|
}
|
|
|
|
{
|
|
pthread_exit memory loss 3
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:_dl_map_object_deps
|
|
fun:dl_open_worker
|
|
}
|
|
|
|
{
|
|
pthread_exit memory loss 4
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:_dl_check_map_versions
|
|
fun:dl_open_worker
|
|
}
|
|
|
|
{
|
|
pthread_exit memory loss 5
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:_dl_new_object
|
|
fun:_dl_map_object_from_fd
|
|
}
|
|
|
|
{
|
|
pthread allocate_dtv memory loss
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:allocate_dtv
|
|
fun:_dl_allocate_tls_storage
|
|
fun:__GI__dl_allocate_tls
|
|
fun:pthread_create
|
|
}
|
|
|
|
{
|
|
pthread allocate_dtv memory loss second
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:allocate_dtv
|
|
fun:_dl_allocate_tls
|
|
fun:pthread_create*
|
|
}
|
|
|
|
{
|
|
pthread memalign memory loss
|
|
Memcheck:Leak
|
|
fun:memalign
|
|
fun:_dl_allocate_tls_storage
|
|
fun:__GI__dl_allocate_tls
|
|
fun:pthread_create
|
|
}
|
|
|
|
{
|
|
pthread pthread_key_create
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:*
|
|
fun:*
|
|
fun:pthread_key_create
|
|
fun:my_thread_global_init
|
|
}
|
|
|
|
{
|
|
pthread strstr uninit
|
|
Memcheck:Cond
|
|
fun:strstr
|
|
obj:/lib/tls/libpthread.so.*
|
|
obj:/lib/tls/libpthread.so.*
|
|
fun:call_init
|
|
fun:_dl_init
|
|
obj:/lib/ld-*.so
|
|
}
|
|
|
|
{
|
|
pthread strstr uninit
|
|
Memcheck:Cond
|
|
fun:strstr
|
|
obj:/lib/tls/libpthread.so.*
|
|
obj:/lib/tls/libpthread.so.*
|
|
fun:call_init
|
|
fun:_dl_init
|
|
obj:/lib/ld-*.so
|
|
}
|
|
|
|
{
|
|
strlen/_dl_init_paths/dl_main/_dl_sysdep_start(Cond)
|
|
Memcheck:Cond
|
|
fun:strlen
|
|
fun:_dl_init_paths
|
|
fun:dl_main
|
|
fun:_dl_sysdep_start
|
|
}
|
|
|
|
{
|
|
pthread errno
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:_dlerror_run
|
|
fun:dlsym
|
|
fun:__errno_location
|
|
}
|
|
|
|
|
|
#
|
|
# Warnings in libz becasue it works with aligned memory(?)
|
|
#
|
|
|
|
{
|
|
libz tr_flush_block
|
|
Memcheck:Cond
|
|
fun:_tr_flush_block
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:do_flush
|
|
fun:gzclose
|
|
}
|
|
|
|
{
|
|
libz tr_flush_block2
|
|
Memcheck:Cond
|
|
fun:_tr_flush_block
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:compress2
|
|
}
|
|
|
|
{
|
|
libz longest_match
|
|
Memcheck:Cond
|
|
fun:longest_match
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:do_flush
|
|
}
|
|
|
|
{
|
|
libz longest_match called from btr_store_big_rec_extern_fields
|
|
Memcheck:Cond
|
|
fun:longest_match
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:btr_store_big_rec_extern_fields
|
|
}
|
|
|
|
{
|
|
libz longest_match called from page_zip_compress
|
|
Memcheck:Cond
|
|
fun:longest_match
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:page_zip_compress
|
|
}
|
|
|
|
{
|
|
libz longest_match2
|
|
Memcheck:Cond
|
|
fun:longest_match
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:compress2
|
|
}
|
|
|
|
{
|
|
libz longest_match 3
|
|
Memcheck:Cond
|
|
fun:longest_match
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:gzclose
|
|
}
|
|
|
|
{
|
|
libz longest_match 4
|
|
Memcheck:Cond
|
|
fun:longest_match
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:gzflush
|
|
}
|
|
|
|
{
|
|
libz longest_match3
|
|
Memcheck:Cond
|
|
fun:longest_match
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:azflush
|
|
}
|
|
|
|
{
|
|
libz longest_match3
|
|
Memcheck:Cond
|
|
fun:longest_match
|
|
fun:deflate_slow
|
|
fun:deflate
|
|
fun:azclose
|
|
}
|
|
|
|
{
|
|
libz deflate
|
|
Memcheck:Cond
|
|
obj:*/libz.so.*
|
|
obj:*/libz.so.*
|
|
fun:deflate
|
|
fun:compress2
|
|
}
|
|
|
|
{
|
|
libz deflate2
|
|
Memcheck:Cond
|
|
obj:*/libz.so.*
|
|
obj:*/libz.so.*
|
|
fun:deflate
|
|
obj:*/libz.so.*
|
|
fun:gzflush
|
|
}
|
|
|
|
{
|
|
libz deflate3
|
|
Memcheck:Cond
|
|
obj:*/libz.so.*
|
|
obj:*/libz.so.*
|
|
fun:deflate
|
|
fun:do_flush
|
|
}
|
|
|
|
#
|
|
# Warning from my_thread_init becasue mysqld dies before kill thread exists
|
|
#
|
|
|
|
{
|
|
my_thread_init kill thread memory loss second
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:my_thread_init
|
|
fun:kill_server_thread
|
|
}
|
|
|
|
|
|
# Red Hat AS 4 32 bit
|
|
{
|
|
dl_relocate_object
|
|
Memcheck:Cond
|
|
fun:_dl_relocate_object
|
|
}
|
|
|
|
#
|
|
# Warning from my_thread_init becasue mysqld dies before kill thread exists
|
|
#
|
|
|
|
{
|
|
my_thread_init kill thread memory loss second
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:my_thread_init
|
|
fun:kill_server_thread
|
|
}
|
|
|
|
#
|
|
# Leaks reported in _dl_* internal functions on Linux amd64 / glibc2.3.2.
|
|
#
|
|
|
|
{
|
|
_dl_start invalid write8
|
|
Memcheck:Addr8
|
|
fun:_dl_start
|
|
}
|
|
|
|
{
|
|
_dl_start invalid write4
|
|
Memcheck:Addr4
|
|
fun:_dl_start
|
|
}
|
|
|
|
{
|
|
_dl_start/_dl_setup_hash invalid read8
|
|
Memcheck:Addr8
|
|
fun:_dl_setup_hash
|
|
fun:_dl_start
|
|
}
|
|
|
|
{
|
|
_dl_sysdep_start invalid write8
|
|
Memcheck:Addr8
|
|
fun:_dl_sysdep_start
|
|
}
|
|
|
|
{
|
|
_dl_init invalid write8
|
|
Memcheck:Addr8
|
|
fun:_dl_init
|
|
}
|
|
|
|
{
|
|
_dl_init invalid write4
|
|
Memcheck:Addr4
|
|
fun:_dl_init
|
|
}
|
|
|
|
{
|
|
_dl_init/_dl_init invalid read8
|
|
Memcheck:Addr8
|
|
fun:_dl_debug_initialize
|
|
fun:_dl_init
|
|
}
|
|
|
|
{
|
|
_dl_init/_dl_debug_state invalid read8
|
|
Memcheck:Addr8
|
|
fun:_dl_debug_state
|
|
fun:_dl_init
|
|
}
|
|
|
|
{
|
|
init invalid write8
|
|
Memcheck:Addr8
|
|
fun:init
|
|
}
|
|
|
|
{
|
|
fixup invalid write8
|
|
Memcheck:Addr8
|
|
fun:fixup
|
|
}
|
|
|
|
{
|
|
fixup/_dl_lookup_versioned_symbol invalid read8
|
|
Memcheck:Addr8
|
|
fun:_dl_lookup_versioned_symbol
|
|
fun:fixup
|
|
}
|
|
|
|
{
|
|
_dl_runtime_resolve invalid read8
|
|
Memcheck:Addr8
|
|
fun:_dl_runtime_resolve
|
|
}
|
|
|
|
{
|
|
__libc_start_main invalid write8
|
|
Memcheck:Addr8
|
|
fun:__libc_start_main
|
|
}
|
|
|
|
{
|
|
__libc_start_main/__sigjmp_save invalid write4
|
|
Memcheck:Addr4
|
|
fun:__sigjmp_save
|
|
fun:__libc_start_main
|
|
}
|
|
|
|
#
|
|
# These seem to be libc threading stuff, not related to MySQL code (allocations
|
|
# during pthread_exit()). Googling shows other projects also using these
|
|
# suppressions.
|
|
#
|
|
# Note that these all stem from pthread_exit() deeper in the call stack, but
|
|
# Valgrind only allows the top four calls in the suppressions.
|
|
#
|
|
|
|
{
|
|
libc pthread_exit 1
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:_dl_new_object
|
|
fun:_dl_map_object_from_fd
|
|
fun:_dl_map_object
|
|
}
|
|
|
|
{
|
|
libc pthread_exit 2
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:_dl_map_object
|
|
fun:dl_open_worker
|
|
fun:_dl_catch_error
|
|
}
|
|
|
|
{
|
|
libc pthread_exit 3
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:_dl_map_object_deps
|
|
fun:dl_open_worker
|
|
fun:_dl_catch_error
|
|
}
|
|
|
|
{
|
|
libc pthread_exit 4
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:_dl_check_map_versions
|
|
fun:dl_open_worker
|
|
fun:_dl_catch_error
|
|
}
|
|
|
|
{
|
|
libc pthread_exit 5
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
fun:_dl_new_object
|
|
fun:_dl_map_object_from_fd
|
|
fun:_dl_map_object
|
|
}
|
|
|
|
{
|
|
libc pthread_exit 6
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:_dl_map_object
|
|
fun:openaux
|
|
fun:_dl_catch_error
|
|
}
|
|
|
|
{
|
|
libc pthread_exit 7
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:dl_open_worker
|
|
fun:_dl_catch_error
|
|
fun:_dl_open
|
|
}
|
|
|
|
{
|
|
libc pthread_exit 8
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:local_strdup
|
|
fun:_dl_map_object
|
|
fun:dl_open_worker
|
|
}
|
|
|
|
#
|
|
# This is seen internally in the system libraries on 64-bit RHAS3.
|
|
#
|
|
|
|
{
|
|
__lll_mutex_unlock_wake uninitialized
|
|
Memcheck:Param
|
|
futex(utime)
|
|
fun:__lll_mutex_unlock_wake
|
|
}
|
|
|
|
#
|
|
# BUG#19940: NDB sends uninitialized parts of field buffers across the wire.
|
|
# This is "works as designed"; the uninitialized part is not used at the
|
|
# other end (but Valgrind cannot see this).
|
|
#
|
|
{
|
|
bug19940
|
|
Memcheck:Param
|
|
socketcall.sendto(msg)
|
|
fun:send
|
|
fun:_ZN15TCP_Transporter6doSendEv
|
|
fun:_ZN19TransporterRegistry11performSendEv
|
|
fun:_ZN19TransporterRegistry14forceSendCheckEi
|
|
}
|
|
# Warning when printing stack trace (to suppress some not needed warnings)
|
|
#
|
|
|
|
{
|
|
vprintf on stacktrace
|
|
Memcheck:Cond
|
|
fun:vfprintf
|
|
fun:uffered_vfprintf
|
|
fun:vfprintf
|
|
fun:fprintf
|
|
fun:print_stacktrace
|
|
}
|
|
|
|
#
|
|
# Safe warnings, that may happen because of thread scheduling
|
|
#
|
|
|
|
{
|
|
dbug initialization by kill_server
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:DbugMalloc
|
|
fun:code_state
|
|
fun:_db_enter_
|
|
fun:kill_server
|
|
}
|
|
|
|
#
|
|
# Warning caused by small memory leak in threaded dlopen
|
|
#
|
|
|
|
{
|
|
dlopen threaded memory leak
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
obj:*/libdl-*.so
|
|
fun:dlopen*
|
|
}
|
|
|
|
#
|
|
# BUG#45630
|
|
# Suppress valgrind failures within nptl_pthread_exit_hack_handler on Ubuntu 9.04, x86 (but not amd64)
|
|
#
|
|
|
|
{
|
|
Mem loss within nptl_pthread_exit_hack_handler 1
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
obj:*/ld-*.so
|
|
fun:__libc_dlopen_mode
|
|
fun:pthread_cancel_init
|
|
fun:_Unwind_ForcedUnwind
|
|
fun:__pthread_unwind
|
|
fun:pthread_exit
|
|
fun:nptl_pthread_exit_hack_handler
|
|
fun:start_thread
|
|
fun:clone
|
|
}
|
|
|
|
{
|
|
Mem loss within nptl_pthread_exit_hack_handler 2
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
obj:*/ld-*.so
|
|
fun:__libc_dlopen_mode
|
|
fun:pthread_cancel_init
|
|
fun:_Unwind_ForcedUnwind
|
|
fun:__pthread_unwind
|
|
fun:pthread_exit
|
|
fun:nptl_pthread_exit_hack_handler
|
|
fun:start_thread
|
|
fun:clone
|
|
}
|
|
|
|
{
|
|
Mem loss within nptl_pthread_exit_hack_handler 3
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
obj:*/ld-*.so
|
|
fun:__libc_dlopen_mode
|
|
fun:pthread_cancel_init
|
|
fun:_Unwind_ForcedUnwind
|
|
fun:__pthread_unwind
|
|
fun:pthread_exit
|
|
fun:nptl_pthread_exit_hack_handler
|
|
fun:start_thread
|
|
fun:clone
|
|
}
|
|
|
|
{
|
|
Mem loss within nptl_pthread_exit_hack_handler 4
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
obj:*/ld-*.so
|
|
fun:__libc_dlopen_mode
|
|
fun:pthread_cancel_init
|
|
fun:_Unwind_ForcedUnwind
|
|
fun:__pthread_unwind
|
|
fun:pthread_exit
|
|
fun:nptl_pthread_exit_hack_handler
|
|
fun:start_thread
|
|
}
|
|
|
|
{
|
|
Mem loss within nptl_pthread_exit_hack_handler 5
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
obj:*/ld-*.so
|
|
fun:__libc_dlopen_mode
|
|
fun:pthread_cancel_init
|
|
fun:_Unwind_ForcedUnwind
|
|
fun:__pthread_unwind
|
|
fun:pthread_exit
|
|
fun:nptl_pthread_exit_hack_handler
|
|
fun:start_thread
|
|
}
|
|
|
|
# suppressions for glibc 2.6.1 64 bit
|
|
|
|
{
|
|
Mem loss within nptl_pthread_exit_hack_handler 6
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
fun:__libc_dlopen_mode
|
|
fun:pthread_cancel_init
|
|
fun:_Unwind_ForcedUnwind
|
|
fun:__pthread_unwind
|
|
fun:pthread_exit
|
|
fun:nptl_pthread_exit_hack_handler
|
|
}
|
|
|
|
{
|
|
Mem loss within nptl_pthread_exit_hack_handler 7
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
fun:__libc_dlopen_mode
|
|
fun:pthread_cancel_init
|
|
fun:_Unwind_ForcedUnwind
|
|
fun:__pthread_unwind
|
|
fun:pthread_exit
|
|
fun:nptl_pthread_exit_hack_handler
|
|
fun:start_thread
|
|
fun:clone
|
|
}
|
|
|
|
{
|
|
Mem loss within nptl_pthread_exit_hack_handler 8
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
fun:__libc_dlopen_mode
|
|
fun:pthread_cancel_init
|
|
fun:_Unwind_ForcedUnwind
|
|
fun:__pthread_unwind
|
|
fun:pthread_exit
|
|
fun:nptl_pthread_exit_hack_handler
|
|
fun:start_thread
|
|
fun:clone
|
|
}
|
|
|
|
{
|
|
Mem loss within nptl_pthread_exit_hack_handler 8
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
obj:*/ld-*.so
|
|
obj:*/libc-*.so
|
|
fun:__libc_dlopen_mode
|
|
fun:pthread_cancel_init
|
|
fun:_Unwind_ForcedUnwind
|
|
fun:__pthread_unwind
|
|
fun:pthread_exit
|
|
fun:nptl_pthread_exit_hack_handler
|
|
}
|
|
|
|
#
|
|
# Pthread doesn't free all thread specific memory before program exists
|
|
#
|
|
{
|
|
pthread allocate_tls memory loss in 2.6.1.
|
|
Memcheck:Leak
|
|
fun:calloc
|
|
obj:*/ld-*.so
|
|
fun:_dl_allocate_tls
|
|
fun:pthread_create*
|
|
}
|
|
|
|
{
|
|
buf_buddy_relocate peeking (space,page) in potentially free blocks
|
|
Memcheck:Addr1
|
|
fun:buf_buddy_relocate
|
|
}
|
|
|
|
#
|
|
# See related Bug#56666
|
|
# Race condition between the server main thread and the kill server thread.
|
|
#
|
|
# Because of this race condition, the call to shutdown_performance_schema()
|
|
# was commented in sql/mysqld.cc, causing the reported leaks.
|
|
#
|
|
|
|
{
|
|
missing shutdown_performance_schema 1
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:_Z10pfs_mallocmi
|
|
}
|
|
|
|
{
|
|
missing shutdown_performance_schema 2
|
|
Memcheck:Leak
|
|
fun:malloc
|
|
fun:my_malloc
|
|
fun:_lf_alloc_new
|
|
fun:lf_hash_insert
|
|
}
|
|
|