Copy disabled (too large)
Download .txt
Showing preview only (19,721K chars total). Download the full file to get everything.
Repository: balloonwj/mybooksources
Branch: master
Commit: 5bf02a748de2
Files: 1918
Total size: 18.4 MB
Directory structure:
gitextract_gn_xoge9/
├── .gitignore
├── Chapter01/
│ └── codes/
│ ├── TestRAII1/
│ │ ├── ReadMe.txt
│ │ ├── TestRAII1.cpp
│ │ ├── TestRAII1.sln
│ │ ├── TestRAII1.vcxproj
│ │ ├── TestRAII1.vcxproj.filters
│ │ ├── TestRAII2.cpp
│ │ ├── TestRAII3.cpp
│ │ ├── TestRAII4.cpp
│ │ ├── stdafx.cpp
│ │ ├── stdafx.h
│ │ └── targetver.h
│ ├── construct_complex_objects.cpp
│ ├── test_auto_ptr.cpp
│ ├── test_custom_foreach_loop.cpp
│ ├── test_initializer_list.cpp
│ ├── test_map_insert_or_assign.cpp
│ ├── test_map_try_emplace.cpp
│ ├── test_map_try_emplace_with_directobject.cpp
│ ├── test_map_try_emplace_with_smartpointer.cpp
│ ├── test_map_try_emplace_with_smartpointer2.cpp
│ ├── test_shared_ptr_use_count.cpp
│ ├── test_std_enable_shared_from_this.cpp
│ ├── test_std_enable_shared_from_this_problem.cpp
│ ├── test_unique_ptr.cpp
│ ├── test_unique_ptr_deletor.cpp
│ ├── test_unique_ptr_with_array.cpp
│ └── test_weak_ptr.cpp
├── Chapter02/
│ ├── VisualGDB 下载与安装.md
│ ├── cgdb下载与安装.md
│ ├── codes/
│ │ └── main.cpp
│ └── redis-6.0.3/
│ ├── .github/
│ │ └── workflows/
│ │ ├── ci.yml
│ │ └── daily.yml
│ ├── .gitignore
│ ├── 00-RELEASENOTES
│ ├── BUGS
│ ├── CONTRIBUTING
│ ├── COPYING
│ ├── INSTALL
│ ├── MANIFESTO
│ ├── Makefile
│ ├── README.md
│ ├── TLS.md
│ ├── deps/
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── hiredis/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── CHANGELOG.md
│ │ │ ├── CMakeLists.txt
│ │ │ ├── COPYING
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── adapters/
│ │ │ │ ├── ae.h
│ │ │ │ ├── glib.h
│ │ │ │ ├── ivykis.h
│ │ │ │ ├── libev.h
│ │ │ │ ├── libevent.h
│ │ │ │ ├── libuv.h
│ │ │ │ ├── macosx.h
│ │ │ │ └── qt.h
│ │ │ ├── appveyor.yml
│ │ │ ├── async.c
│ │ │ ├── async.h
│ │ │ ├── async_private.h
│ │ │ ├── dict.c
│ │ │ ├── dict.h
│ │ │ ├── examples/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── example-ae.c
│ │ │ │ ├── example-glib.c
│ │ │ │ ├── example-ivykis.c
│ │ │ │ ├── example-libev.c
│ │ │ │ ├── example-libevent-ssl.c
│ │ │ │ ├── example-libevent.c
│ │ │ │ ├── example-libuv.c
│ │ │ │ ├── example-macosx.c
│ │ │ │ ├── example-qt.cpp
│ │ │ │ ├── example-qt.h
│ │ │ │ ├── example-ssl.c
│ │ │ │ └── example.c
│ │ │ ├── fmacros.h
│ │ │ ├── hiredis.c
│ │ │ ├── hiredis.h
│ │ │ ├── hiredis.pc.in
│ │ │ ├── hiredis_ssl.h
│ │ │ ├── hiredis_ssl.pc.in
│ │ │ ├── net.c
│ │ │ ├── net.h
│ │ │ ├── read.c
│ │ │ ├── read.h
│ │ │ ├── sds.c
│ │ │ ├── sds.h
│ │ │ ├── sdsalloc.h
│ │ │ ├── sockcompat.c
│ │ │ ├── sockcompat.h
│ │ │ ├── ssl.c
│ │ │ ├── test.c
│ │ │ ├── test.sh
│ │ │ └── win32.h
│ │ ├── jemalloc/
│ │ │ ├── .appveyor.yml
│ │ │ ├── .autom4te.cfg
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── COPYING
│ │ │ ├── ChangeLog
│ │ │ ├── INSTALL.md
│ │ │ ├── Makefile.in
│ │ │ ├── README
│ │ │ ├── TUNING.md
│ │ │ ├── autogen.sh
│ │ │ ├── bin/
│ │ │ │ ├── jemalloc-config.in
│ │ │ │ ├── jemalloc.sh.in
│ │ │ │ └── jeprof.in
│ │ │ ├── build-aux/
│ │ │ │ ├── config.guess
│ │ │ │ ├── config.sub
│ │ │ │ └── install-sh
│ │ │ ├── config.stamp.in
│ │ │ ├── configure.ac
│ │ │ ├── doc/
│ │ │ │ ├── html.xsl.in
│ │ │ │ ├── jemalloc.xml.in
│ │ │ │ ├── manpages.xsl.in
│ │ │ │ └── stylesheet.xsl
│ │ │ ├── include/
│ │ │ │ ├── jemalloc/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ ├── arena_externs.h
│ │ │ │ │ │ ├── arena_inlines_a.h
│ │ │ │ │ │ ├── arena_inlines_b.h
│ │ │ │ │ │ ├── arena_stats.h
│ │ │ │ │ │ ├── arena_structs_a.h
│ │ │ │ │ │ ├── arena_structs_b.h
│ │ │ │ │ │ ├── arena_types.h
│ │ │ │ │ │ ├── assert.h
│ │ │ │ │ │ ├── atomic.h
│ │ │ │ │ │ ├── atomic_c11.h
│ │ │ │ │ │ ├── atomic_gcc_atomic.h
│ │ │ │ │ │ ├── atomic_gcc_sync.h
│ │ │ │ │ │ ├── atomic_msvc.h
│ │ │ │ │ │ ├── background_thread_externs.h
│ │ │ │ │ │ ├── background_thread_inlines.h
│ │ │ │ │ │ ├── background_thread_structs.h
│ │ │ │ │ │ ├── base_externs.h
│ │ │ │ │ │ ├── base_inlines.h
│ │ │ │ │ │ ├── base_structs.h
│ │ │ │ │ │ ├── base_types.h
│ │ │ │ │ │ ├── bin.h
│ │ │ │ │ │ ├── bin_stats.h
│ │ │ │ │ │ ├── bit_util.h
│ │ │ │ │ │ ├── bitmap.h
│ │ │ │ │ │ ├── cache_bin.h
│ │ │ │ │ │ ├── ckh.h
│ │ │ │ │ │ ├── ctl.h
│ │ │ │ │ │ ├── div.h
│ │ │ │ │ │ ├── emitter.h
│ │ │ │ │ │ ├── extent_dss.h
│ │ │ │ │ │ ├── extent_externs.h
│ │ │ │ │ │ ├── extent_inlines.h
│ │ │ │ │ │ ├── extent_mmap.h
│ │ │ │ │ │ ├── extent_structs.h
│ │ │ │ │ │ ├── extent_types.h
│ │ │ │ │ │ ├── hash.h
│ │ │ │ │ │ ├── hooks.h
│ │ │ │ │ │ ├── jemalloc_internal_decls.h
│ │ │ │ │ │ ├── jemalloc_internal_defs.h.in
│ │ │ │ │ │ ├── jemalloc_internal_externs.h
│ │ │ │ │ │ ├── jemalloc_internal_includes.h
│ │ │ │ │ │ ├── jemalloc_internal_inlines_a.h
│ │ │ │ │ │ ├── jemalloc_internal_inlines_b.h
│ │ │ │ │ │ ├── jemalloc_internal_inlines_c.h
│ │ │ │ │ │ ├── jemalloc_internal_macros.h
│ │ │ │ │ │ ├── jemalloc_internal_types.h
│ │ │ │ │ │ ├── jemalloc_preamble.h.in
│ │ │ │ │ │ ├── large_externs.h
│ │ │ │ │ │ ├── log.h
│ │ │ │ │ │ ├── malloc_io.h
│ │ │ │ │ │ ├── mutex.h
│ │ │ │ │ │ ├── mutex_pool.h
│ │ │ │ │ │ ├── mutex_prof.h
│ │ │ │ │ │ ├── nstime.h
│ │ │ │ │ │ ├── pages.h
│ │ │ │ │ │ ├── ph.h
│ │ │ │ │ │ ├── private_namespace.sh
│ │ │ │ │ │ ├── private_symbols.sh
│ │ │ │ │ │ ├── prng.h
│ │ │ │ │ │ ├── prof_externs.h
│ │ │ │ │ │ ├── prof_inlines_a.h
│ │ │ │ │ │ ├── prof_inlines_b.h
│ │ │ │ │ │ ├── prof_structs.h
│ │ │ │ │ │ ├── prof_types.h
│ │ │ │ │ │ ├── public_namespace.sh
│ │ │ │ │ │ ├── public_unnamespace.sh
│ │ │ │ │ │ ├── ql.h
│ │ │ │ │ │ ├── qr.h
│ │ │ │ │ │ ├── rb.h
│ │ │ │ │ │ ├── rtree.h
│ │ │ │ │ │ ├── rtree_tsd.h
│ │ │ │ │ │ ├── size_classes.sh
│ │ │ │ │ │ ├── smoothstep.h
│ │ │ │ │ │ ├── smoothstep.sh
│ │ │ │ │ │ ├── spin.h
│ │ │ │ │ │ ├── stats.h
│ │ │ │ │ │ ├── sz.h
│ │ │ │ │ │ ├── tcache_externs.h
│ │ │ │ │ │ ├── tcache_inlines.h
│ │ │ │ │ │ ├── tcache_structs.h
│ │ │ │ │ │ ├── tcache_types.h
│ │ │ │ │ │ ├── ticker.h
│ │ │ │ │ │ ├── tsd.h
│ │ │ │ │ │ ├── tsd_generic.h
│ │ │ │ │ │ ├── tsd_malloc_thread_cleanup.h
│ │ │ │ │ │ ├── tsd_tls.h
│ │ │ │ │ │ ├── tsd_types.h
│ │ │ │ │ │ ├── tsd_win.h
│ │ │ │ │ │ ├── util.h
│ │ │ │ │ │ └── witness.h
│ │ │ │ │ ├── jemalloc.sh
│ │ │ │ │ ├── jemalloc_defs.h.in
│ │ │ │ │ ├── jemalloc_macros.h.in
│ │ │ │ │ ├── jemalloc_mangle.sh
│ │ │ │ │ ├── jemalloc_protos.h.in
│ │ │ │ │ ├── jemalloc_rename.sh
│ │ │ │ │ └── jemalloc_typedefs.h.in
│ │ │ │ └── msvc_compat/
│ │ │ │ ├── C99/
│ │ │ │ │ ├── stdbool.h
│ │ │ │ │ └── stdint.h
│ │ │ │ ├── strings.h
│ │ │ │ └── windows_extra.h
│ │ │ ├── jemalloc.pc.in
│ │ │ ├── m4/
│ │ │ │ └── ax_cxx_compile_stdcxx.m4
│ │ │ ├── msvc/
│ │ │ │ ├── ReadMe.txt
│ │ │ │ ├── jemalloc_vc2015.sln
│ │ │ │ ├── jemalloc_vc2017.sln
│ │ │ │ ├── projects/
│ │ │ │ │ ├── vc2015/
│ │ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ │ ├── jemalloc.vcxproj
│ │ │ │ │ │ │ └── jemalloc.vcxproj.filters
│ │ │ │ │ │ └── test_threads/
│ │ │ │ │ │ ├── test_threads.vcxproj
│ │ │ │ │ │ └── test_threads.vcxproj.filters
│ │ │ │ │ └── vc2017/
│ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ ├── jemalloc.vcxproj
│ │ │ │ │ │ └── jemalloc.vcxproj.filters
│ │ │ │ │ └── test_threads/
│ │ │ │ │ ├── test_threads.vcxproj
│ │ │ │ │ └── test_threads.vcxproj.filters
│ │ │ │ └── test_threads/
│ │ │ │ ├── test_threads.cpp
│ │ │ │ ├── test_threads.h
│ │ │ │ └── test_threads_main.cpp
│ │ │ ├── run_tests.sh
│ │ │ ├── scripts/
│ │ │ │ ├── gen_run_tests.py
│ │ │ │ └── gen_travis.py
│ │ │ ├── src/
│ │ │ │ ├── arena.c
│ │ │ │ ├── background_thread.c
│ │ │ │ ├── base.c
│ │ │ │ ├── bin.c
│ │ │ │ ├── bitmap.c
│ │ │ │ ├── ckh.c
│ │ │ │ ├── ctl.c
│ │ │ │ ├── div.c
│ │ │ │ ├── extent.c
│ │ │ │ ├── extent_dss.c
│ │ │ │ ├── extent_mmap.c
│ │ │ │ ├── hash.c
│ │ │ │ ├── hooks.c
│ │ │ │ ├── jemalloc.c
│ │ │ │ ├── jemalloc_cpp.cpp
│ │ │ │ ├── large.c
│ │ │ │ ├── log.c
│ │ │ │ ├── malloc_io.c
│ │ │ │ ├── mutex.c
│ │ │ │ ├── mutex_pool.c
│ │ │ │ ├── nstime.c
│ │ │ │ ├── pages.c
│ │ │ │ ├── prng.c
│ │ │ │ ├── prof.c
│ │ │ │ ├── rtree.c
│ │ │ │ ├── stats.c
│ │ │ │ ├── sz.c
│ │ │ │ ├── tcache.c
│ │ │ │ ├── ticker.c
│ │ │ │ ├── tsd.c
│ │ │ │ ├── witness.c
│ │ │ │ └── zone.c
│ │ │ └── test/
│ │ │ ├── include/
│ │ │ │ └── test/
│ │ │ │ ├── SFMT-alti.h
│ │ │ │ ├── SFMT-params.h
│ │ │ │ ├── SFMT-params11213.h
│ │ │ │ ├── SFMT-params1279.h
│ │ │ │ ├── SFMT-params132049.h
│ │ │ │ ├── SFMT-params19937.h
│ │ │ │ ├── SFMT-params216091.h
│ │ │ │ ├── SFMT-params2281.h
│ │ │ │ ├── SFMT-params4253.h
│ │ │ │ ├── SFMT-params44497.h
│ │ │ │ ├── SFMT-params607.h
│ │ │ │ ├── SFMT-params86243.h
│ │ │ │ ├── SFMT-sse2.h
│ │ │ │ ├── SFMT.h
│ │ │ │ ├── btalloc.h
│ │ │ │ ├── extent_hooks.h
│ │ │ │ ├── jemalloc_test.h.in
│ │ │ │ ├── jemalloc_test_defs.h.in
│ │ │ │ ├── math.h
│ │ │ │ ├── mq.h
│ │ │ │ ├── mtx.h
│ │ │ │ ├── test.h
│ │ │ │ ├── thd.h
│ │ │ │ └── timer.h
│ │ │ ├── integration/
│ │ │ │ ├── MALLOCX_ARENA.c
│ │ │ │ ├── aligned_alloc.c
│ │ │ │ ├── allocated.c
│ │ │ │ ├── extent.c
│ │ │ │ ├── extent.sh
│ │ │ │ ├── mallocx.c
│ │ │ │ ├── mallocx.sh
│ │ │ │ ├── overflow.c
│ │ │ │ ├── posix_memalign.c
│ │ │ │ ├── rallocx.c
│ │ │ │ ├── sdallocx.c
│ │ │ │ ├── thread_arena.c
│ │ │ │ ├── thread_tcache_enabled.c
│ │ │ │ ├── xallocx.c
│ │ │ │ └── xallocx.sh
│ │ │ ├── src/
│ │ │ │ ├── SFMT.c
│ │ │ │ ├── btalloc.c
│ │ │ │ ├── btalloc_0.c
│ │ │ │ ├── btalloc_1.c
│ │ │ │ ├── math.c
│ │ │ │ ├── mq.c
│ │ │ │ ├── mtx.c
│ │ │ │ ├── test.c
│ │ │ │ ├── thd.c
│ │ │ │ └── timer.c
│ │ │ ├── stress/
│ │ │ │ └── microbench.c
│ │ │ ├── test.sh.in
│ │ │ └── unit/
│ │ │ ├── SFMT.c
│ │ │ ├── a0.c
│ │ │ ├── arena_reset.c
│ │ │ ├── arena_reset_prof.c
│ │ │ ├── arena_reset_prof.sh
│ │ │ ├── atomic.c
│ │ │ ├── background_thread.c
│ │ │ ├── background_thread_enable.c
│ │ │ ├── base.c
│ │ │ ├── bit_util.c
│ │ │ ├── bitmap.c
│ │ │ ├── ckh.c
│ │ │ ├── decay.c
│ │ │ ├── decay.sh
│ │ │ ├── div.c
│ │ │ ├── emitter.c
│ │ │ ├── extent_quantize.c
│ │ │ ├── fork.c
│ │ │ ├── hash.c
│ │ │ ├── hooks.c
│ │ │ ├── junk.c
│ │ │ ├── junk.sh
│ │ │ ├── junk_alloc.c
│ │ │ ├── junk_alloc.sh
│ │ │ ├── junk_free.c
│ │ │ ├── junk_free.sh
│ │ │ ├── log.c
│ │ │ ├── mallctl.c
│ │ │ ├── malloc_io.c
│ │ │ ├── math.c
│ │ │ ├── mq.c
│ │ │ ├── mtx.c
│ │ │ ├── nstime.c
│ │ │ ├── pack.c
│ │ │ ├── pack.sh
│ │ │ ├── pages.c
│ │ │ ├── ph.c
│ │ │ ├── prng.c
│ │ │ ├── prof_accum.c
│ │ │ ├── prof_accum.sh
│ │ │ ├── prof_active.c
│ │ │ ├── prof_active.sh
│ │ │ ├── prof_gdump.c
│ │ │ ├── prof_gdump.sh
│ │ │ ├── prof_idump.c
│ │ │ ├── prof_idump.sh
│ │ │ ├── prof_reset.c
│ │ │ ├── prof_reset.sh
│ │ │ ├── prof_tctx.c
│ │ │ ├── prof_tctx.sh
│ │ │ ├── prof_thread_name.c
│ │ │ ├── prof_thread_name.sh
│ │ │ ├── ql.c
│ │ │ ├── qr.c
│ │ │ ├── rb.c
│ │ │ ├── retained.c
│ │ │ ├── rtree.c
│ │ │ ├── size_classes.c
│ │ │ ├── slab.c
│ │ │ ├── smoothstep.c
│ │ │ ├── spin.c
│ │ │ ├── stats.c
│ │ │ ├── stats_print.c
│ │ │ ├── ticker.c
│ │ │ ├── tsd.c
│ │ │ ├── witness.c
│ │ │ ├── zero.c
│ │ │ └── zero.sh
│ │ ├── linenoise/
│ │ │ ├── .gitignore
│ │ │ ├── Makefile
│ │ │ ├── README.markdown
│ │ │ ├── example.c
│ │ │ ├── linenoise.c
│ │ │ └── linenoise.h
│ │ ├── lua/
│ │ │ ├── COPYRIGHT
│ │ │ ├── HISTORY
│ │ │ ├── INSTALL
│ │ │ ├── Makefile
│ │ │ ├── README
│ │ │ ├── doc/
│ │ │ │ ├── contents.html
│ │ │ │ ├── lua.1
│ │ │ │ ├── lua.css
│ │ │ │ ├── lua.html
│ │ │ │ ├── luac.1
│ │ │ │ ├── luac.html
│ │ │ │ ├── manual.css
│ │ │ │ ├── manual.html
│ │ │ │ └── readme.html
│ │ │ ├── etc/
│ │ │ │ ├── Makefile
│ │ │ │ ├── README
│ │ │ │ ├── all.c
│ │ │ │ ├── lua.hpp
│ │ │ │ ├── lua.pc
│ │ │ │ ├── luavs.bat
│ │ │ │ ├── min.c
│ │ │ │ ├── noparser.c
│ │ │ │ └── strict.lua
│ │ │ ├── src/
│ │ │ │ ├── Makefile
│ │ │ │ ├── fpconv.c
│ │ │ │ ├── fpconv.h
│ │ │ │ ├── lapi.c
│ │ │ │ ├── lapi.h
│ │ │ │ ├── lauxlib.c
│ │ │ │ ├── lauxlib.h
│ │ │ │ ├── lbaselib.c
│ │ │ │ ├── lcode.c
│ │ │ │ ├── lcode.h
│ │ │ │ ├── ldblib.c
│ │ │ │ ├── ldebug.c
│ │ │ │ ├── ldebug.h
│ │ │ │ ├── ldo.c
│ │ │ │ ├── ldo.h
│ │ │ │ ├── ldump.c
│ │ │ │ ├── lfunc.c
│ │ │ │ ├── lfunc.h
│ │ │ │ ├── lgc.c
│ │ │ │ ├── lgc.h
│ │ │ │ ├── linit.c
│ │ │ │ ├── liolib.c
│ │ │ │ ├── llex.c
│ │ │ │ ├── llex.h
│ │ │ │ ├── llimits.h
│ │ │ │ ├── lmathlib.c
│ │ │ │ ├── lmem.c
│ │ │ │ ├── lmem.h
│ │ │ │ ├── loadlib.c
│ │ │ │ ├── lobject.c
│ │ │ │ ├── lobject.h
│ │ │ │ ├── lopcodes.c
│ │ │ │ ├── lopcodes.h
│ │ │ │ ├── loslib.c
│ │ │ │ ├── lparser.c
│ │ │ │ ├── lparser.h
│ │ │ │ ├── lstate.c
│ │ │ │ ├── lstate.h
│ │ │ │ ├── lstring.c
│ │ │ │ ├── lstring.h
│ │ │ │ ├── lstrlib.c
│ │ │ │ ├── ltable.c
│ │ │ │ ├── ltable.h
│ │ │ │ ├── ltablib.c
│ │ │ │ ├── ltm.c
│ │ │ │ ├── ltm.h
│ │ │ │ ├── lua.c
│ │ │ │ ├── lua.h
│ │ │ │ ├── lua_bit.c
│ │ │ │ ├── lua_cjson.c
│ │ │ │ ├── lua_cmsgpack.c
│ │ │ │ ├── lua_struct.c
│ │ │ │ ├── luac.c
│ │ │ │ ├── luaconf.h
│ │ │ │ ├── lualib.h
│ │ │ │ ├── lundump.c
│ │ │ │ ├── lundump.h
│ │ │ │ ├── lvm.c
│ │ │ │ ├── lvm.h
│ │ │ │ ├── lzio.c
│ │ │ │ ├── lzio.h
│ │ │ │ ├── print.c
│ │ │ │ ├── strbuf.c
│ │ │ │ └── strbuf.h
│ │ │ └── test/
│ │ │ ├── README
│ │ │ ├── bisect.lua
│ │ │ ├── cf.lua
│ │ │ ├── echo.lua
│ │ │ ├── env.lua
│ │ │ ├── factorial.lua
│ │ │ ├── fib.lua
│ │ │ ├── fibfor.lua
│ │ │ ├── globals.lua
│ │ │ ├── hello.lua
│ │ │ ├── life.lua
│ │ │ ├── luac.lua
│ │ │ ├── printf.lua
│ │ │ ├── readonly.lua
│ │ │ ├── sieve.lua
│ │ │ ├── sort.lua
│ │ │ ├── table.lua
│ │ │ ├── trace-calls.lua
│ │ │ ├── trace-globals.lua
│ │ │ └── xd.lua
│ │ └── update-jemalloc.sh
│ ├── redis.conf
│ ├── runtest
│ ├── runtest-cluster
│ ├── runtest-moduleapi
│ ├── runtest-sentinel
│ ├── sentinel.conf
│ ├── src/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── acl.c
│ │ ├── adlist.c
│ │ ├── adlist.h
│ │ ├── ae.c
│ │ ├── ae.h
│ │ ├── ae_epoll.c
│ │ ├── ae_evport.c
│ │ ├── ae_kqueue.c
│ │ ├── ae_select.c
│ │ ├── anet.c
│ │ ├── anet.h
│ │ ├── aof.c
│ │ ├── asciilogo.h
│ │ ├── atomicvar.h
│ │ ├── bio.c
│ │ ├── bio.h
│ │ ├── bitops.c
│ │ ├── blocked.c
│ │ ├── childinfo.c
│ │ ├── cluster.c
│ │ ├── cluster.h
│ │ ├── config.c
│ │ ├── config.h
│ │ ├── connection.c
│ │ ├── connection.h
│ │ ├── connhelpers.h
│ │ ├── crc16.c
│ │ ├── crc16_slottable.h
│ │ ├── crc64.c
│ │ ├── crc64.h
│ │ ├── crcspeed.c
│ │ ├── crcspeed.h
│ │ ├── db.c
│ │ ├── debug.c
│ │ ├── debugmacro.h
│ │ ├── defrag.c
│ │ ├── dict.c
│ │ ├── dict.h
│ │ ├── endianconv.c
│ │ ├── endianconv.h
│ │ ├── evict.c
│ │ ├── expire.c
│ │ ├── fmacros.h
│ │ ├── geo.c
│ │ ├── geo.h
│ │ ├── geohash.c
│ │ ├── geohash.h
│ │ ├── geohash_helper.c
│ │ ├── geohash_helper.h
│ │ ├── gopher.c
│ │ ├── help.h
│ │ ├── hyperloglog.c
│ │ ├── intset.c
│ │ ├── intset.h
│ │ ├── latency.c
│ │ ├── latency.h
│ │ ├── lazyfree.c
│ │ ├── listpack.c
│ │ ├── listpack.h
│ │ ├── listpack_malloc.h
│ │ ├── localtime.c
│ │ ├── lolwut.c
│ │ ├── lolwut.h
│ │ ├── lolwut5.c
│ │ ├── lolwut6.c
│ │ ├── lzf.h
│ │ ├── lzfP.h
│ │ ├── lzf_c.c
│ │ ├── lzf_d.c
│ │ ├── memtest.c
│ │ ├── mkreleasehdr.sh
│ │ ├── module.c
│ │ ├── modules/
│ │ │ ├── .gitignore
│ │ │ ├── Makefile
│ │ │ ├── gendoc.rb
│ │ │ ├── helloacl.c
│ │ │ ├── helloblock.c
│ │ │ ├── hellocluster.c
│ │ │ ├── hellodict.c
│ │ │ ├── hellohook.c
│ │ │ ├── hellotimer.c
│ │ │ ├── hellotype.c
│ │ │ ├── helloworld.c
│ │ │ └── testmodule.c
│ │ ├── multi.c
│ │ ├── networking.c
│ │ ├── notify.c
│ │ ├── object.c
│ │ ├── pqsort.c
│ │ ├── pqsort.h
│ │ ├── pubsub.c
│ │ ├── quicklist.c
│ │ ├── quicklist.h
│ │ ├── rand.c
│ │ ├── rand.h
│ │ ├── rax.c
│ │ ├── rax.h
│ │ ├── rax_malloc.h
│ │ ├── rdb.c
│ │ ├── rdb.h
│ │ ├── redis-benchmark.c
│ │ ├── redis-check-aof.c
│ │ ├── redis-check-rdb.c
│ │ ├── redis-cli.c
│ │ ├── redis-trib.rb
│ │ ├── redisassert.h
│ │ ├── redismodule.h
│ │ ├── release.c
│ │ ├── replication.c
│ │ ├── rio.c
│ │ ├── rio.h
│ │ ├── scripting.c
│ │ ├── sds.c
│ │ ├── sds.h
│ │ ├── sdsalloc.h
│ │ ├── sentinel.c
│ │ ├── server.c
│ │ ├── server.h
│ │ ├── setcpuaffinity.c
│ │ ├── setproctitle.c
│ │ ├── sha1.c
│ │ ├── sha1.h
│ │ ├── sha256.c
│ │ ├── sha256.h
│ │ ├── siphash.c
│ │ ├── slowlog.c
│ │ ├── slowlog.h
│ │ ├── solarisfixes.h
│ │ ├── sort.c
│ │ ├── sparkline.c
│ │ ├── sparkline.h
│ │ ├── stream.h
│ │ ├── syncio.c
│ │ ├── t_hash.c
│ │ ├── t_list.c
│ │ ├── t_set.c
│ │ ├── t_stream.c
│ │ ├── t_string.c
│ │ ├── t_zset.c
│ │ ├── testhelp.h
│ │ ├── timeout.c
│ │ ├── tls.c
│ │ ├── tracking.c
│ │ ├── util.c
│ │ ├── util.h
│ │ ├── valgrind.sup
│ │ ├── version.h
│ │ ├── ziplist.c
│ │ ├── ziplist.h
│ │ ├── zipmap.c
│ │ ├── zipmap.h
│ │ ├── zmalloc.c
│ │ └── zmalloc.h
│ ├── tests/
│ │ ├── assets/
│ │ │ ├── default.conf
│ │ │ ├── encodings.rdb
│ │ │ └── hash-zipmap.rdb
│ │ ├── cluster/
│ │ │ ├── cluster.tcl
│ │ │ ├── run.tcl
│ │ │ ├── tests/
│ │ │ │ ├── 00-base.tcl
│ │ │ │ ├── 01-faildet.tcl
│ │ │ │ ├── 02-failover.tcl
│ │ │ │ ├── 03-failover-loop.tcl
│ │ │ │ ├── 04-resharding.tcl
│ │ │ │ ├── 05-slave-selection.tcl
│ │ │ │ ├── 06-slave-stop-cond.tcl
│ │ │ │ ├── 07-replica-migration.tcl
│ │ │ │ ├── 08-update-msg.tcl
│ │ │ │ ├── 09-pubsub.tcl
│ │ │ │ ├── 10-manual-failover.tcl
│ │ │ │ ├── 11-manual-takeover.tcl
│ │ │ │ ├── 12-replica-migration-2.tcl
│ │ │ │ ├── 13-no-failover-option.tcl
│ │ │ │ ├── 14-consistency-check.tcl
│ │ │ │ ├── 15-cluster-slots.tcl
│ │ │ │ ├── helpers/
│ │ │ │ │ └── onlydots.tcl
│ │ │ │ └── includes/
│ │ │ │ └── init-tests.tcl
│ │ │ └── tmp/
│ │ │ └── .gitignore
│ │ ├── helpers/
│ │ │ ├── bg_block_op.tcl
│ │ │ ├── bg_complex_data.tcl
│ │ │ └── gen_write_load.tcl
│ │ ├── instances.tcl
│ │ ├── integration/
│ │ │ ├── aof-race.tcl
│ │ │ ├── aof.tcl
│ │ │ ├── block-repl.tcl
│ │ │ ├── convert-zipmap-hash-on-load.tcl
│ │ │ ├── logging.tcl
│ │ │ ├── psync2-pingoff.tcl
│ │ │ ├── psync2-reg.tcl
│ │ │ ├── psync2.tcl
│ │ │ ├── rdb.tcl
│ │ │ ├── redis-cli.tcl
│ │ │ ├── replication-2.tcl
│ │ │ ├── replication-3.tcl
│ │ │ ├── replication-4.tcl
│ │ │ ├── replication-psync.tcl
│ │ │ └── replication.tcl
│ │ ├── modules/
│ │ │ ├── Makefile
│ │ │ ├── auth.c
│ │ │ ├── blockonkeys.c
│ │ │ ├── commandfilter.c
│ │ │ ├── datatype.c
│ │ │ ├── fork.c
│ │ │ ├── hooks.c
│ │ │ ├── infotest.c
│ │ │ ├── misc.c
│ │ │ ├── propagate.c
│ │ │ ├── scan.c
│ │ │ └── testrdb.c
│ │ ├── sentinel/
│ │ │ ├── run.tcl
│ │ │ ├── tests/
│ │ │ │ ├── 00-base.tcl
│ │ │ │ ├── 01-conf-update.tcl
│ │ │ │ ├── 02-slaves-reconf.tcl
│ │ │ │ ├── 03-runtime-reconf.tcl
│ │ │ │ ├── 04-slave-selection.tcl
│ │ │ │ ├── 05-manual.tcl
│ │ │ │ ├── 06-ckquorum.tcl
│ │ │ │ ├── 07-down-conditions.tcl
│ │ │ │ └── includes/
│ │ │ │ └── init-tests.tcl
│ │ │ └── tmp/
│ │ │ └── .gitignore
│ │ ├── support/
│ │ │ ├── cli.tcl
│ │ │ ├── cluster.tcl
│ │ │ ├── redis.tcl
│ │ │ ├── server.tcl
│ │ │ ├── test.tcl
│ │ │ ├── tmpfile.tcl
│ │ │ └── util.tcl
│ │ ├── test_helper.tcl
│ │ └── unit/
│ │ ├── acl.tcl
│ │ ├── aofrw.tcl
│ │ ├── auth.tcl
│ │ ├── bitfield.tcl
│ │ ├── bitops.tcl
│ │ ├── dump.tcl
│ │ ├── expire.tcl
│ │ ├── geo.tcl
│ │ ├── hyperloglog.tcl
│ │ ├── introspection-2.tcl
│ │ ├── introspection.tcl
│ │ ├── keyspace.tcl
│ │ ├── latency-monitor.tcl
│ │ ├── lazyfree.tcl
│ │ ├── limits.tcl
│ │ ├── maxmemory.tcl
│ │ ├── memefficiency.tcl
│ │ ├── moduleapi/
│ │ │ ├── auth.tcl
│ │ │ ├── blockonkeys.tcl
│ │ │ ├── commandfilter.tcl
│ │ │ ├── datatype.tcl
│ │ │ ├── fork.tcl
│ │ │ ├── hooks.tcl
│ │ │ ├── infotest.tcl
│ │ │ ├── misc.tcl
│ │ │ ├── propagate.tcl
│ │ │ ├── scan.tcl
│ │ │ └── testrdb.tcl
│ │ ├── multi.tcl
│ │ ├── obuf-limits.tcl
│ │ ├── other.tcl
│ │ ├── pendingquerybuf.tcl
│ │ ├── printver.tcl
│ │ ├── protocol.tcl
│ │ ├── pubsub.tcl
│ │ ├── quit.tcl
│ │ ├── scan.tcl
│ │ ├── scripting.tcl
│ │ ├── slowlog.tcl
│ │ ├── sort.tcl
│ │ ├── tls.tcl
│ │ ├── tracking.tcl
│ │ ├── type/
│ │ │ ├── hash.tcl
│ │ │ ├── incr.tcl
│ │ │ ├── list-2.tcl
│ │ │ ├── list-3.tcl
│ │ │ ├── list-common.tcl
│ │ │ ├── list.tcl
│ │ │ ├── set.tcl
│ │ │ ├── stream-cgroups.tcl
│ │ │ ├── stream.tcl
│ │ │ ├── string.tcl
│ │ │ └── zset.tcl
│ │ └── wait.tcl
│ └── utils/
│ ├── build-static-symbols.tcl
│ ├── cluster_fail_time.tcl
│ ├── corrupt_rdb.c
│ ├── create-cluster/
│ │ ├── .gitignore
│ │ ├── README
│ │ └── create-cluster
│ ├── gen-test-certs.sh
│ ├── generate-command-help.rb
│ ├── graphs/
│ │ └── commits-over-time/
│ │ ├── README.md
│ │ └── genhtml.tcl
│ ├── hashtable/
│ │ ├── README
│ │ └── rehashing.c
│ ├── hyperloglog/
│ │ ├── .gitignore
│ │ ├── hll-err.rb
│ │ └── hll-gnuplot-graph.rb
│ ├── install_server.sh
│ ├── lru/
│ │ ├── README
│ │ ├── lfu-simulation.c
│ │ └── test-lru.rb
│ ├── redis-copy.rb
│ ├── redis-sha1.rb
│ ├── redis_init_script
│ ├── redis_init_script.tpl
│ ├── releasetools/
│ │ ├── 01_create_tarball.sh
│ │ ├── 02_upload_tarball.sh
│ │ ├── 03_test_release.sh
│ │ ├── 04_release_hash.sh
│ │ └── changelog.tcl
│ ├── speed-regression.tcl
│ ├── srandmember/
│ │ ├── README.md
│ │ ├── showdist.rb
│ │ └── showfreq.rb
│ ├── systemd-redis_multiple_servers@.service
│ ├── systemd-redis_server.service
│ ├── tracking_collisions.c
│ └── whatisdoing.sh
├── Chapter03/
│ └── code/
│ ├── SharedMutex.cpp
│ ├── SharedMutex.h
│ ├── SingleInstance/
│ │ ├── Resource.h
│ │ ├── SingleInstance.cpp
│ │ ├── SingleInstance.h
│ │ ├── SingleInstance.rc
│ │ ├── SingleInstance.sln
│ │ ├── SingleInstance.vcxproj
│ │ ├── SingleInstance.vcxproj.filters
│ │ ├── stdafx.cpp
│ │ ├── stdafx.h
│ │ └── targetver.h
│ ├── TaskPool.cpp
│ ├── TaskPool.h
│ ├── TestFiber.cpp
│ ├── TestSharedMutexBenchmark.cpp
│ ├── TestWindowsConditionVariable/
│ │ ├── TestWindowsConditionVariable.cpp
│ │ ├── TestWindowsConditionVariable.sln
│ │ ├── TestWindowsConditionVariable.vcxproj
│ │ └── TestWindowsConditionVariable.vcxproj.filters
│ ├── c11mutex.cpp
│ ├── c11threadlocal.cpp
│ ├── cpp11cv.cpp
│ ├── cv.cpp
│ ├── insecurecrtfunction.cpp
│ ├── linuxtid.cpp
│ ├── linuxtls.cpp
│ ├── linuxtls2.cpp
│ ├── makesurethread.cpp
│ ├── makesurethreadgroup.cpp
│ ├── rwlock.cpp
│ ├── rwlock2.cpp
│ ├── rwlock3.cpp
│ ├── semaphore.cpp
│ ├── semaphore_timewait.cpp
│ ├── taskpoolmain.cpp
│ ├── test_cpp11_thread_id.cpp
│ ├── test_destroy_locked_mutex.cpp
│ └── windowstls.cpp
├── Chapter04/
│ └── code/
│ ├── IOCPServerDemo/
│ │ ├── IOCPModel.cpp
│ │ ├── IOCPModel.h
│ │ ├── IOCPServerApp.cpp
│ │ ├── IOCPServerApp.h
│ │ ├── IOCPServerDemo.rc
│ │ ├── IOCPServerDemo.sln
│ │ ├── IOCPServerDemo.vcproj
│ │ ├── IOCPServerDemo.vcxproj
│ │ ├── IOCPServerDemo.vcxproj.filters
│ │ ├── MainDlg.cpp
│ │ ├── MainDlg.h
│ │ ├── XPStyle.manifest
│ │ ├── res/
│ │ │ ├── IOCPServerDemo.rc2
│ │ │ └── vssver2.scc
│ │ ├── resource.h
│ │ ├── stdafx.cpp
│ │ ├── stdafx.h
│ │ └── targetver.h
│ ├── WSAAsyncSelect/
│ │ ├── Resource.h
│ │ ├── WSAAsyncSelect.cpp
│ │ ├── WSAAsyncSelect.h
│ │ ├── WSAAsyncSelect.rc
│ │ ├── WSAAsyncSelect.sln
│ │ ├── WSAAsyncSelect.vcxproj
│ │ ├── WSAAsyncSelect.vcxproj.filters
│ │ ├── stdafx.cpp
│ │ ├── stdafx.h
│ │ └── targetver.h
│ ├── WSAEventSelect/
│ │ ├── WSAEventSelect.cpp
│ │ ├── WSAEventSelect.sln
│ │ ├── WSAEventSelect.vcxproj
│ │ ├── WSAEventSelect.vcxproj.filters
│ │ ├── stdafx.cpp
│ │ ├── stdafx.h
│ │ └── targetver.h
│ ├── blocking_client.cpp
│ ├── blocking_client_recv.cpp
│ ├── blocking_client_send.cpp
│ ├── blocking_server.cpp
│ ├── client.cpp
│ ├── client2.cpp
│ ├── epoll_server.cpp
│ ├── epoll_server_with_oneshot.cpp
│ ├── epoll_server_with_oneshot_2.cpp
│ ├── epoll_server_write_event_et.cpp
│ ├── epoll_server_write_event_lt.cpp
│ ├── gethostbyname_linux.cpp
│ ├── linux_ioctl.cpp
│ ├── linux_nonblocking_connect.cpp
│ ├── linux_nonblocking_connect_poll.cpp
│ ├── nagle_client.cpp
│ ├── nodelay_client.cpp
│ ├── nonblocking_client.cpp
│ ├── nonblocking_client_recv.cpp
│ ├── nonblocking_client_send.cpp
│ ├── nonblocking_client_send_zero_bytes.cpp
│ ├── nonblocking_connect.cpp
│ ├── poll_server.cpp
│ ├── select_client_tv0.cpp
│ ├── select_client_tvnull.cpp
│ ├── select_server.cpp
│ ├── server.cpp
│ ├── server2.cpp
│ └── server_recv_zero_bytes.cpp
├── Chapter06/
│ └── code/
│ ├── ProtocolStream.cpp
│ ├── ProtocolStream.h
│ ├── RecvMail/
│ │ ├── Base64Util.cpp
│ │ ├── Base64Util.h
│ │ ├── EncodeUtil.cpp
│ │ ├── EncodeUtil.h
│ │ ├── MailHelper.cpp
│ │ ├── MailHelper.h
│ │ ├── MailThread.cpp
│ │ ├── MailThread.h
│ │ ├── Platform.cpp
│ │ ├── Platform.h
│ │ ├── Pop3Socket.cpp
│ │ ├── Pop3Socket.h
│ │ ├── RecvMail.sln
│ │ ├── RecvMail.vcxproj
│ │ ├── RecvMail.vcxproj.filters
│ │ ├── mailcontent.txt
│ │ ├── main.cpp
│ │ └── test.docx
│ ├── SendMail/
│ │ ├── Base64Util.cpp
│ │ ├── Base64Util.h
│ │ ├── CMakeLists.txt
│ │ ├── MailMonitor.cpp
│ │ ├── MailMonitor.h
│ │ ├── Platform.cpp
│ │ ├── Platform.h
│ │ ├── SendMail.sln
│ │ ├── SendMail.vcxproj
│ │ ├── SendMail.vcxproj.filters
│ │ ├── SmtpSocket.cpp
│ │ ├── SmtpSocket.h
│ │ └── main.cpp
│ ├── WebSocketServer/
│ │ ├── CMakeLists.txt
│ │ ├── README.md
│ │ ├── WebSocketServer.sln
│ │ ├── WebSocketServer.vcxproj
│ │ ├── WebSocketServer.vcxproj.filters
│ │ ├── appsrc/
│ │ │ ├── BusinessSession.cpp
│ │ │ ├── BusinessSession.h
│ │ │ └── main.cpp
│ │ ├── base/
│ │ │ ├── AsyncLog.cpp
│ │ │ ├── AsyncLog.h
│ │ │ ├── ConfigFileReader.cpp
│ │ │ ├── ConfigFileReader.h
│ │ │ ├── Platform.cpp
│ │ │ ├── Platform.h
│ │ │ ├── RAIIWrapper.h
│ │ │ ├── Singleton.h
│ │ │ ├── Timestamp.cpp
│ │ │ └── Timestamp.h
│ │ ├── net/
│ │ │ ├── Acceptor.cpp
│ │ │ ├── Acceptor.h
│ │ │ ├── Buffer.cpp
│ │ │ ├── Buffer.h
│ │ │ ├── Callbacks.h
│ │ │ ├── Channel.cpp
│ │ │ ├── Channel.h
│ │ │ ├── Connector.cpp
│ │ │ ├── Connector.h
│ │ │ ├── Endian.h
│ │ │ ├── EpollPoller.cpp
│ │ │ ├── EpollPoller.h
│ │ │ ├── EventLoop.cpp
│ │ │ ├── EventLoop.h
│ │ │ ├── EventLoopThread.cpp
│ │ │ ├── EventLoopThread.h
│ │ │ ├── EventLoopThreadPool.cpp
│ │ │ ├── EventLoopThreadPool.h
│ │ │ ├── InetAddress.cpp
│ │ │ ├── InetAddress.h
│ │ │ ├── PollPoller.cpp
│ │ │ ├── PollPoller.h
│ │ │ ├── Poller.cpp
│ │ │ ├── Poller.h
│ │ │ ├── ProtocolStream.cpp
│ │ │ ├── ProtocolStream.h
│ │ │ ├── SelectPoller.cpp
│ │ │ ├── SelectPoller.h
│ │ │ ├── Sockets.cpp
│ │ │ ├── Sockets.h
│ │ │ ├── TcpClient.cpp
│ │ │ ├── TcpClient.h
│ │ │ ├── TcpConnection.cpp
│ │ │ ├── TcpConnection.h
│ │ │ ├── TcpServer.cpp
│ │ │ ├── TcpServer.h
│ │ │ ├── Timer.cpp
│ │ │ ├── Timer.h
│ │ │ ├── TimerId.h
│ │ │ ├── TimerQueue.cpp
│ │ │ └── TimerQueue.h
│ │ ├── utils/
│ │ │ ├── DaemonRun.cpp
│ │ │ ├── DaemonRun.h
│ │ │ ├── StringUtil.cpp
│ │ │ ├── StringUtil.h
│ │ │ ├── UUIDGenerator.cpp
│ │ │ └── UUIDGenerator.h
│ │ ├── websocketsrc/
│ │ │ ├── MyWebSocketServer.cpp
│ │ │ ├── MyWebSocketServer.h
│ │ │ ├── MyWebSocketSession.cpp
│ │ │ ├── MyWebSocketSession.h
│ │ │ └── WebSocketHandshake.h
│ │ └── zlib1.2.11/
│ │ ├── ZlibUtil.cpp
│ │ ├── ZlibUtil.h
│ │ ├── adler32.c
│ │ ├── compress.c
│ │ ├── crc32.c
│ │ ├── crc32.h
│ │ ├── deflate.c
│ │ ├── deflate.h
│ │ ├── gzclose.c
│ │ ├── gzguts.h
│ │ ├── gzlib.c
│ │ ├── gzread.c
│ │ ├── gzwrite.c
│ │ ├── infback.c
│ │ ├── inffast.c
│ │ ├── inffast.h
│ │ ├── inffixed.h
│ │ ├── inflate.c
│ │ ├── inflate.h
│ │ ├── inftrees.c
│ │ ├── inftrees.h
│ │ ├── trees.c
│ │ ├── trees.h
│ │ ├── uncompr.c
│ │ ├── zconf.h
│ │ ├── zlib.h
│ │ ├── zlibdemo.c
│ │ ├── zutil.c
│ │ ├── zutil.h
│ │ └── 文件概览.txt
│ ├── curl/
│ │ ├── CurlClient.cpp
│ │ ├── CurlClient.h
│ │ ├── curl.h
│ │ ├── curlver.h
│ │ ├── easy.h
│ │ ├── libcurl.lib
│ │ ├── libcurl.so.4.5.0
│ │ ├── mprintf.h
│ │ ├── multi.h
│ │ ├── stdcheaders.h
│ │ ├── system.h
│ │ ├── typecheck-gcc.h
│ │ └── urlapi.h
│ └── 包分片逻辑.cpp
├── Chapter07/
│ ├── codes/
│ │ ├── timerV1/
│ │ │ ├── Timer.cpp
│ │ │ ├── Timer.h
│ │ │ ├── TimerManager.cpp
│ │ │ └── TimerManager.h
│ │ ├── timerV2/
│ │ │ ├── Timer.cpp
│ │ │ ├── Timer.h
│ │ │ ├── TimerManager.cpp
│ │ │ └── TimerManager.h
│ │ └── timerV3/
│ │ ├── Timer.cpp
│ │ ├── Timer.h
│ │ ├── TimerManager.cpp
│ │ └── TimerManager.h
│ └── redis-6.0.3/
│ ├── .github/
│ │ └── workflows/
│ │ ├── ci.yml
│ │ └── daily.yml
│ ├── .gitignore
│ ├── 00-RELEASENOTES
│ ├── BUGS
│ ├── CONTRIBUTING
│ ├── COPYING
│ ├── INSTALL
│ ├── MANIFESTO
│ ├── Makefile
│ ├── README.md
│ ├── TLS.md
│ ├── deps/
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── hiredis/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── CHANGELOG.md
│ │ │ ├── CMakeLists.txt
│ │ │ ├── COPYING
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── adapters/
│ │ │ │ ├── ae.h
│ │ │ │ ├── glib.h
│ │ │ │ ├── ivykis.h
│ │ │ │ ├── libev.h
│ │ │ │ ├── libevent.h
│ │ │ │ ├── libuv.h
│ │ │ │ ├── macosx.h
│ │ │ │ └── qt.h
│ │ │ ├── appveyor.yml
│ │ │ ├── async.c
│ │ │ ├── async.h
│ │ │ ├── async_private.h
│ │ │ ├── dict.c
│ │ │ ├── dict.h
│ │ │ ├── examples/
│ │ │ │ ├── CMakeLists.txt
│ │ │ │ ├── example-ae.c
│ │ │ │ ├── example-glib.c
│ │ │ │ ├── example-ivykis.c
│ │ │ │ ├── example-libev.c
│ │ │ │ ├── example-libevent-ssl.c
│ │ │ │ ├── example-libevent.c
│ │ │ │ ├── example-libuv.c
│ │ │ │ ├── example-macosx.c
│ │ │ │ ├── example-qt.cpp
│ │ │ │ ├── example-qt.h
│ │ │ │ ├── example-ssl.c
│ │ │ │ └── example.c
│ │ │ ├── fmacros.h
│ │ │ ├── hiredis.c
│ │ │ ├── hiredis.h
│ │ │ ├── hiredis.pc.in
│ │ │ ├── hiredis_ssl.h
│ │ │ ├── hiredis_ssl.pc.in
│ │ │ ├── net.c
│ │ │ ├── net.h
│ │ │ ├── read.c
│ │ │ ├── read.h
│ │ │ ├── sds.c
│ │ │ ├── sds.h
│ │ │ ├── sdsalloc.h
│ │ │ ├── sockcompat.c
│ │ │ ├── sockcompat.h
│ │ │ ├── ssl.c
│ │ │ ├── test.c
│ │ │ ├── test.sh
│ │ │ └── win32.h
│ │ ├── jemalloc/
│ │ │ ├── .appveyor.yml
│ │ │ ├── .autom4te.cfg
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── COPYING
│ │ │ ├── ChangeLog
│ │ │ ├── INSTALL.md
│ │ │ ├── Makefile.in
│ │ │ ├── README
│ │ │ ├── TUNING.md
│ │ │ ├── autogen.sh
│ │ │ ├── bin/
│ │ │ │ ├── jemalloc-config.in
│ │ │ │ ├── jemalloc.sh.in
│ │ │ │ └── jeprof.in
│ │ │ ├── build-aux/
│ │ │ │ ├── config.guess
│ │ │ │ ├── config.sub
│ │ │ │ └── install-sh
│ │ │ ├── config.stamp.in
│ │ │ ├── configure.ac
│ │ │ ├── doc/
│ │ │ │ ├── html.xsl.in
│ │ │ │ ├── jemalloc.xml.in
│ │ │ │ ├── manpages.xsl.in
│ │ │ │ └── stylesheet.xsl
│ │ │ ├── include/
│ │ │ │ ├── jemalloc/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ ├── arena_externs.h
│ │ │ │ │ │ ├── arena_inlines_a.h
│ │ │ │ │ │ ├── arena_inlines_b.h
│ │ │ │ │ │ ├── arena_stats.h
│ │ │ │ │ │ ├── arena_structs_a.h
│ │ │ │ │ │ ├── arena_structs_b.h
│ │ │ │ │ │ ├── arena_types.h
│ │ │ │ │ │ ├── assert.h
│ │ │ │ │ │ ├── atomic.h
│ │ │ │ │ │ ├── atomic_c11.h
│ │ │ │ │ │ ├── atomic_gcc_atomic.h
│ │ │ │ │ │ ├── atomic_gcc_sync.h
│ │ │ │ │ │ ├── atomic_msvc.h
│ │ │ │ │ │ ├── background_thread_externs.h
│ │ │ │ │ │ ├── background_thread_inlines.h
│ │ │ │ │ │ ├── background_thread_structs.h
│ │ │ │ │ │ ├── base_externs.h
│ │ │ │ │ │ ├── base_inlines.h
│ │ │ │ │ │ ├── base_structs.h
│ │ │ │ │ │ ├── base_types.h
│ │ │ │ │ │ ├── bin.h
│ │ │ │ │ │ ├── bin_stats.h
│ │ │ │ │ │ ├── bit_util.h
│ │ │ │ │ │ ├── bitmap.h
│ │ │ │ │ │ ├── cache_bin.h
│ │ │ │ │ │ ├── ckh.h
│ │ │ │ │ │ ├── ctl.h
│ │ │ │ │ │ ├── div.h
│ │ │ │ │ │ ├── emitter.h
│ │ │ │ │ │ ├── extent_dss.h
│ │ │ │ │ │ ├── extent_externs.h
│ │ │ │ │ │ ├── extent_inlines.h
│ │ │ │ │ │ ├── extent_mmap.h
│ │ │ │ │ │ ├── extent_structs.h
│ │ │ │ │ │ ├── extent_types.h
│ │ │ │ │ │ ├── hash.h
│ │ │ │ │ │ ├── hooks.h
│ │ │ │ │ │ ├── jemalloc_internal_decls.h
│ │ │ │ │ │ ├── jemalloc_internal_defs.h.in
│ │ │ │ │ │ ├── jemalloc_internal_externs.h
│ │ │ │ │ │ ├── jemalloc_internal_includes.h
│ │ │ │ │ │ ├── jemalloc_internal_inlines_a.h
│ │ │ │ │ │ ├── jemalloc_internal_inlines_b.h
│ │ │ │ │ │ ├── jemalloc_internal_inlines_c.h
│ │ │ │ │ │ ├── jemalloc_internal_macros.h
│ │ │ │ │ │ ├── jemalloc_internal_types.h
│ │ │ │ │ │ ├── jemalloc_preamble.h.in
│ │ │ │ │ │ ├── large_externs.h
│ │ │ │ │ │ ├── log.h
│ │ │ │ │ │ ├── malloc_io.h
│ │ │ │ │ │ ├── mutex.h
│ │ │ │ │ │ ├── mutex_pool.h
│ │ │ │ │ │ ├── mutex_prof.h
│ │ │ │ │ │ ├── nstime.h
│ │ │ │ │ │ ├── pages.h
│ │ │ │ │ │ ├── ph.h
│ │ │ │ │ │ ├── private_namespace.sh
│ │ │ │ │ │ ├── private_symbols.sh
│ │ │ │ │ │ ├── prng.h
│ │ │ │ │ │ ├── prof_externs.h
│ │ │ │ │ │ ├── prof_inlines_a.h
│ │ │ │ │ │ ├── prof_inlines_b.h
│ │ │ │ │ │ ├── prof_structs.h
│ │ │ │ │ │ ├── prof_types.h
│ │ │ │ │ │ ├── public_namespace.sh
│ │ │ │ │ │ ├── public_unnamespace.sh
│ │ │ │ │ │ ├── ql.h
│ │ │ │ │ │ ├── qr.h
│ │ │ │ │ │ ├── rb.h
│ │ │ │ │ │ ├── rtree.h
│ │ │ │ │ │ ├── rtree_tsd.h
│ │ │ │ │ │ ├── size_classes.sh
│ │ │ │ │ │ ├── smoothstep.h
│ │ │ │ │ │ ├── smoothstep.sh
│ │ │ │ │ │ ├── spin.h
│ │ │ │ │ │ ├── stats.h
│ │ │ │ │ │ ├── sz.h
│ │ │ │ │ │ ├── tcache_externs.h
│ │ │ │ │ │ ├── tcache_inlines.h
│ │ │ │ │ │ ├── tcache_structs.h
│ │ │ │ │ │ ├── tcache_types.h
│ │ │ │ │ │ ├── ticker.h
│ │ │ │ │ │ ├── tsd.h
│ │ │ │ │ │ ├── tsd_generic.h
│ │ │ │ │ │ ├── tsd_malloc_thread_cleanup.h
│ │ │ │ │ │ ├── tsd_tls.h
│ │ │ │ │ │ ├── tsd_types.h
│ │ │ │ │ │ ├── tsd_win.h
│ │ │ │ │ │ ├── util.h
│ │ │ │ │ │ └── witness.h
│ │ │ │ │ ├── jemalloc.sh
│ │ │ │ │ ├── jemalloc_defs.h.in
│ │ │ │ │ ├── jemalloc_macros.h.in
│ │ │ │ │ ├── jemalloc_mangle.sh
│ │ │ │ │ ├── jemalloc_protos.h.in
│ │ │ │ │ ├── jemalloc_rename.sh
│ │ │ │ │ └── jemalloc_typedefs.h.in
│ │ │ │ └── msvc_compat/
│ │ │ │ ├── C99/
│ │ │ │ │ ├── stdbool.h
│ │ │ │ │ └── stdint.h
│ │ │ │ ├── strings.h
│ │ │ │ └── windows_extra.h
│ │ │ ├── jemalloc.pc.in
│ │ │ ├── m4/
│ │ │ │ └── ax_cxx_compile_stdcxx.m4
│ │ │ ├── msvc/
│ │ │ │ ├── ReadMe.txt
│ │ │ │ ├── jemalloc_vc2015.sln
│ │ │ │ ├── jemalloc_vc2017.sln
│ │ │ │ ├── projects/
│ │ │ │ │ ├── vc2015/
│ │ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ │ ├── jemalloc.vcxproj
│ │ │ │ │ │ │ └── jemalloc.vcxproj.filters
│ │ │ │ │ │ └── test_threads/
│ │ │ │ │ │ ├── test_threads.vcxproj
│ │ │ │ │ │ └── test_threads.vcxproj.filters
│ │ │ │ │ └── vc2017/
│ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ ├── jemalloc.vcxproj
│ │ │ │ │ │ └── jemalloc.vcxproj.filters
│ │ │ │ │ └── test_threads/
│ │ │ │ │ ├── test_threads.vcxproj
│ │ │ │ │ └── test_threads.vcxproj.filters
│ │ │ │ └── test_threads/
│ │ │ │ ├── test_threads.cpp
│ │ │ │ ├── test_threads.h
│ │ │ │ └── test_threads_main.cpp
│ │ │ ├── run_tests.sh
│ │ │ ├── scripts/
│ │ │ │ ├── gen_run_tests.py
│ │ │ │ └── gen_travis.py
│ │ │ ├── src/
│ │ │ │ ├── arena.c
│ │ │ │ ├── background_thread.c
│ │ │ │ ├── base.c
│ │ │ │ ├── bin.c
│ │ │ │ ├── bitmap.c
│ │ │ │ ├── ckh.c
│ │ │ │ ├── ctl.c
│ │ │ │ ├── div.c
│ │ │ │ ├── extent.c
│ │ │ │ ├── extent_dss.c
│ │ │ │ ├── extent_mmap.c
│ │ │ │ ├── hash.c
│ │ │ │ ├── hooks.c
│ │ │ │ ├── jemalloc.c
│ │ │ │ ├── jemalloc_cpp.cpp
│ │ │ │ ├── large.c
│ │ │ │ ├── log.c
│ │ │ │ ├── malloc_io.c
│ │ │ │ ├── mutex.c
│ │ │ │ ├── mutex_pool.c
│ │ │ │ ├── nstime.c
│ │ │ │ ├── pages.c
│ │ │ │ ├── prng.c
│ │ │ │ ├── prof.c
│ │ │ │ ├── rtree.c
│ │ │ │ ├── stats.c
│ │ │ │ ├── sz.c
│ │ │ │ ├── tcache.c
│ │ │ │ ├── ticker.c
│ │ │ │ ├── tsd.c
│ │ │ │ ├── witness.c
│ │ │ │ └── zone.c
│ │ │ └── test/
│ │ │ ├── include/
│ │ │ │ └── test/
│ │ │ │ ├── SFMT-alti.h
│ │ │ │ ├── SFMT-params.h
│ │ │ │ ├── SFMT-params11213.h
│ │ │ │ ├── SFMT-params1279.h
│ │ │ │ ├── SFMT-params132049.h
│ │ │ │ ├── SFMT-params19937.h
│ │ │ │ ├── SFMT-params216091.h
│ │ │ │ ├── SFMT-params2281.h
│ │ │ │ ├── SFMT-params4253.h
│ │ │ │ ├── SFMT-params44497.h
│ │ │ │ ├── SFMT-params607.h
│ │ │ │ ├── SFMT-params86243.h
│ │ │ │ ├── SFMT-sse2.h
│ │ │ │ ├── SFMT.h
│ │ │ │ ├── btalloc.h
│ │ │ │ ├── extent_hooks.h
│ │ │ │ ├── jemalloc_test.h.in
│ │ │ │ ├── jemalloc_test_defs.h.in
│ │ │ │ ├── math.h
│ │ │ │ ├── mq.h
│ │ │ │ ├── mtx.h
│ │ │ │ ├── test.h
│ │ │ │ ├── thd.h
│ │ │ │ └── timer.h
│ │ │ ├── integration/
│ │ │ │ ├── MALLOCX_ARENA.c
│ │ │ │ ├── aligned_alloc.c
│ │ │ │ ├── allocated.c
│ │ │ │ ├── extent.c
│ │ │ │ ├── extent.sh
│ │ │ │ ├── mallocx.c
│ │ │ │ ├── mallocx.sh
│ │ │ │ ├── overflow.c
│ │ │ │ ├── posix_memalign.c
│ │ │ │ ├── rallocx.c
│ │ │ │ ├── sdallocx.c
│ │ │ │ ├── thread_arena.c
│ │ │ │ ├── thread_tcache_enabled.c
│ │ │ │ ├── xallocx.c
│ │ │ │ └── xallocx.sh
│ │ │ ├── src/
│ │ │ │ ├── SFMT.c
│ │ │ │ ├── btalloc.c
│ │ │ │ ├── btalloc_0.c
│ │ │ │ ├── btalloc_1.c
│ │ │ │ ├── math.c
│ │ │ │ ├── mq.c
│ │ │ │ ├── mtx.c
│ │ │ │ ├── test.c
│ │ │ │ ├── thd.c
│ │ │ │ └── timer.c
│ │ │ ├── stress/
│ │ │ │ └── microbench.c
│ │ │ ├── test.sh.in
│ │ │ └── unit/
│ │ │ ├── SFMT.c
│ │ │ ├── a0.c
│ │ │ ├── arena_reset.c
│ │ │ ├── arena_reset_prof.c
│ │ │ ├── arena_reset_prof.sh
│ │ │ ├── atomic.c
│ │ │ ├── background_thread.c
│ │ │ ├── background_thread_enable.c
│ │ │ ├── base.c
│ │ │ ├── bit_util.c
│ │ │ ├── bitmap.c
│ │ │ ├── ckh.c
│ │ │ ├── decay.c
│ │ │ ├── decay.sh
│ │ │ ├── div.c
│ │ │ ├── emitter.c
│ │ │ ├── extent_quantize.c
│ │ │ ├── fork.c
│ │ │ ├── hash.c
│ │ │ ├── hooks.c
│ │ │ ├── junk.c
│ │ │ ├── junk.sh
│ │ │ ├── junk_alloc.c
│ │ │ ├── junk_alloc.sh
│ │ │ ├── junk_free.c
│ │ │ ├── junk_free.sh
│ │ │ ├── log.c
│ │ │ ├── mallctl.c
│ │ │ ├── malloc_io.c
│ │ │ ├── math.c
│ │ │ ├── mq.c
│ │ │ ├── mtx.c
│ │ │ ├── nstime.c
│ │ │ ├── pack.c
│ │ │ ├── pack.sh
│ │ │ ├── pages.c
│ │ │ ├── ph.c
│ │ │ ├── prng.c
│ │ │ ├── prof_accum.c
│ │ │ ├── prof_accum.sh
│ │ │ ├── prof_active.c
│ │ │ ├── prof_active.sh
│ │ │ ├── prof_gdump.c
│ │ │ ├── prof_gdump.sh
│ │ │ ├── prof_idump.c
│ │ │ ├── prof_idump.sh
│ │ │ ├── prof_reset.c
│ │ │ ├── prof_reset.sh
│ │ │ ├── prof_tctx.c
│ │ │ ├── prof_tctx.sh
│ │ │ ├── prof_thread_name.c
│ │ │ ├── prof_thread_name.sh
│ │ │ ├── ql.c
│ │ │ ├── qr.c
│ │ │ ├── rb.c
│ │ │ ├── retained.c
│ │ │ ├── rtree.c
│ │ │ ├── size_classes.c
│ │ │ ├── slab.c
│ │ │ ├── smoothstep.c
│ │ │ ├── spin.c
│ │ │ ├── stats.c
│ │ │ ├── stats_print.c
│ │ │ ├── ticker.c
│ │ │ ├── tsd.c
│ │ │ ├── witness.c
│ │ │ ├── zero.c
│ │ │ └── zero.sh
│ │ ├── linenoise/
│ │ │ ├── .gitignore
│ │ │ ├── Makefile
│ │ │ ├── README.markdown
│ │ │ ├── example.c
│ │ │ ├── linenoise.c
│ │ │ └── linenoise.h
│ │ ├── lua/
│ │ │ ├── COPYRIGHT
│ │ │ ├── HISTORY
│ │ │ ├── INSTALL
│ │ │ ├── Makefile
│ │ │ ├── README
│ │ │ ├── doc/
│ │ │ │ ├── contents.html
│ │ │ │ ├── lua.1
│ │ │ │ ├── lua.css
│ │ │ │ ├── lua.html
│ │ │ │ ├── luac.1
│ │ │ │ ├── luac.html
│ │ │ │ ├── manual.css
│ │ │ │ ├── manual.html
│ │ │ │ └── readme.html
│ │ │ ├── etc/
│ │ │ │ ├── Makefile
│ │ │ │ ├── README
│ │ │ │ ├── all.c
│ │ │ │ ├── lua.hpp
│ │ │ │ ├── lua.pc
│ │ │ │ ├── luavs.bat
│ │ │ │ ├── min.c
│ │ │ │ ├── noparser.c
│ │ │ │ └── strict.lua
│ │ │ ├── src/
│ │ │ │ ├── Makefile
│ │ │ │ ├── fpconv.c
│ │ │ │ ├── fpconv.h
│ │ │ │ ├── lapi.c
│ │ │ │ ├── lapi.h
│ │ │ │ ├── lauxlib.c
│ │ │ │ ├── lauxlib.h
│ │ │ │ ├── lbaselib.c
│ │ │ │ ├── lcode.c
│ │ │ │ ├── lcode.h
│ │ │ │ ├── ldblib.c
│ │ │ │ ├── ldebug.c
│ │ │ │ ├── ldebug.h
│ │ │ │ ├── ldo.c
│ │ │ │ ├── ldo.h
│ │ │ │ ├── ldump.c
│ │ │ │ ├── lfunc.c
│ │ │ │ ├── lfunc.h
│ │ │ │ ├── lgc.c
│ │ │ │ ├── lgc.h
│ │ │ │ ├── linit.c
│ │ │ │ ├── liolib.c
│ │ │ │ ├── llex.c
│ │ │ │ ├── llex.h
│ │ │ │ ├── llimits.h
│ │ │ │ ├── lmathlib.c
│ │ │ │ ├── lmem.c
│ │ │ │ ├── lmem.h
│ │ │ │ ├── loadlib.c
│ │ │ │ ├── lobject.c
│ │ │ │ ├── lobject.h
│ │ │ │ ├── lopcodes.c
│ │ │ │ ├── lopcodes.h
│ │ │ │ ├── loslib.c
│ │ │ │ ├── lparser.c
│ │ │ │ ├── lparser.h
│ │ │ │ ├── lstate.c
│ │ │ │ ├── lstate.h
│ │ │ │ ├── lstring.c
│ │ │ │ ├── lstring.h
│ │ │ │ ├── lstrlib.c
│ │ │ │ ├── ltable.c
│ │ │ │ ├── ltable.h
│ │ │ │ ├── ltablib.c
│ │ │ │ ├── ltm.c
│ │ │ │ ├── ltm.h
│ │ │ │ ├── lua.c
│ │ │ │ ├── lua.h
│ │ │ │ ├── lua_bit.c
│ │ │ │ ├── lua_cjson.c
│ │ │ │ ├── lua_cmsgpack.c
│ │ │ │ ├── lua_struct.c
│ │ │ │ ├── luac.c
│ │ │ │ ├── luaconf.h
│ │ │ │ ├── lualib.h
│ │ │ │ ├── lundump.c
│ │ │ │ ├── lundump.h
│ │ │ │ ├── lvm.c
│ │ │ │ ├── lvm.h
│ │ │ │ ├── lzio.c
│ │ │ │ ├── lzio.h
│ │ │ │ ├── print.c
│ │ │ │ ├── strbuf.c
│ │ │ │ └── strbuf.h
│ │ │ └── test/
│ │ │ ├── README
│ │ │ ├── bisect.lua
│ │ │ ├── cf.lua
│ │ │ ├── echo.lua
│ │ │ ├── env.lua
│ │ │ ├── factorial.lua
│ │ │ ├── fib.lua
│ │ │ ├── fibfor.lua
│ │ │ ├── globals.lua
│ │ │ ├── hello.lua
│ │ │ ├── life.lua
│ │ │ ├── luac.lua
│ │ │ ├── printf.lua
│ │ │ ├── readonly.lua
│ │ │ ├── sieve.lua
│ │ │ ├── sort.lua
│ │ │ ├── table.lua
│ │ │ ├── trace-calls.lua
│ │ │ ├── trace-globals.lua
│ │ │ └── xd.lua
│ │ └── update-jemalloc.sh
│ ├── redis.conf
│ ├── runtest
│ ├── runtest-cluster
│ ├── runtest-moduleapi
│ ├── runtest-sentinel
│ ├── sentinel.conf
│ ├── src/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── acl.c
│ │ ├── adlist.c
│ │ ├── adlist.h
│ │ ├── ae.c
│ │ ├── ae.h
│ │ ├── ae_epoll.c
│ │ ├── ae_evport.c
│ │ ├── ae_kqueue.c
│ │ ├── ae_select.c
│ │ ├── anet.c
│ │ ├── anet.h
│ │ ├── aof.c
│ │ ├── asciilogo.h
│ │ ├── atomicvar.h
│ │ ├── bio.c
│ │ ├── bio.h
│ │ ├── bitops.c
│ │ ├── blocked.c
│ │ ├── childinfo.c
│ │ ├── cluster.c
│ │ ├── cluster.h
│ │ ├── config.c
│ │ ├── config.h
│ │ ├── connection.c
│ │ ├── connection.h
│ │ ├── connhelpers.h
│ │ ├── crc16.c
│ │ ├── crc16_slottable.h
│ │ ├── crc64.c
│ │ ├── crc64.h
│ │ ├── crcspeed.c
│ │ ├── crcspeed.h
│ │ ├── db.c
│ │ ├── debug.c
│ │ ├── debugmacro.h
│ │ ├── defrag.c
│ │ ├── dict.c
│ │ ├── dict.h
│ │ ├── endianconv.c
│ │ ├── endianconv.h
│ │ ├── evict.c
│ │ ├── expire.c
│ │ ├── fmacros.h
│ │ ├── geo.c
│ │ ├── geo.h
│ │ ├── geohash.c
│ │ ├── geohash.h
│ │ ├── geohash_helper.c
│ │ ├── geohash_helper.h
│ │ ├── gopher.c
│ │ ├── help.h
│ │ ├── hyperloglog.c
│ │ ├── intset.c
│ │ ├── intset.h
│ │ ├── latency.c
│ │ ├── latency.h
│ │ ├── lazyfree.c
│ │ ├── listpack.c
│ │ ├── listpack.h
│ │ ├── listpack_malloc.h
│ │ ├── localtime.c
│ │ ├── lolwut.c
│ │ ├── lolwut.h
│ │ ├── lolwut5.c
│ │ ├── lolwut6.c
│ │ ├── lzf.h
│ │ ├── lzfP.h
│ │ ├── lzf_c.c
│ │ ├── lzf_d.c
│ │ ├── memtest.c
│ │ ├── mkreleasehdr.sh
│ │ ├── module.c
│ │ ├── modules/
│ │ │ ├── .gitignore
│ │ │ ├── Makefile
│ │ │ ├── gendoc.rb
│ │ │ ├── helloacl.c
│ │ │ ├── helloblock.c
│ │ │ ├── hellocluster.c
│ │ │ ├── hellodict.c
│ │ │ ├── hellohook.c
│ │ │ ├── hellotimer.c
│ │ │ ├── hellotype.c
│ │ │ ├── helloworld.c
│ │ │ └── testmodule.c
│ │ ├── multi.c
│ │ ├── networking.c
│ │ ├── notify.c
│ │ ├── object.c
│ │ ├── pqsort.c
│ │ ├── pqsort.h
│ │ ├── pubsub.c
│ │ ├── quicklist.c
│ │ ├── quicklist.h
│ │ ├── rand.c
│ │ ├── rand.h
│ │ ├── rax.c
│ │ ├── rax.h
│ │ ├── rax_malloc.h
│ │ ├── rdb.c
│ │ ├── rdb.h
│ │ ├── redis-benchmark.c
│ │ ├── redis-check-aof.c
│ │ ├── redis-check-rdb.c
│ │ ├── redis-cli.c
│ │ ├── redis-trib.rb
│ │ ├── redisassert.h
│ │ ├── redismodule.h
│ │ ├── release.c
│ │ ├── replication.c
│ │ ├── rio.c
│ │ ├── rio.h
│ │ ├── scripting.c
│ │ ├── sds.c
│ │ ├── sds.h
│ │ ├── sdsalloc.h
│ │ ├── sentinel.c
│ │ ├── server.c
│ │ ├── server.h
│ │ ├── setcpuaffinity.c
│ │ ├── setproctitle.c
│ │ ├── sha1.c
│ │ ├── sha1.h
│ │ ├── sha256.c
│ │ ├── sha256.h
│ │ ├── siphash.c
│ │ ├── slowlog.c
│ │ ├── slowlog.h
│ │ ├── solarisfixes.h
│ │ ├── sort.c
│ │ ├── sparkline.c
│ │ ├── sparkline.h
│ │ ├── stream.h
│ │ ├── syncio.c
│ │ ├── t_hash.c
│ │ ├── t_list.c
│ │ ├── t_set.c
│ │ ├── t_stream.c
│ │ ├── t_string.c
│ │ ├── t_zset.c
│ │ ├── testhelp.h
│ │ ├── timeout.c
│ │ ├── tls.c
│ │ ├── tracking.c
│ │ ├── util.c
│ │ ├── util.h
│ │ ├── valgrind.sup
│ │ ├── version.h
│ │ ├── ziplist.c
│ │ ├── ziplist.h
│ │ ├── zipmap.c
│ │ ├── zipmap.h
│ │ ├── zmalloc.c
│ │ └── zmalloc.h
│ ├── tests/
│ │ ├── assets/
│ │ │ ├── default.conf
│ │ │ ├── encodings.rdb
│ │ │ └── hash-zipmap.rdb
│ │ ├── cluster/
│ │ │ ├── cluster.tcl
│ │ │ ├── run.tcl
│ │ │ ├── tests/
│ │ │ │ ├── 00-base.tcl
│ │ │ │ ├── 01-faildet.tcl
│ │ │ │ ├── 02-failover.tcl
│ │ │ │ ├── 03-failover-loop.tcl
│ │ │ │ ├── 04-resharding.tcl
│ │ │ │ ├── 05-slave-selection.tcl
│ │ │ │ ├── 06-slave-stop-cond.tcl
│ │ │ │ ├── 07-replica-migration.tcl
│ │ │ │ ├── 08-update-msg.tcl
│ │ │ │ ├── 09-pubsub.tcl
│ │ │ │ ├── 10-manual-failover.tcl
│ │ │ │ ├── 11-manual-takeover.tcl
│ │ │ │ ├── 12-replica-migration-2.tcl
│ │ │ │ ├── 13-no-failover-option.tcl
│ │ │ │ ├── 14-consistency-check.tcl
│ │ │ │ ├── 15-cluster-slots.tcl
│ │ │ │ ├── helpers/
│ │ │ │ │ └── onlydots.tcl
│ │ │ │ └── includes/
│ │ │ │ └── init-tests.tcl
│ │ │ └── tmp/
│ │ │ └── .gitignore
│ │ ├── helpers/
│ │ │ ├── bg_block_op.tcl
│ │ │ ├── bg_complex_data.tcl
│ │ │ └── gen_write_load.tcl
│ │ ├── instances.tcl
│ │ ├── integration/
│ │ │ ├── aof-race.tcl
│ │ │ ├── aof.tcl
│ │ │ ├── block-repl.tcl
│ │ │ ├── convert-zipmap-hash-on-load.tcl
│ │ │ ├── logging.tcl
│ │ │ ├── psync2-pingoff.tcl
│ │ │ ├── psync2-reg.tcl
│ │ │ ├── psync2.tcl
│ │ │ ├── rdb.tcl
│ │ │ ├── redis-cli.tcl
│ │ │ ├── replication-2.tcl
│ │ │ ├── replication-3.tcl
│ │ │ ├── replication-4.tcl
│ │ │ ├── replication-psync.tcl
│ │ │ └── replication.tcl
│ │ ├── modules/
│ │ │ ├── Makefile
│ │ │ ├── auth.c
│ │ │ ├── blockonkeys.c
│ │ │ ├── commandfilter.c
│ │ │ ├── datatype.c
│ │ │ ├── fork.c
│ │ │ ├── hooks.c
│ │ │ ├── infotest.c
│ │ │ ├── misc.c
│ │ │ ├── propagate.c
│ │ │ ├── scan.c
│ │ │ └── testrdb.c
│ │ ├── sentinel/
│ │ │ ├── run.tcl
│ │ │ ├── tests/
│ │ │ │ ├── 00-base.tcl
│ │ │ │ ├── 01-conf-update.tcl
│ │ │ │ ├── 02-slaves-reconf.tcl
│ │ │ │ ├── 03-runtime-reconf.tcl
│ │ │ │ ├── 04-slave-selection.tcl
│ │ │ │ ├── 05-manual.tcl
│ │ │ │ ├── 06-ckquorum.tcl
│ │ │ │ ├── 07-down-conditions.tcl
│ │ │ │ └── includes/
│ │ │ │ └── init-tests.tcl
│ │ │ └── tmp/
│ │ │ └── .gitignore
│ │ ├── support/
│ │ │ ├── cli.tcl
│ │ │ ├── cluster.tcl
│ │ │ ├── redis.tcl
│ │ │ ├── server.tcl
│ │ │ ├── test.tcl
│ │ │ ├── tmpfile.tcl
│ │ │ └── util.tcl
│ │ ├── test_helper.tcl
│ │ └── unit/
│ │ ├── acl.tcl
│ │ ├── aofrw.tcl
│ │ ├── auth.tcl
│ │ ├── bitfield.tcl
│ │ ├── bitops.tcl
│ │ ├── dump.tcl
│ │ ├── expire.tcl
│ │ ├── geo.tcl
│ │ ├── hyperloglog.tcl
│ │ ├── introspection-2.tcl
│ │ ├── introspection.tcl
│ │ ├── keyspace.tcl
│ │ ├── latency-monitor.tcl
│ │ ├── lazyfree.tcl
│ │ ├── limits.tcl
│ │ ├── maxmemory.tcl
│ │ ├── memefficiency.tcl
│ │ ├── moduleapi/
│ │ │ ├── auth.tcl
│ │ │ ├── blockonkeys.tcl
│ │ │ ├── commandfilter.tcl
│ │ │ ├── datatype.tcl
│ │ │ ├── fork.tcl
│ │ │ ├── hooks.tcl
│ │ │ ├── infotest.tcl
│ │ │ ├── misc.tcl
│ │ │ ├── propagate.tcl
│ │ │ ├── scan.tcl
│ │ │ └── testrdb.tcl
│ │ ├── multi.tcl
│ │ ├── obuf-limits.tcl
│ │ ├── other.tcl
│ │ ├── pendingquerybuf.tcl
│ │ ├── printver.tcl
│ │ ├── protocol.tcl
│ │ ├── pubsub.tcl
│ │ ├── quit.tcl
│ │ ├── scan.tcl
│ │ ├── scripting.tcl
│ │ ├── slowlog.tcl
│ │ ├── sort.tcl
│ │ ├── tls.tcl
│ │ ├── tracking.tcl
│ │ ├── type/
│ │ │ ├── hash.tcl
│ │ │ ├── incr.tcl
│ │ │ ├── list-2.tcl
│ │ │ ├── list-3.tcl
│ │ │ ├── list-common.tcl
│ │ │ ├── list.tcl
│ │ │ ├── set.tcl
│ │ │ ├── stream-cgroups.tcl
│ │ │ ├── stream.tcl
│ │ │ ├── string.tcl
│ │ │ └── zset.tcl
│ │ └── wait.tcl
│ └── utils/
│ ├── build-static-symbols.tcl
│ ├── cluster_fail_time.tcl
│ ├── corrupt_rdb.c
│ ├── create-cluster/
│ │ ├── .gitignore
│ │ ├── README
│ │ └── create-cluster
│ ├── gen-test-certs.sh
│ ├── generate-command-help.rb
│ ├── graphs/
│ │ └── commits-over-time/
│ │ ├── README.md
│ │ └── genhtml.tcl
│ ├── hashtable/
│ │ ├── README
│ │ └── rehashing.c
│ ├── hyperloglog/
│ │ ├── .gitignore
│ │ ├── hll-err.rb
│ │ └── hll-gnuplot-graph.rb
│ ├── install_server.sh
│ ├── lru/
│ │ ├── README
│ │ ├── lfu-simulation.c
│ │ └── test-lru.rb
│ ├── redis-copy.rb
│ ├── redis-sha1.rb
│ ├── redis_init_script
│ ├── redis_init_script.tpl
│ ├── releasetools/
│ │ ├── 01_create_tarball.sh
│ │ ├── 02_upload_tarball.sh
│ │ ├── 03_test_release.sh
│ │ ├── 04_release_hash.sh
│ │ └── changelog.tcl
│ ├── speed-regression.tcl
│ ├── srandmember/
│ │ ├── README.md
│ │ ├── showdist.rb
│ │ └── showfreq.rb
│ ├── systemd-redis_multiple_servers@.service
│ ├── systemd-redis_server.service
│ ├── tracking_collisions.c
│ └── whatisdoing.sh
├── Chapter09/
│ └── code/
│ ├── AsyncLogger/
│ │ ├── AsyncLogger.cpp
│ │ ├── AsyncLogger.sln
│ │ ├── AsyncLogger.vcxproj
│ │ ├── AsyncLogger.vcxproj.filters
│ │ ├── stdafx.cpp
│ │ ├── stdafx.h
│ │ └── targetver.h
│ ├── AsyncLogger1/
│ │ ├── AsyncLogger.cpp
│ │ ├── AsyncLogger.sln
│ │ ├── AsyncLogger.vcxproj
│ │ ├── AsyncLogger.vcxproj.filters
│ │ ├── stdafx.cpp
│ │ ├── stdafx.h
│ │ └── targetver.h
│ ├── AsyncLoggerLinux.cpp
│ └── AsyncLoggerWindows/
│ ├── AsyncLogger.cpp
│ ├── AsyncLogger.sln
│ ├── AsyncLogger.vcxproj
│ ├── AsyncLogger.vcxproj.filters
│ ├── stdafx.cpp
│ ├── stdafx.h
│ └── targetver.h
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.DS_Store
Chapter01/.DS_Store
Chapter02/.DS_Store
Chapter03/.DS_Store
Chapter04/.DS_Store
Chapter06/.DS_Store
Chapter07/.DS_Store
Chapter09/.DS_Store
图书勘误/图书勘误.docx
图书勘误/~$图书勘误.docx
================================================
FILE: Chapter01/codes/TestRAII1/ReadMe.txt
================================================
========================================================================
CONSOLE APPLICATION : TestRAII1 Project Overview
========================================================================
AppWizard has created this TestRAII1 application for you.
This file contains a summary of what you will find in each of the files that
make up your TestRAII1 application.
TestRAII1.vcxproj
This is the main project file for VC++ projects generated using an Application Wizard.
It contains information about the version of Visual C++ that generated the file, and
information about the platforms, configurations, and project features selected with the
Application Wizard.
TestRAII1.vcxproj.filters
This is the filters file for VC++ projects generated using an Application Wizard.
It contains information about the association between the files in your project
and the filters. This association is used in the IDE to show grouping of files with
similar extensions under a specific node (for e.g. ".cpp" files are associated with the
"Source Files" filter).
TestRAII1.cpp
This is the main application source file.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named TestRAII1.pch and a precompiled types file named StdAfx.obj.
/////////////////////////////////////////////////////////////////////////////
Other notes:
AppWizard uses "TODO:" comments to indicate parts of the source code you
should add to or customize.
/////////////////////////////////////////////////////////////////////////////
================================================
FILE: Chapter01/codes/TestRAII1/TestRAII1.cpp
================================================
// #include <winsock2.h>
// #include <stdio.h>
// //链接Windows的socket库
// #pragma comment(lib, "ws2_32.lib")
// int main(int argc, char* argv[])
// {
// //初始化socket库
// WORD wVersionRequested = MAKEWORD(2, 2);
// WSADATA wsaData;
// int err = WSAStartup(wVersionRequested, &wsaData);
// if (err != 0)
// return 1;
// if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
// {
// WSACleanup();
// return 1;
// }
// //创建用于监听的套接字
// SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
// if (sockSrv == -1)
// {
// WSACleanup();
// return 1;
// }
// SOCKADDR_IN addrSrv;
// addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
// addrSrv.sin_family = AF_INET;
// addrSrv.sin_port = htons(6000);
// //绑定套接字,监听6000端口
// if (bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == -1)
// {
// closesocket(sockSrv);
// WSACleanup();
// return 1;
// }
// //启动监听,准备接受客户请求
// if (listen(sockSrv, 15) == -1)
// {
// closesocket(sockSrv);
// WSACleanup();
// return 1;
// }
// SOCKADDR_IN addrClient;
// int len = sizeof(SOCKADDR);
// char msg[] = "HelloWorld";
// while (true)
// {
// //等待客户请求到来,如果有客户端连接,则接受连接
// SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
// if (sockClient == -1)
// break;
// //给客户端发送”HelloWorld“消息
// send(sockClient, msg, strlen(msg), 0);
// closesocket(sockClient);
// }// end while-loop
// closesocket(sockSrv);
// WSACleanup();
// return 0;
// }
//
// char* p = new char[1024];
// if (操作1不成功)
// {
// delete[] p;
// p = NULL;
// return;
// }
// if (操作2不成功)
// {
// delete[] p;
// p = NULL;
// return;
// }
// if (操作3不成功)
// {
// delete[] p;
// p = NULL;
// return;
// }
// delete[] p;
// p = NULL;
================================================
FILE: Chapter01/codes/TestRAII1/TestRAII1.sln
================================================
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30501.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestRAII1", "TestRAII1.vcxproj", "{3EC68362-A282-4B6E-A541-53C23746CAFA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3EC68362-A282-4B6E-A541-53C23746CAFA}.Debug|Win32.ActiveCfg = Debug|Win32
{3EC68362-A282-4B6E-A541-53C23746CAFA}.Debug|Win32.Build.0 = Debug|Win32
{3EC68362-A282-4B6E-A541-53C23746CAFA}.Release|Win32.ActiveCfg = Release|Win32
{3EC68362-A282-4B6E-A541-53C23746CAFA}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
================================================
FILE: Chapter01/codes/TestRAII1/TestRAII1.vcxproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{3EC68362-A282-4B6E-A541-53C23746CAFA}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>TestRAII1</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="TestRAII1.cpp" />
<ClCompile Include="TestRAII2.cpp" />
<ClCompile Include="TestRAII3.cpp" />
<ClCompile Include="TestRAII4.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
================================================
FILE: Chapter01/codes/TestRAII1/TestRAII1.vcxproj.filters
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TestRAII1.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TestRAII2.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TestRAII3.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TestRAII4.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
================================================
FILE: Chapter01/codes/TestRAII1/TestRAII2.cpp
================================================
// #include "stdafx.h"
// #include <winsock2.h>
// #include <stdio.h>
// //链接Windows的socket库
// #pragma comment(lib, "ws2_32.lib")
// int main(int argc, char* argv[])
// {
// //由于goto语句不能跳过变量声明,
// //所以提前定义下文需要用到的变量
// SOCKET sockSrv;
// SOCKADDR_IN addrSrv;
// SOCKADDR_IN addrClient;
// int len = sizeof(SOCKADDR);
// char msg[] = "HelloWorld";
// //初始化socket库
// WORD wVersionRequested = MAKEWORD(2, 2);
// WSADATA wsaData;
// int err = WSAStartup(wVersionRequested, &wsaData);
// if (err != 0)
// return 1;
// if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
// {
// goto cleanup2;
// return 1;
// }
// //创建用于监听的套接字
// sockSrv = socket(AF_INET, SOCK_STREAM, 0);
// if (sockSrv == -1)
// {
// goto cleanup2;
// return 1;
// }
// addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
// addrSrv.sin_family = AF_INET;
// addrSrv.sin_port = htons(6000);
// //绑定套接字,监听6000端口
// if (bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == -1)
// {
// goto cleanup1;
// return 1;
// }
// //启动监听,准备接受客户请求
// if (listen(sockSrv, 15) == -1)
// {
// goto cleanup1;
// return 1;
// }
// while (true)
// {
// //等待客户请求到来,如果有客户端连接,则接受连接
// SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
// if (sockClient == -1)
// break;
// //给客户端发送”HelloWorld“消息
// send(sockClient, msg, strlen(msg), 0);
// closesocket(sockClient);
// }// end while-loop
// cleanup1:
// closesocket(sockSrv);
// cleanup2:
// WSACleanup();
// return 0;
// }
//
////char* p = new char[1024];
////
////if (²Ù×÷1²»³É¹¦)
////{
//// delete[] p;
//// p = NULL;
//// return;
////}
////
////if (²Ù×÷2²»³É¹¦)
////{
//// delete[] p;
//// p = NULL;
//// return;
////}
////
////if (²Ù×÷3²»³É¹¦)
////{
//// delete[] p;
//// p = NULL;
//// return;
////}
////
////delete[] p;
////p = NULL;
================================================
FILE: Chapter01/codes/TestRAII1/TestRAII3.cpp
================================================
#include "stdafx.h"
//#include <winsock2.h>
//#include <stdio.h>
//
////Windowssocket
//#pragma comment(lib, "ws2_32.lib")
//
//int main(int argc, char* argv[])
//{
// //ֿ
// WORD wVersionRequested = MAKEWORD(2, 2);
// WSADATA wsaData;
// int err = WSAStartup(wVersionRequested, &wsaData);
// if (err != 0)
// return 1;
//
// SOCKET sockSrv = -1;
// do
// {
// if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
// break;
//
// //ڼ
// sockSrv = socket(AF_INET, SOCK_STREAM, 0);
// if (sockSrv == -1)
// break;
//
// SOCKADDR_IN addrSrv;
// addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
// addrSrv.sin_family = AF_INET;
// addrSrv.sin_port = htons(6000);
// //֣6000˿ϼ
// if (bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == -1)
// break;
//
// //Ϊģʽܿͻ
// if (listen(sockSrv, 15) == -1)
// break;
//
// SOCKADDR_IN addrClient;
// int len = sizeof(SOCKADDR);
// char msg[] = "HelloWorld";
// while (true)
// {
// //ȴͻпͻӣ
// SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
// //ͻ˷HelloWorld
// send(sockClient, msg, strlen(msg), 0);
// closesocket(sockClient);
// }// end inner-while-loop
// } while (0); //end outer-while-loop
//
//
// if (sockSrv != -1)
// closesocket(sockSrv);
//
// WSACleanup();
//
// return 0;
//}
//
////char* p = new char[1024];
////
////if (1ɹ)
////{
//// delete[] p;
//// p = NULL;
//// return;
////}
////
////if (2ɹ)
////{
//// delete[] p;
//// p = NULL;
//// return;
////}
////
////if (3ɹ)
////{
//// delete[] p;
//// p = NULL;
//// return;
////}
////
////delete[] p;
////p = NULL;
//
//
//#include "stdafx.h"
//#include <winsock2.h>
//#include <stdio.h>
//
////Windowssocket
//#pragma comment(lib, "ws2_32.lib")
//
//int main(int argc, char* argv[])
//{
// //ֿ
// WORD wVersionRequested = MAKEWORD(1, 1);
// WSADATA wsaData;
// int err = WSAStartup(wVersionRequested, &wsaData);
// if (err != 0)
// return 1;
//
// SOCKET sockSrv = -1;
// do
// {
// if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
// break;
//
// //ڼ
// sockSrv = socket(AF_INET, SOCK_STREAM, 0);
// if (sockSrv == -1)
// break;
//
// SOCKADDR_IN addrSrv;
// addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
// addrSrv.sin_family = AF_INET;
// addrSrv.sin_port = htons(6000);
// //֣6000˿ϼ
// if (bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == -1)
// break;
//
// //Ϊģʽܿͻ
// if (listen(sockSrv, 15) == -1)
// break;
//
// SOCKADDR_IN addrClient;
// int len = sizeof(SOCKADDR);
// char msg[] = "HelloWorld";
// while (true)
// {
// //ȴͻпͻӣ
// SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
// //ͻ˷HelloWorld
// send(sockClient, msg, strlen(msg), 0);
// closesocket(sockClient);
// }// end inner-while-loop
// } while (0); //end outer-while-loop
//
//
// if (sockSrv != -1)
// closesocket(sockSrv);
//
// WSACleanup();
//
// return 0;
//}
//
//char* p = NULL;
//do
//{
// p = new char[1024];
// if (1ɹ)
// break;
//
// if (2ɹ)
// break;
//
// if (3ɹ)
// break;
//} while (0);
//
//delete[] p;
//p = NULL;
================================================
FILE: Chapter01/codes/TestRAII1/TestRAII4.cpp
================================================
#include <winsock2.h>
#include <stdio.h>
//链接Windows的socket库
#pragma comment(lib, "ws2_32.lib")
class ServerSocket
{
public:
ServerSocket()
{
m_bInit = false;
m_ListenSocket = -1;
}
~ServerSocket()
{
if (m_ListenSocket != -1)
::closesocket(m_ListenSocket);
if (m_bInit)
::WSACleanup();
}
bool DoInit()
{
//初始化socket库
WORD wVersionRequested = MAKEWORD(2, 2);
WSADATA wsaData;
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
return false;
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
return false;
m_bInit = true;
//创建用于监听的套接字
m_ListenSocket = socket(AF_INET, SOCK_STREAM, 0);
if (m_ListenSocket == -1)
return false;
return true;
}
bool DoBind(const char* ip, short port = 6000)
{
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr(ip);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(port);
if (::bind(m_ListenSocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == -1)
return false;
return true;
}
bool DoListen(int backlog = 15)
{
if (listen(m_ListenSocket, backlog) == -1)
return false;
return true;
}
bool DoAccept()
{
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char msg[] = "HelloWorld";
while (true)
{
//等待客户请求到来,如果有客户端连接,则接受连接
SOCKET sockClient = accept(m_ListenSocket, (SOCKADDR*)&addrClient, &len);
if (sockClient == -1)
break;
//给客户端发送”HelloWorld“消息
send(sockClient, msg, strlen(msg), 0);
closesocket(sockClient);
}// end inner-while-loop
return false;
}
private:
bool m_bInit;
SOCKET m_ListenSocket;
};
int main(int argc, char* argv[])
{
ServerSocket serverSocket;
if (!serverSocket.DoInit())
return false;
if (!serverSocket.DoBind("0.0.0.0", 6000))
return false;
if (!serverSocket.DoListen(15))
return false;
if (!serverSocket.DoAccept())
return false;
return 0;
}
// void SomeFunction()
// {
// 得到某把锁;
// if (条件1)
// {
// if (条件2)
// {
// 某些操作1
// 释放锁;
// return;
// }
// else (条件3)
// {
// 某些操作2
// 释放锁;
// return;
// }
// }
// if (条件3)
// {
// 某些操作3
// 释放锁;
// return;
// }
// 某些操作4
// 释放锁;
// }
// class SomeLockGuard
// {
// public:
// SomeLockGuard()
// {
// //加锁
// m_lock.lock();
// }
// ~SomeLockGuard()
// {
// //解锁
// m_lock.unlock();
// }
// private:
// SomeLock m_lock;
// };
// void SomeFunction()
// {
// SomeLockGuard lockWrapper;
// if (条件1)
// {
// if (条件2)
// {
// 某些操作1
// return;
// }
// else (条件3)
// {
// 某些操作2
// return;
// }
// }
// if (条件3)
// {
// 某些操作3
// return;
// }
// 某些操作4
// }
================================================
FILE: Chapter01/codes/TestRAII1/stdafx.cpp
================================================
// stdafx.cpp : source file that includes just the standard includes
// TestRAII1.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
================================================
FILE: Chapter01/codes/TestRAII1/stdafx.h
================================================
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here
================================================
FILE: Chapter01/codes/TestRAII1/targetver.h
================================================
#pragma once
// Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#include <SDKDDKVer.h>
================================================
FILE: Chapter01/codes/construct_complex_objects.cpp
================================================
// construct_complex_objects.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
#include <initializer_list>
#include <vector>
#include <sstream>
//简单地模拟 json 支持的几种数据类型
enum class jsonType
{
jsonTypeNull,
jsonTypeInt,
jsonTypeLong,
jsonTypeDouble,
jsonTypeBool,
jsonTypeString,
jsonTypeArray,
jsonTypeObject
};
struct jsonNode
{
jsonNode(const char* key, const char* value) :
m_type(jsonType::jsonTypeString),
m_key(key),
m_value(value)
{
std::cout << "jsonNode contructor1 called." << std::endl;
}
jsonNode(const char* key, double value) :
m_type(jsonType::jsonTypeString),
m_key(key),
m_value(std::to_string(value))
{
std::cout << "jsonNode contructor2 called." << std::endl;
}
jsonType m_type;
std::string m_key;
std::string m_value;
};
class json
{
public:
static json& array(std::initializer_list<jsonNode> nodes)
{
m_json.m_nodes.clear();
m_json.m_nodes.insert(m_json.m_nodes.end(), nodes.begin(), nodes.end());
std::cout << "json::array() called." << std::endl;
return m_json;
}
json()
{
}
~json()
{
}
std::string toString()
{
std::ostringstream os;
size_t size = m_nodes.size();
for (size_t i = 0; i < size; ++i)
{
switch (m_nodes[i].m_type)
{
//根据类型,组装成一个json字符串,代码省略...
case jsonType::jsonTypeDouble:
break;
}
}
}
private:
std::vector<jsonNode> m_nodes;
static json m_json;
};
json json::m_json;
int main()
{
json array_not_object = json::array({ {"currency", "USD"}, {"value", 42.99} });
return 0;
}
================================================
FILE: Chapter01/codes/test_auto_ptr.cpp
================================================
// test_auto_ptr.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <memory>
int main()
{
//Կ
std::auto_ptr<int> sp1(new int(8));
std::auto_ptr<int> sp2(sp1);
if (sp1.get() != NULL)
{
std::cout << "sp1 is not empty." << std::endl;
}
else
{
std::cout << "sp1 is empty." << std::endl;
}
if (sp2.get() != NULL)
{
std::cout << "sp2 is not empty." << std::endl;
}
else
{
std::cout << "sp2 is empty." << std::endl;
}
// operator=
std::auto_ptr<int> sp3(new int(8));
std::auto_ptr<int> sp4;
sp4 = sp3;
if (sp3.get() != NULL)
{
std::cout << "sp3 is not empty." << std::endl;
}
else
{
std::cout << "sp3 is empty." << std::endl;
}
if (sp4.get() != NULL)
{
std::cout << "sp4 is not empty." << std::endl;
}
else
{
std::cout << "sp4 is empty." << std::endl;
}
return 0;
}
================================================
FILE: Chapter01/codes/test_custom_foreach_loop.cpp
================================================
#include <iostream>
#include <string>
template<typename T, size_t N>
class A
{
public:
A()
{
for (size_t i = 0; i < N; ++i)
{
m_elements[i] = i;
}
}
~A()
{
}
T* begin()
{
return m_elements + 0;
}
T* end()
{
return m_elements + N;
}
private:
T m_elements[N];
};
int main()
{
A<int, 10> a;
for (auto iter : a)
{
std::cout << iter << std::endl;
}
return 0;
}
================================================
FILE: Chapter01/codes/test_initializer_list.cpp
================================================
#include <iostream>
#include <initializer_list>
#include <vector>
class A
{
public:
A(std::initializer_list<int> integers)
{
m_vecIntegers.insert(m_vecIntegers.end(), integers.begin(), integers.end());
}
~A()
{
}
void append(std::initializer_list<int> integers)
{
m_vecIntegers.insert(m_vecIntegers.end(), integers.begin(), integers.end());
}
void print()
{
size_t size = m_vecIntegers.size();
for (size_t i = 0; i < size; ++i)
{
std::cout << m_vecIntegers[i] << std::endl;
}
}
private:
std::vector<int> m_vecIntegers;
};
int main()
{
A a{ 1, 2, 3 };
a.print();
std::cout << "After appending..." << std::endl;
a.append({ 4, 5, 6 });
a.print();
return 0;
}
================================================
FILE: Chapter01/codes/test_map_insert_or_assign.cpp
================================================
/**
* std::map::try_emplace÷ʾ
* zhangyl 2019.10.06
*/
#include <iostream>
#include <map>
class ChatDialog
{
//ʵʡ...
public:
ChatDialog(int64_t userid) : m_userid(userid)
{
std::cout << "ChatDialog constructor" << std::endl;
}
~ChatDialog()
{
std::cout << "ChatDialog destructor" << std::endl;
}
void activate()
{
//ʵʡ
}
private:
int64_t m_userid;
};
//ڹԻmapkeyǺidvalueChatDialogԻָ
std::map<int64_t, ChatDialog> m_ChatDialogs;
//C++ 17汾3
void onDoubleClickFriendItem3(int64_t userid)
{
//ṹtry_emplace C++17
auto [iter, inserted] = m_ChatDialogs.try_emplace(userid, userid);
iter->second.activate();
}
//int main()
//{
// //
// //906106643 userid
// onDoubleClickFriendItem3(906106643L);
// //906106644 userid
// onDoubleClickFriendItem3(906106644L);
// //906106643 userid
// onDoubleClickFriendItem3(906106643L);
//
// return 0;
//}
int main()
{
std::map<std::string, int> mapUsersAge{ { "Alex", 45 }, { "John", 25 } };
mapUsersAge.insert_or_assign("Tom", 26);
mapUsersAge.insert_or_assign("Alex", 27);
for (const auto& [userName, userAge] : mapUsersAge)
{
std::cout << "userName: " << userName << ", userAge: " << userAge << std::endl;
}
}
================================================
FILE: Chapter01/codes/test_map_try_emplace.cpp
================================================
// test_map_try_emplace.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <map>
class ChatDialog
{
//ʵʡ...
public:
void activate()
{
//ʵʡ
}
};
//ڹԻmapkeyǺidChatDialogԻָ
std::map<int64_t, ChatDialog*> m_ChatDialogs;
//ͨ汾
void onDoubleClickFriendItem(int64_t userid)
{
auto targetChatDialog = m_ChatDialogs.find(userid);
//ѶԻڣ֮
if (targetChatDialog == m_ChatDialogs.end())
{
ChatDialog* pChatDialog = new ChatDialog();
m_ChatDialogs.insert(std::pair<int64_t, ChatDialog*>(userid, pChatDialog));
pChatDialog->activate();
}
//ѶԻڣֱӼ
else
{
targetChatDialog->second->activate();
}
}
//C++ 17汾1
void onDoubleClickFriendItem2(int64_t userid)
{
//ṹtry_emplace C++17
auto [iter, inserted] = m_ChatDialogs.try_emplace(userid);
if (inserted)
iter->second = new ChatDialog();
iter->second->activate();
}
int main()
{
//
//906106643 userid
onDoubleClickFriendItem2(906106643L);
//906106644 userid
onDoubleClickFriendItem2(906106644L);
//906106643 userid
onDoubleClickFriendItem2(906106643L);
return 0;
}
================================================
FILE: Chapter01/codes/test_map_try_emplace_with_directobject.cpp
================================================
/**
* std::map::try_emplace÷ʾ
* zhangyl 2019.10.06
*/
#include <iostream>
#include <map>
class ChatDialog
{
//ʵʡ...
public:
ChatDialog(int64_t userid) : m_userid(userid)
{
std::cout << "ChatDialog constructor" << std::endl;
}
~ChatDialog()
{
std::cout << "ChatDialog destructor" << std::endl;
}
void activate()
{
//ʵʡ
}
private:
int64_t m_userid;
};
//ڹԻmapkeyǺidvalueChatDialogԻָ
std::map<int64_t, ChatDialog> m_ChatDialogs;
//C++ 17汾3
void onDoubleClickFriendItem3(int64_t userid)
{
//ṹtry_emplace C++17
auto [iter, inserted] = m_ChatDialogs.try_emplace(userid, userid);
iter->second.activate();
}
int main()
{
//
//906106643 userid
onDoubleClickFriendItem3(906106643L);
//906106644 userid
onDoubleClickFriendItem3(906106644L);
//906106643 userid
onDoubleClickFriendItem3(906106643L);
return 0;
}
================================================
FILE: Chapter01/codes/test_map_try_emplace_with_smartpointer.cpp
================================================
/**
* std::map::try_emplace÷ʾ
* zhangyl 2019.10.06
*/
#include <iostream>
#include <map>
#include <memory>
class ChatDialog
{
//ʵʡ...
public:
ChatDialog()
{
std::cout << "ChatDialog constructor" << std::endl;
}
~ChatDialog()
{
std::cout << "ChatDialog destructor" << std::endl;
}
void activate()
{
//ʵʡ
}
};
//ڹԻmapkeyǺidvalueChatDialogԻָ
std::map<int64_t, std::unique_ptr<ChatDialog>> m_ChatDialogs;
//C++ 17汾2
void onDoubleClickFriendItem3(int64_t userid)
{
//ṹtry_emplace C++17
auto spChatDialog = std::make_unique<ChatDialog>();
auto [iter, inserted] = m_ChatDialogs.try_emplace(userid, std::move(spChatDialog));
iter->second->activate();
}
int main()
{
//
//906106643 userid
onDoubleClickFriendItem3(906106643L);
//906106644 userid
onDoubleClickFriendItem3(906106644L);
//906106643 userid
onDoubleClickFriendItem3(906106643L);
return 0;
}
================================================
FILE: Chapter01/codes/test_map_try_emplace_with_smartpointer2.cpp
================================================
/**
* std::map::try_emplace÷ʾ
* zhangyl 2019.10.06
*/
#include <iostream>
#include <map>
#include <memory>
class ChatDialog
{
//ʵʡ...
public:
ChatDialog()
{
std::cout << "ChatDialog constructor" << std::endl;
}
~ChatDialog()
{
std::cout << "ChatDialog destructor" << std::endl;
}
void activate()
{
//ʵʡ
}
};
//ڹԻmapkeyǺidvalueChatDialogԻָ
std::map<int64_t, std::unique_ptr<ChatDialog>> m_ChatDialogs;
//C++ 17汾3
void onDoubleClickFriendItem3(int64_t userid)
{
//ṹtry_emplace C++17
auto [iter, inserted] = m_ChatDialogs.try_emplace(userid, nullptr);
if (inserted)
{
//Ͱ贴
auto spChatDialog = std::make_unique<ChatDialog>();
iter->second = std::move(spChatDialog);
}
iter->second->activate();
}
int main()
{
//
//906106643 userid
onDoubleClickFriendItem3(906106643L);
//906106644 userid
onDoubleClickFriendItem3(906106644L);
//906106643 userid
onDoubleClickFriendItem3(906106643L);
return 0;
}
================================================
FILE: Chapter01/codes/test_shared_ptr_use_count.cpp
================================================
// test_shared_ptr.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <memory>
class A
{
public:
A()
{
std::cout << "A constructor" << std::endl;
}
~A()
{
std::cout << "A destructor" << std::endl;
}
};
int main()
{
{
//ʼʽ1
std::shared_ptr<A> sp1(new A());
std::cout << "use count: " << sp1.use_count() << std::endl;
//ʼʽ2
std::shared_ptr<A> sp2(sp1);
std::cout << "use count: " << sp1.use_count() << std::endl;
sp2.reset();
std::cout << "use count: " << sp1.use_count() << std::endl;
{
std::shared_ptr<A> sp3 = sp1;
std::cout << "use count: " << sp1.use_count() << std::endl;
}
std::cout << "use count: " << sp1.use_count() << std::endl;
}
return 0;
}
================================================
FILE: Chapter01/codes/test_std_enable_shared_from_this.cpp
================================================
// test_std_enable_shared_from_this.cpp
#include <iostream>
#include <memory>
class A : public std::enable_shared_from_this<A>
{
public:
A()
{
std::cout << "A constructor" << std::endl;
}
~A()
{
std::cout << "A destructor" << std::endl;
}
std::shared_ptr<A> getSelf()
{
return shared_from_this();
}
};
int main()
{
std::shared_ptr<A> sp1(new A());
std::shared_ptr<A> sp2 = sp1->getSelf();
std::cout << "use count: " << sp1.use_count() << std::endl;
return 0;
}
================================================
FILE: Chapter01/codes/test_std_enable_shared_from_this_problem.cpp
================================================
// test_std_enable_shared_from_this.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <memory>
class A : public std::enable_shared_from_this<A>
{
public:
A()
{
m_i = 9;
//ע:
//ȽϺõڹ캯shared_from_this()m_SelfPtrֵ
//Ǻźô,дڹ캯ֱӱ
std::cout << "A constructor" << std::endl;
}
~A()
{
m_i = 0;
std::cout << "A destructor" << std::endl;
}
void func()
{
m_SelfPtr = shared_from_this();
}
public:
int m_i;
std::shared_ptr<A> m_SelfPtr;
};
int main()
{
{
std::shared_ptr<A> spa(new A());
spa->func();
}
return 0;
}
================================================
FILE: Chapter01/codes/test_unique_ptr.cpp
================================================
// test_unique_ptr.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <memory>
int main()
{
//10int͵ĶѶ
//ʽ1
std::unique_ptr<int[]> sp1(new int[10]);
//ʽ2
std::unique_ptr<int[]> sp2;
sp2.reset(new int[10]);
//ʽ3
std::unique_ptr<int[]> sp3(std::make_unique<int[]>(10));
for (int i = 0; i < 10; ++i)
{
sp1[i] = i;
sp2[i] = i;
sp3[i] = i;
}
for (int i = 0; i < 10; ++i)
{
std::cout << sp1[i] << ", " << sp2[i] << ", " << sp3[i] << std::endl;
}
return 0;
}
================================================
FILE: Chapter01/codes/test_unique_ptr_deletor.cpp
================================================
#include <iostream>
#include <memory>
class Socket
{
public:
Socket()
{
}
~Socket()
{
}
//رԴ
void close()
{
}
};
int main()
{
auto deletor = [](Socket* pSocket) {
//رվ
pSocket->close();
//TODO: ӡһ־...
delete pSocket;
};
//std::unique_ptr<Socket, void(*)(Socket * pSocket)> spSocket(new Socket(), deletor);
std::unique_ptr<Socket, decltype(deletor)> spSocket(new Socket(), deletor);
return 0;
}
================================================
FILE: Chapter01/codes/test_unique_ptr_with_array.cpp
================================================
#include <iostream>
#include <memory>
int main()
{
//创建10个int类型的堆对象
//形式1
std::unique_ptr<int[]> sp1(new int[10]);
//形式2
std::unique_ptr<int[]> sp2;
sp2.reset(new int[10]);
//形式3
std::unique_ptr<int[]> sp3(std::make_unique<int[]>(10));
for (int i = 0; i < 10; ++i)
{
sp1[i] = i;
sp2[i] = i;
sp3[i] = i;
}
for (int i = 0; i < 10; ++i)
{
std::cout << sp1[i] << ", " << sp2[i] << ", " << sp3[i] << std::endl;
}
return 0;
}
================================================
FILE: Chapter01/codes/test_weak_ptr.cpp
================================================
// test_weak_ptr.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <memory>
int main()
{
//һstd::shared_ptr
std::shared_ptr<int> sp1(new int(123));
std::cout << "use count: " << sp1.use_count() << std::endl;
//ͨ캯õһstd::weak_ptr
std::weak_ptr<int> sp2(sp1);
std::cout << "use count: " << sp1.use_count() << std::endl;
//ֵͨõһstd::weak_ptr
std::weak_ptr<int> sp3 = sp1;
std::cout << "use count: " << sp1.use_count() << std::endl;
//ͨһstd::weak_ptrõһstd::weak_ptr
std::weak_ptr<int> sp4 = sp2;
std::cout << "use count: " << sp1.use_count() << std::endl;
return 0;
}
================================================
FILE: Chapter02/VisualGDB 下载与安装.md
================================================
# VisualGDB 下载与安装
## VisualGDB 官网
```
https://visualgdb.com/
```
## 网络上流传的破解版
> 链接: https://pan.baidu.com/s/1RlefT8_bXIpqlKrWTNP4bg 密码: ojto
================================================
FILE: Chapter02/cgdb下载与安装.md
================================================
# cgdb 下载与安装
**下载地址**
```
http://cgdb.github.io/
```
下载完 cgdb 之后,进入 cgdb 目录,执行:
```
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
```
**出现错误:**
```
configure: error: CGDB requires curses.h or ncurses/curses.h to build.
```
解决方案:
```
yum install ncurses-devel
```
**出现错误:**
```
configure: error: Please install makeinfo before installing
```
解决方案:
```
yum install texinfo
```
如果是 CentOS 8.0 及以上系统,需要先执行:
```
yum config-manager --set-enabled PowerTools
```
**出现错误:**
```
configure: error: Please install help2man
```
解决方案:
```
yum install help2man
```
**出现错误:**
```
configure: error: CGDB requires GNU readline 5.1 or greater to link.
If you used --with-readline instead of using the system readline library,
make sure to set the correct readline library on the linker search path
via LD_LIBRARY_PATH or some other facility.
```
解决方案:
```
yum install readline-devel
```
**出现错误:**
```
configure: error: Please install flex before installing
```
解决方案:
```
yum install flex
```
================================================
FILE: Chapter02/codes/main.cpp
================================================
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
long g = 0;
void* worker_thread_1(void* p)
{
while (true)
{
g = 100;
printf("worker_thread_1\n");
usleep(300000);
}
return NULL;
}
void* worker_thread_2(void* p)
{
while (true)
{
g = -100;
printf("worker_thread_2\n");
usleep(500000);
}
return NULL;
}
int main()
{
pthread_t thread_id_1;
pthread_create(&thread_id_1, NULL, worker_thread_1, NULL);
pthread_t thread_id_2;
pthread_create(&thread_id_2, NULL, worker_thread_2, NULL);
while (true)
{
g = -1;
printf("g=%d\n", g);
g = -2;
printf("g=%d\n", g);
g = -3;
printf("g=%d\n", g);
g = -4;
printf("g=%d\n", g);
usleep(1000000);
}
return 0;
}
================================================
FILE: Chapter02/redis-6.0.3/.github/workflows/ci.yml
================================================
name: CI
on: [push, pull_request]
jobs:
test-ubuntu-latest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: make
run: make
- name: test
run: |
sudo apt-get install tcl8.5
./runtest --verbose
- name: module api test
run: ./runtest-moduleapi --verbose
build-ubuntu-old:
runs-on: ubuntu-16.04
steps:
- uses: actions/checkout@v1
- name: make
run: make
build-macos-latest:
runs-on: macos-latest
steps:
- uses: actions/checkout@v1
- name: make
run: make
================================================
FILE: Chapter02/redis-6.0.3/.github/workflows/daily.yml
================================================
name: Daily
on:
schedule:
- cron: '0 7 * * *'
jobs:
test-jemalloc:
runs-on: ubuntu-latest
timeout-minutes: 1200
steps:
- uses: actions/checkout@v1
- name: make
run: make
- name: test
run: |
sudo apt-get install tcl8.5
./runtest --accurate --verbose
- name: module api test
run: ./runtest-moduleapi --verbose
test-libc-malloc:
runs-on: ubuntu-latest
timeout-minutes: 1200
steps:
- uses: actions/checkout@v1
- name: make
run: make MALLOC=libc
- name: test
run: |
sudo apt-get install tcl8.5
./runtest --accurate --verbose
- name: module api test
run: ./runtest-moduleapi --verbose
test-valgrind:
runs-on: ubuntu-latest
timeout-minutes: 14400
steps:
- uses: actions/checkout@v1
- name: make
run: make valgrind
- name: test
run: |
sudo apt-get install tcl8.5 valgrind -y
./runtest --valgrind --verbose --clients 1
- name: module api test
run: ./runtest-moduleapi --valgrind --verbose --clients 1
================================================
FILE: Chapter02/redis-6.0.3/.gitignore
================================================
.*.swp
*.o
*.xo
*.so
*.d
*.log
dump.rdb
redis-benchmark
redis-check-aof
redis-check-rdb
redis-check-dump
redis-cli
redis-sentinel
redis-server
doc-tools
release
misc/*
src/release.h
appendonly.aof
SHORT_TERM_TODO
release.h
src/transfer.sh
src/configs
redis.ds
src/redis.conf
src/nodes.conf
deps/lua/src/lua
deps/lua/src/luac
deps/lua/src/liblua.a
.make-*
.prerequisites
*.dSYM
Makefile.dep
.vscode/*
.idea/*
================================================
FILE: Chapter02/redis-6.0.3/00-RELEASENOTES
================================================
Redis 6.0 release notes
=======================
--------------------------------------------------------------------------------
Upgrade urgency levels:
LOW: No need to upgrade unless there are new features you want to use.
MODERATE: Program an upgrade of the server, but it's not urgent.
HIGH: There is a critical bug that may affect a subset of users. Upgrade!
CRITICAL: There is a critical bug affecting MOST USERS. Upgrade ASAP.
SECURITY: There are security fixes in the release.
--------------------------------------------------------------------------------
================================================================================
Redis 6.0.3 Released Sat May 16 18:10:21 CEST 2020
================================================================================
Upgrade urgency CRITICAL: a crash introduced in 6.0.2 is now fixed.
1eab62f7e Remove the client from CLOSE_ASAP list before caching the master.
================================================================================
Redis 6.0.2 Released Fri May 15 22:24:36 CEST 2020
================================================================================
Upgrade urgency MODERATE: many not critical bugfixes in different areas.
Critical fix to client side caching when
keys are evicted from the tracking table but
no notifications are sent.
The following are the most serious fix:
* XPENDING should not update consumer's seen-time
* optimize memory usage of deferred replies - fixed
* Fix CRC64 initialization outside the Redis server itself.
* stringmatchlen() should not expect null terminated strings.
* Cluster nodes availability checks improved when there is
high Pub/Sub load on the cluster bus.
* Redis Benchmark: Fix coredump because of double free
* Tracking: send eviction messages when evicting entries.
* rax.c updated from upstream antirez/rax.
* fix redis 6.0 not freeing closed connections during loading.
New features:
* Support setcpuaffinity on linux/bsd
* Client Side Caching: Add Tracking Prefix Number Stats in Server Info
* Add --user argument to redis-benchmark.c (ACL)
Full list of commits:
Yossi Gottlieb in commit 16ba33c05:
TLS: Fix test failures on recent Debian/Ubuntu.
1 file changed, 20 deletions(-)
Yossi Gottlieb in commit 77ae66930:
TLS: Add crypto locks for older OpenSSL support.
1 file changed, 45 insertions(+)
David Carlier in commit 389697988:
NetBSD build update.
3 files changed, 30 insertions(+), 1 deletion(-)
Madelyn Olson in commit 2435341d7:
Added a refcount on timer events to prevent deletion of recursive timer calls
2 files changed, 12 insertions(+)
antirez in commit 80c906bd3:
Cache master without checking of deferred close flags.
3 files changed, 11 insertions(+), 8 deletions(-)
antirez in commit 74249be4a:
Track events processed while blocked globally.
5 files changed, 32 insertions(+), 17 deletions(-)
antirez in commit 8bf660af9:
Some rework of #7234.
4 files changed, 77 insertions(+), 65 deletions(-)
Oran Agra in commit 9da134cd8:
fix redis 6.0 not freeing closed connections during loading.
3 files changed, 133 insertions(+), 58 deletions(-)
antirez in commit f7f219a13:
Regression test for #7249.
1 file changed, 22 insertions(+)
antirez in commit 693629585:
rax.c updated from upstream antirez/rax.
1 file changed, 4 insertions(+), 2 deletions(-)
antirez in commit e3b5648df:
Tracking: send eviction messages when evicting entries.
2 files changed, 29 insertions(+), 12 deletions(-)
Oran Agra in commit 5c41802d5:
fix unstable replication test
1 file changed, 2 insertions(+), 2 deletions(-)
ShooterIT in commit a23cdbb94:
Redis Benchmark: Fix coredump because of double free
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 1276058ea:
Cluster: clarify we always resolve the sender.
1 file changed, 3 insertions(+), 1 deletion(-)
antirez in commit 002fcde3d:
Cluster: refactor ping/data delay handling.
1 file changed, 13 insertions(+), 11 deletions(-)
antirez in commit 960186a71:
Cluster: introduce data_received field.
2 files changed, 27 insertions(+), 10 deletions(-)
antirez in commit 3672875b4:
stringmatchlen() should not expect null terminated strings.
1 file changed, 2 insertions(+), 2 deletions(-)
Brad Dunbar in commit 24e12641d:
Remove unreachable branch.
1 file changed, 2 deletions(-)
hwware in commit c7edffbd5:
add jemalloc-bg-thread config in redis conf
1 file changed, 3 insertions(+)
hwware in commit 8a9c84f4a:
add include guard for lolwut.h
1 file changed, 6 insertions(+)
antirez in commit cb683a84f:
Don't propagate spurious MULTI on DEBUG LOADAOF.
2 files changed, 6 insertions(+), 3 deletions(-)
antirez in commit 84d9766d6:
Dump recent backlog on master query generating errors.
1 file changed, 29 insertions(+)
Titouan Christophe in commit ec1e106ec:
make struct user anonymous (only typedefed)
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit e48c37316:
Test: --dont-clean should do first cleanup.
1 file changed, 2 insertions(+), 5 deletions(-)
Benjamin Sergeant in commit 1e561cfaa:
Add --user argument to redis-benchmark.c (ACL)
1 file changed, 15 insertions(+), 2 deletions(-)
antirez in commit d1af82a88:
Drop not needed part from #7194.
1 file changed, 1 insertion(+), 1 deletion(-)
Muhammad Zahalqa in commit 897a360d0:
Fix compiler warnings on function rev(unsigned long)
1 file changed, 3 insertions(+), 3 deletions(-)
antirez in commit ac316d8cc:
Move CRC64 initialization in main().
2 files changed, 1 insertion(+), 4 deletions(-)
antirez in commit fc7bc3204:
Fix CRC64 initialization outside the Redis server itself.
1 file changed, 3 insertions(+)
hwware in commit a6e55c096:
Client Side Caching: Add Tracking Prefix Number Stats in Server Info
3 files changed, 8 insertions(+)
antirez in commit b062fd523:
Fix NetBSD build by fixing redis_set_thread_title() support.
1 file changed, 4 insertions(+), 1 deletion(-)
antirez in commit 4efb25d9c:
Rework a bit the documentation for CPU pinning.
2 files changed, 18 insertions(+), 8 deletions(-)
zhenwei pi in commit d6436eb7c:
Support setcpuaffinity on linux/bsd
12 files changed, 180 insertions(+), 1 deletion(-)
Guy Benoish in commit 3a441c7d9:
XPENDING should not update consumer's seen-time
4 files changed, 33 insertions(+), 20 deletions(-)
Oran Agra in commit 75addb4fe:
optimize memory usage of deferred replies - fixed
1 file changed, 29 insertions(+)
Deliang Yang in commit c57d9146f:
reformat code
1 file changed, 1 insertion(+), 1 deletion(-)
Oran Agra in commit 3d3861dd8:
add daily github actions with libc malloc and valgrind
5 files changed, 106 insertions(+), 18 deletions(-)
================================================================================
Redis 6.0.1 Released Sat May 02 00:06:07 CEST 2020
================================================================================
Upgrade urgency HIGH: This release fixes a crash when builiding against
Libc malloc.
Here we revert 8110ba888, an optimization that causes a crash due to a
bug in the code. It does not happen with the default allocator because of
differences between Jemalloc and libc malloc, so this escaped all our
testing but was reported by a user. We'll add back the original optimization
that was reverted here later, after checking what happens: it is not a
critical optimization.
The other commits are minor stuff:
antirez in commit db73d0998:
Cast printf() argument to the format specifier.
1 file changed, 3 insertions(+), 1 deletion(-)
antirez in commit 7c0fe7271:
Revert "optimize memory usage of deferred replies"
1 file changed, 31 deletions(-)
antirez in commit 8fe25edc7:
Save a call to stopThreadedIOIfNeeded() for the base case.
1 file changed, 3 insertions(+), 3 deletions(-)
================================================================================
Redis 6.0.0 GA Released Thu Apr 30 14:55:02 CEST 2020
================================================================================
Upgrade urgency CRITICAL: many bugs fixed compared to the last release
candidate. Better to upgrade if you see things
affecting your environment in the changelog.
Hi all, finally we have Redis 6.0.0 GA! Enjoy this new Redis release.
Most of the documentation was updated today so that you can likely
find what you are looking for about the new features at redis.io.
This is the list of what changed compared to the previoius release candidate:
* XCLAIM AOF/replicas propagation fixed.
* Client side caching: new NOLOOP option to avoid getting notified about
changes performed by ourselves.
* ACL GENPASS now uses HMAC-SHA256 and have an optional "bits" argument.
It means you can use it as a general purpose "secure random strings"
primitive!
* Cluster "SLOTS" subcommand memory optimization.
* The LCS command is now a subcommand of STRALGO.
* Meaningful offset for replicas as well. More successful partial
resynchronizations.
* Optimize memory usage of deferred replies.
* Faster CRC64 algorithm for faster RDB loading.
* XINFO STREAM FULL, a new subcommand to get the whole stream state.
* CLIENT KILL USER <username>.
* MIGRATE AUTH2 option, for ACL style authentication support.
* Other random bugfixes.
Enjoy Redis 6! :-)
Goodbye antirez
List of commits in this release:
antirez in commit 1f9b82bd5:
Update help.h again before Redis 6 GA.
1 file changed, 17 insertions(+), 12 deletions(-)
antirez in commit 3fcffe7d0:
redis-cli: fix hints with subcommands.
1 file changed, 2 insertions(+), 1 deletion(-)
antirez in commit 455d8a05c:
redis-cli command help updated.
1 file changed, 165 insertions(+), 25 deletions(-)
zhaozhao.zz in commit 70287bbc9:
lazyfree & eviction: record latency generated by lazyfree eviction
1 file changed, 18 insertions(+), 13 deletions(-)
antirez in commit 7be21139a:
MIGRATE AUTH2 for ACL support.
1 file changed, 19 insertions(+), 5 deletions(-)
antirez in commit e1ee1a49d:
CLIENT KILL USER <username>.
1 file changed, 11 insertions(+)
antirez in commit d56f058c0:
Fix tracking table max keys option in redis.conf.
1 file changed, 12 insertions(+), 9 deletions(-)
antirez in commit 96dd5fc93:
redis-cli: safer cluster fix with unreachalbe masters.
1 file changed, 26 insertions(+), 1 deletion(-)
antirez in commit 5b59d9c5d:
redis-cli: simplify cluster nodes coverage display.
1 file changed, 10 insertions(+), 17 deletions(-)
antirez in commit c163d4add:
redis-cli: try to make clusterManagerFixOpenSlot() more readable.
1 file changed, 25 insertions(+), 6 deletions(-)
Guy Benoish in commit aab74b715:
XINFO STREAM FULL should have a default COUNT of 10
1 file changed, 8 insertions(+), 4 deletions(-)
antirez in commit 606134f9d:
Comment clearly why we moved some code in #6623.
1 file changed, 4 insertions(+), 1 deletion(-)
srzhao in commit ee627bb66:
fix pipelined WAIT performance issue.
1 file changed, 13 insertions(+), 13 deletions(-)
antirez in commit 47b8a7f9b:
Fix create-cluster BIN_PATH.
1 file changed, 1 insertion(+), 1 deletion(-)
Guy Benoish in commit 6c0bc608a:
Extend XINFO STREAM output
2 files changed, 226 insertions(+), 34 deletions(-)
hwware in commit 5bfc18950:
Fix not used marco in cluster.c
1 file changed, 1 insertion(+), 1 deletion(-)
Itamar Haber in commit 56d628f85:
Update create-cluster
1 file changed, 1 insertion(+), 1 deletion(-)
Itamar Haber in commit cac9d7cf7:
Adds `BIN_PATH` to create-cluster
1 file changed, 8 insertions(+), 6 deletions(-)
Oran Agra in commit b712fba17:
hickup, re-fix dictEncObjKeyCompare
1 file changed, 4 insertions(+), 4 deletions(-)
Oran Agra in commit ea63aea72:
fix loading race in psync2 tests
3 files changed, 15 insertions(+), 1 deletion(-)
antirez in commit 64e588bfa:
Rework comment in dictEncObjKeyCompare().
1 file changed, 8 insertions(+), 9 deletions(-)
Oran Agra in commit 0d1e8c93b:
allow dictFind using static robj
1 file changed, 9 insertions(+), 4 deletions(-)
Madelyn Olson in commit a1bed447b:
Added crcspeed library
2 files changed, 341 insertions(+)
Madelyn Olson in commit a75fa3aad:
Made crc64 test consistent
1 file changed, 3 insertions(+), 2 deletions(-)
Madelyn Olson in commit 52c75e9db:
Implemented CRC64 based on slice by 4
5 files changed, 124 insertions(+), 157 deletions(-)
Oran Agra in commit 8110ba888:
optimize memory usage of deferred replies
1 file changed, 31 insertions(+)
Oran Agra in commit e4d2bb62b:
Keep track of meaningful replication offset in replicas too
5 files changed, 212 insertions(+), 92 deletions(-)
antirez in commit fea9788cc:
Fix STRALGO command flags.
1 file changed, 1 insertion(+), 1 deletion(-)
Dave-in-lafayette in commit 2144047e1:
fix for unintended crash during panic response
1 file changed, 1 insertion(+), 1 deletion(-)
Guy Benoish in commit 43329c9b6:
Add the stream tag to XSETID tests
1 file changed, 1 insertion(+), 1 deletion(-)
Dave-in-lafayette in commit 1e17d3de7:
fix for crash during panic before all threads are up
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 3722f89f4:
LCS -> STRALGO LCS.
4 files changed, 28 insertions(+), 15 deletions(-)
antirez in commit 373ae6061:
Also use propagate() in streamPropagateGroupID().
1 file changed, 11 insertions(+), 1 deletion(-)
yanhui13 in commit f03f1fad6:
add tcl test for cluster slots
1 file changed, 44 insertions(+)
yanhui13 in commit 374ffdf1c:
optimize the output of cluster slots
1 file changed, 7 insertions(+), 4 deletions(-)
antirez in commit 4db38d2ef:
Minor aesthetic changes to #7135.
1 file changed, 5 insertions(+), 7 deletions(-)
Valentino Geron in commit f0a261448:
XREADGROUP with NOACK should propagate only one XGROUP SETID command
1 file changed, 13 insertions(+), 7 deletions(-)
antirez in commit fbdef6a9b:
ACL: re-enable command execution of disabled users.
1 file changed, 4 deletions(-)
antirez in commit 05a41da75:
getRandomBytes(): use HMAC-SHA256.
1 file changed, 30 insertions(+), 10 deletions(-)
antirez in commit 345c3768d:
ACL GENPASS: take number of bits as argument.
1 file changed, 21 insertions(+), 6 deletions(-)
antirez in commit 639c8a1d9:
ACL GENPASS: emit 256 bits instead of 128.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 321acea03:
ACL: deny commands execution of disabled users.
1 file changed, 4 insertions(+)
Theo Buehler in commit b0920e6e8:
TLS: Fix build with SSL_OP_NO_CLIENT_RENEGOTIATION
1 file changed, 1 insertion(+), 1 deletion(-)
Yossi Gottlieb in commit 149b658b5:
TLS: Fix build on older verisons of OpenSSL.
1 file changed, 2 insertions(+)
antirez in commit 06917e581:
Tracking: test expired keys notifications.
1 file changed, 13 insertions(+)
antirez in commit e434b2ce4:
Tracking: NOLOOP tests.
1 file changed, 32 insertions(+)
antirez in commit f3a172887:
Tracking: signal key as modified when evicting.
1 file changed, 1 insertion(+)
antirez in commit e63bb7ec8:
Tracking: NOLOOP further implementation and fixes.
2 files changed, 21 insertions(+), 6 deletions(-)
antirez in commit 6791ff052:
Tracking: NOLOOP internals implementation.
17 files changed, 174 insertions(+), 112 deletions(-)
antirez in commit 725b8cc68:
Implement redis_set_thread_title for MacOS.
1 file changed, 6 insertions(+)
zhenwei pi in commit 3575b8706:
Threaded IO: set thread name for redis-server
3 files changed, 28 insertions(+)
antirez in commit a76c67578:
Sentinel: small refactoring of sentinelCollectTerminatedScripts().
1 file changed, 1 insertion(+), 2 deletions(-)
omg-by in commit 3a27064c4:
fix(sentinel): sentinel.running_scripts will always increase more times and not reset
1 file changed, 1 insertion(+)
antirez in commit 5c4c73e2c:
A few comments and name changes for #7103.
1 file changed, 13 insertions(+), 4 deletions(-)
Oran Agra in commit 6148f9493:
testsuite run the defrag latency test solo
3 files changed, 42 insertions(+), 2 deletions(-)
Jamie Scott in commit 51d3012d4:
Adding acllog-max-len to Redis.conf
1 file changed, 9 insertions(+)
antirez in commit c39f16c42:
Fix XCLAIM propagation in AOF/replicas for blocking XREADGROUP.
2 files changed, 8 insertions(+), 3 deletions(-)
================================================================================
Redis 6.0-rc4 Released Thu Apr 16 16:10:35 CEST 2020
================================================================================
Upgrade urgency LOW: If you are using RC3 without issues, don't rush.
Hi all, this the latest release candidate of Redis 6. This is likely to
be very similar to what you'll see in Redis 6 GA. Please test it and
report any issue :-)
Main changes in this release:
* Big INFO speedup when using a lot of of clients.
* Big speedup on all the blocking commands: now blocking
on the same key is O(1) instead of being O(N).
* Stale replicas now allow MULTI/EXEC.
* New command: LCS (Longest Common Subsequence).
* Add a new configuration to make DEL like UNLINK.
* RDB loading speedup.
* Many bugs fixed (see the commit messages at the end of this node)
See you in 14 days for Redis 6 GA.
List of commits:
antirez in commit 9f594e243:
Update SDS to latest version.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 48781dd95:
RESP3: fix HELLO map len in Sentinel mode.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 371ab0cff:
Don't allow empty spaces in ACL usernames.
1 file changed, 36 insertions(+), 8 deletions(-)
antirez in commit b86140ac5:
Don't allow empty spaces in ACL key patterns.
1 file changed, 12 insertions(+), 1 deletion(-)
liumiuyong in commit a7ee3c3e7:
FIX: truncate max/min longitude,latitude related geo_point (ex: {180, 85.05112878} )
1 file changed, 4 insertions(+)
Guy Benoish in commit e5b9eb817:
Typo in getTimeoutFromObjectOrReply's error reply
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 0f31bb5c1:
Fix HELLO reply in Sentinel mode, see #6160.
1 file changed, 1 insertion(+), 1 deletion(-)
hwware in commit b92d9a895:
fix spelling in acl.c
1 file changed, 2 insertions(+), 2 deletions(-)
antirez in commit 8f896e57a:
Fix zsetAdd() top comment spelling.
1 file changed, 3 insertions(+), 3 deletions(-)
hayleeliu in commit 8f5157058:
fix spelling mistake in bitops.c
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit ddeda9ceb:
Fix function names in zslDeleteNode() top comment.
1 file changed, 2 insertions(+), 1 deletion(-)
antirez in commit bde1f0a8e:
RESP3: change streams items from maps to arrays.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit bec68bff2:
Use the special static refcount for stack objects.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 0f239e51b:
RDB: refactor some RDB loading code into dbAddRDBLoad().
3 files changed, 22 insertions(+), 4 deletions(-)
antirez in commit f855db61b:
incrRefCount(): abort on statically allocated object.
2 files changed, 12 insertions(+), 2 deletions(-)
antirez in commit 23094ba01:
More powerful DEBUG RELOAD.
3 files changed, 55 insertions(+), 16 deletions(-)
antirez in commit 8161a7a3e:
RDB: clarify a condition in rdbLoadRio().
2 files changed, 9 insertions(+), 2 deletions(-)
antirez in commit 61b153073:
RDB: load files faster avoiding useless free+realloc.
7 files changed, 40 insertions(+), 28 deletions(-)
antirez in commit 414debfd0:
Speedup: unblock clients on keys in O(1).
4 files changed, 50 insertions(+), 23 deletions(-)
antirez in commit cbcd07777:
Fix ACL HELP table missing comma.
1 file changed, 12 insertions(+), 12 deletions(-)
mymilkbottles in commit 2437455f2:
Judge the log level in advance
1 file changed, 1 insertion(+)
antirez in commit 35c64b898:
Speedup INFO by counting client memory incrementally.
4 files changed, 52 insertions(+), 26 deletions(-)
qetu3790 in commit c3ac71748:
fix comments about RESIZE DB opcode in rdb.c
1 file changed, 1 insertion(+), 4 deletions(-)
antirez in commit c8dbcff9d:
Clarify redis.conf comment about lazyfree-lazy-user-del.
1 file changed, 9 insertions(+), 5 deletions(-)
zhaozhao.zz in commit abd5156f2:
lazyfree: add a new configuration lazyfree-lazy-user-del
4 files changed, 7 insertions(+), 2 deletions(-)
antirez in commit 5719b3054:
LCS: more tests.
1 file changed, 8 insertions(+)
antirez in commit c89e1f293:
LCS: allow KEYS / STRINGS to be anywhere.
1 file changed, 6 deletions(-)
antirez in commit 0b16f8d44:
LCS tests.
1 file changed, 22 insertions(+)
antirez in commit 9254a805d:
LCS: get rid of STOREIDX option. Fix get keys helper.
2 files changed, 20 insertions(+), 21 deletions(-)
antirez in commit a4c490703:
LCS: fix stale comment.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit cb92c23de:
LCS: output LCS len as well in IDX mode.
1 file changed, 6 insertions(+), 1 deletion(-)
antirez in commit 56a52e804:
LCS: MINMATCHLEN and WITHMATCHLEN options.
1 file changed, 24 insertions(+), 11 deletions(-)
antirez in commit ebb09a5c3:
LCS: 7x speedup by accessing the array with better locality.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit a9f8a8cba:
LCS: implement KEYS option.
1 file changed, 18 insertions(+), 2 deletions(-)
antirez in commit 4aa24e62a:
LCS: other fixes to range emission.
1 file changed, 20 insertions(+), 16 deletions(-)
antirez in commit 2b67b6b87:
LCS: fix emission of last range starting at index 0.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 420aac727:
LCS: implement range indexes option.
1 file changed, 59 insertions(+), 9 deletions(-)
antirez in commit a518a9a76:
LCS: initial functionality implemented.
4 files changed, 156 insertions(+), 1 deletion(-)
srzhao in commit 026cc11b0:
Check OOM at script start to get stable lua OOM state.
3 files changed, 11 insertions(+), 4 deletions(-)
Oran Agra in commit 02b594f6a:
diffrent fix for runtest --host --port
2 files changed, 13 insertions(+), 13 deletions(-)
Guy Benoish in commit f695d1830:
Try to fix time-sensitive tests in blockonkey.tcl
1 file changed, 54 insertions(+), 1 deletion(-)
Guy Benoish in commit 0e42cfc36:
Use __attribute__ only if __GNUC__ is defined
1 file changed, 12 insertions(+), 3 deletions(-)
Guy Benoish in commit 91ed9b3c4:
Modules: Perform printf-like format checks in variadic API
1 file changed, 3 insertions(+), 3 deletions(-)
Valentino Geron in commit 3e0d20962:
XREAD and XREADGROUP should not be allowed from scripts when BLOCK option is being used
3 files changed, 18 insertions(+), 2 deletions(-)
Guy Benoish in commit 240094c9b:
Stale replica should allow MULTI/EXEC
1 file changed, 3 insertions(+), 3 deletions(-)
Xudong Zhang in commit 209f3a1eb:
fix integer overflow
1 file changed, 2 insertions(+), 2 deletions(-)
Guy Benoish in commit 024c380b9:
Fix no-negative-zero test
1 file changed, 1 insertion(+)
Oran Agra in commit a38ff404b:
modules don't signalModifiedKey in setKey() since that's done (optionally) in RM_CloseKey
4 files changed, 8 insertions(+), 8 deletions(-)
Oran Agra in commit 814874d68:
change CI to build and run the module api tests
1 file changed, 2 insertions(+)
Oran Agra in commit 061616c1b:
fix possible warning on incomplete struct init
1 file changed, 1 insertion(+), 1 deletion(-)
Guy Benoish in commit 7764996be:
Make sure Redis does not reply with negative zero
2 files changed, 10 insertions(+)
Guy Benoish in commit eba28e2ce:
DEBUG OBJECT should pass keyname to module when loading
3 files changed, 4 insertions(+), 4 deletions(-)
David Carlier in commit 15c9e79a7:
debug, dump registers on arm too.
1 file changed, 55 insertions(+), 27 deletions(-)
hwware in commit cd2b5df97:
fix spelling in cluster.c
1 file changed, 1 insertion(+), 1 deletion(-)
Valentino Geron in commit 8cdc153f5:
XACK should be executed in a "all or nothing" fashion.
2 files changed, 23 insertions(+), 1 deletion(-)
hwware in commit b35407fa7:
add check for not switching between optin optout mode directly
1 file changed, 12 insertions(+), 1 deletion(-)
hwware in commit 4395889c9:
add check for not providing both optin optout flag
1 file changed, 8 insertions(+)
Guy Benoish in commit 1907e0f18:
PERSIST should notify a keyspace event
1 file changed, 1 insertion(+)
Guy Benoish in commit c35a53169:
streamReplyWithRange: Redundant XSETIDs to replica
1 file changed, 2 insertions(+), 1 deletion(-)
antirez in commit 6fe66e096:
Simplify comment in moduleTryServeClientBlockedOnKey().
1 file changed, 3 insertions(+), 12 deletions(-)
Guy Benoish in commit 193fc241c:
Fix memory corruption in moduleHandleBlockedClients
3 files changed, 149 insertions(+), 46 deletions(-)
================================================================================
Redis 6.0-rc3 Released Tue Mar 31 17:42:39 CEST 2020
================================================================================
Upgrade urgency CRITICAL: A connection management bug introduced with the
SSL implementation can crash Redis easily.
Dear users, this is a list of the major changes in this release, please check
the list of commits for detail:
* Fix crash due to refactoring for SSL, for the connection code.
* Precise timeouts for blocking commands. Now the timeouts have HZ
resolution regardless of the number of connected clinets. New timeouts
are stored in a radix tree and sorted by expire time.
* Fix rare crash when resizing the event loop because of CONFIG maxclients.
* Fix systemd readiness after successful partial resync.
* Redis-cli ask password mode to be prompted at startup (for additional safety).
* Keyspace notifications added to MIGRATE / RESTORE.
* Threaded I/O bugs fixed.
* Implement new ACL style AUTH in Sentinel.
* Make 'requirepass' more backward compatible with Redis <= 5.
* ACL: Handle default user as disabled if it's off regardless of "nopass".
* Fix a potential inconsistency when upgrading an instance in Redis Cluster
and restarting it. The instance will act as a replica but will actually be
set as a master immediately. However the choice of what to do with already
expired keys, on loading, was made from the POV of replicas.
* Abort transactions after -READONLY error.
* Many different fixes to module APIs.
* BITFIELD_RO added to call the command on read only replicas.
* PSYNC2: meaningful offset implementation. Allow the disconnected master
that is still sending PINGs to replicas, to be able to successfully
PSYNC incrementally to new slaves, discarding the last part of the
replication backlog consisting only of PINGs.
* Fix pipelined MULTI/EXEC during Lua scripts are in BUSY state.
* Re-fix propagation API in modules, broken again after other changes.
antirez in commit ef1b1f01:
cast raxSize() to avoid warning with format spec.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 9f347fab:
Minor changes to #7037.
2 files changed, 14 insertions(+), 5 deletions(-)
Guy Benoish in commit a509400d:
Modules: Test MULTI/EXEC replication of RM_Replicate
6 files changed, 49 insertions(+), 9 deletions(-)
Guy Benoish in commit 805c8c94:
RENAME can unblock XREADGROUP
3 files changed, 25 insertions(+), 1 deletion(-)
antirez in commit 97b80b57:
Fix the propagate Tcl test after module changes.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 4f6b6b80:
Modify the propagate unit test to show more cases.
1 file changed, 30 insertions(+), 2 deletions(-)
antirez in commit 616b1cb7:
Fix module commands propagation double MULTI bug.
4 files changed, 25 insertions(+), 8 deletions(-)
antirez in commit 08fdef4b:
Fix RM_Call() stale comment due to cut&paste.
1 file changed, 1 insertion(+), 3 deletions(-)
OMG-By in commit 26b79ca1:
fix: dict.c->dictResize()->minimal type
1 file changed, 1 insertion(+), 1 deletion(-)
zhaozhao.zz in commit fa418637:
PSYNC2: reset backlog_idx and master_repl_offset correctly
1 file changed, 10 insertions(+), 5 deletions(-)
antirez in commit bbbc80ac:
Precise timeouts: reference client pointer directly.
1 file changed, 13 insertions(+), 16 deletions(-)
antirez in commit c3b268a0:
timeout.c created: move client timeouts code there.
5 files changed, 198 insertions(+), 167 deletions(-)
Oran Agra in commit 0f7dfc37:
AOFRW on an empty stream created with MKSTREAM loads badkly
2 files changed, 15 insertions(+), 1 deletion(-)
antirez in commit 67643ead:
Precise timeouts: cleaup the table on unblock.
3 files changed, 21 insertions(+), 2 deletions(-)
antirez in commit ad94066e:
Precise timeouts: fix comments after functional change.
2 files changed, 6 insertions(+), 6 deletions(-)
antirez in commit a443ec2e:
Precise timeouts: use only radix tree for timeouts.
3 files changed, 15 insertions(+), 38 deletions(-)
antirez in commit 6862fd70:
Precise timeouts: fast exit for clientsHandleShortTimeout().
1 file changed, 1 insertion(+)
antirez in commit 30f1df8c:
Precise timeouts: fix bugs in initial implementation.
2 files changed, 5 insertions(+), 1 deletion(-)
antirez in commit 7add0f24:
Precise timeouts: working initial implementation.
3 files changed, 110 insertions(+), 28 deletions(-)
antirez in commit 9d6d1779:
Precise timeouts: refactor unblocking on timeout.
2 files changed, 33 insertions(+), 13 deletions(-)
antirez in commit 316a8f15:
PSYNC2: fix backlog_idx when adjusting for meaningful offset
1 file changed, 3 insertions(+)
伯成 in commit 11db53f8:
Boost up performance for redis PUB-SUB patterns matching
3 files changed, 43 insertions(+), 11 deletions(-)
antirez in commit e257f121:
PSYNC2: meaningful offset test.
2 files changed, 62 insertions(+)
antirez in commit 5f72f696:
PSYNC2: meaningful offset implemented.
3 files changed, 40 insertions(+), 1 deletion(-)
antirez in commit 8caa2714:
Explain why we allow transactions in -BUSY state.
1 file changed, 9 insertions(+), 2 deletions(-)
Oran Agra in commit e43cd831:
MULTI/EXEC during LUA script timeout are messed up
2 files changed, 73 insertions(+)
antirez in commit 34b89832:
Improve comments of replicationCacheMasterUsingMyself().
1 file changed, 6 insertions(+), 1 deletion(-)
antirez in commit 70a98a43:
Fix BITFIELD_RO test.
2 files changed, 5 insertions(+), 5 deletions(-)
antirez in commit 8783304a:
Abort transactions after -READONLY error. Fix #7014.
1 file changed, 1 insertion(+)
antirez in commit ec9cf002:
Minor changes to BITFIELD_RO PR #6951.
1 file changed, 9 insertions(+), 6 deletions(-)
bodong.ybd in commit b3e4abf0:
Added BITFIELD_RO variants for read-only operations.
4 files changed, 54 insertions(+), 1 deletion(-)
antirez in commit 50f8f950:
Modules: updated function doc after #7003.
1 file changed, 6 insertions(+), 1 deletion(-)
Guy Benoish in commit f2f3dc5e:
Allow RM_GetContextFlags to work with ctx==NULL
1 file changed, 16 insertions(+), 14 deletions(-)
hwware in commit eb808879:
fix potentical memory leak in redis-cli
1 file changed, 2 insertions(+)
Yossi Gottlieb in commit cdcab0e8:
Fix crashes related to failed/rejected accepts.
1 file changed, 6 insertions(+), 5 deletions(-)
Yossi Gottlieb in commit 50dcd9f9:
Cluster: fix misleading accept errors.
1 file changed, 4 insertions(+), 3 deletions(-)
Yossi Gottlieb in commit 87dbd8f5:
Conns: Fix connClose() / connAccept() behavior.
3 files changed, 48 insertions(+), 32 deletions(-)
hwware in commit 81e8686c:
remove redundant Semicolon
1 file changed, 1 insertion(+), 1 deletion(-)
hwware in commit c7524a7e:
clean CLIENT_TRACKING_CACHING flag when disabled caching
1 file changed, 1 insertion(+), 1 deletion(-)
hwware in commit 2dd1ca6a:
add missing commands in cluster help
1 file changed, 2 insertions(+), 1 deletion(-)
artix in commit 95324b81:
Support Redis Cluster Proxy PROXY INFO command
1 file changed, 5 insertions(+), 1 deletion(-)
박승현 in commit 04c53fa1:
Update redis.conf
1 file changed, 1 insertion(+), 1 deletion(-)
WuYunlong in commit 0578157d:
Fix master replica inconsistency for upgrading scenario.
3 files changed, 9 insertions(+), 2 deletions(-)
WuYunlong in commit 299f1d02:
Add 14-consistency-check.tcl to prove there is a data consistency issue.
1 file changed, 87 insertions(+)
antirez in commit 61b98f32:
Regression test for #7011.
1 file changed, 7 insertions(+)
antirez in commit 34ea2f4e:
ACL: default user off should not allow automatic authentication.
2 files changed, 3 insertions(+), 2 deletions(-)
antirez in commit cbbf9b39:
Sentinel: document auth-user directive.
1 file changed, 12 insertions(+)
antirez in commit 9c2e42dd:
ACL: Make Redis 6 more backward compatible with requirepass.
4 files changed, 17 insertions(+), 15 deletions(-)
antirez in commit d387f67d:
Sentinel: implement auth-user directive for ACLs.
1 file changed, 38 insertions(+), 7 deletions(-)
zhaozhao.zz in commit 7c078416:
Threaded IO: bugfix client kill may crash redis
1 file changed, 11 insertions(+), 5 deletions(-)
zhaozhao.zz in commit 9cc7038e:
Threaded IO: handle pending reads clients ASAP after event loop
1 file changed, 3 insertions(+), 1 deletion(-)
antirez in commit da8c7c49:
Example sentinel conf: document requirepass.
1 file changed, 8 insertions(+)
antirez in commit bdb338cf:
Aesthetic changes in PR #6989.
1 file changed, 9 insertions(+), 5 deletions(-)
zhaozhao.zz in commit b3e03054:
Threaded IO: bugfix #6988 process events while blocked
1 file changed, 5 insertions(+)
antirez in commit e628f944:
Restore newline at the end of redis-cli.c
1 file changed, 2 insertions(+), 1 deletion(-)
chendianqiang in commit 5d4c4df3:
use correct list for moduleUnregisterUsedAPI
1 file changed, 1 insertion(+), 1 deletion(-)
guodongxiaren in commit da14982d:
string literal should be const char*
1 file changed, 1 insertion(+), 1 deletion(-)
Itamar Haber in commit dc8885a1:
Adds keyspace notifications to migrate and restore
1 file changed, 3 insertions(+), 1 deletion(-)
bodong.ybd in commit bfb18e55:
Remove duplicate obj files in Makefile
1 file changed, 2 insertions(+), 2 deletions(-)
bodong.ybd in commit 76d57161:
Fix bug of tcl test using external server
2 files changed, 8 insertions(+), 2 deletions(-)
fengpf in commit 0e5820d8:
fix comments in latency.c
2 files changed, 2 insertions(+), 1 deletion(-)
antirez in commit 916dd79f:
Update linenoise.
1 file changed, 2 insertions(+), 1 deletion(-)
lifubang in commit c0c67c9b:
add askpass mode
1 file changed, 19 insertions(+), 1 deletion(-)
lifubang in commit e1c29434:
update linenoise to https://github.com/antirez/linenoise/tree/fc9667a81d43911a6690fb1e68c16e6e3bb8df05
4 files changed, 59 insertions(+), 4 deletions(-)
Jamie Scott in commit e5a063bc:
Remove default guidance in Redis.conf
1 file changed, 1 insertion(+), 2 deletions(-)
Jamie Scott in commit d28cbaf7:
Update Redis.conf to improve TLS usability
1 file changed, 2 insertions(+), 1 deletion(-)
Johannes Truschnigg in commit 23d5e8b8:
Signal systemd readiness atfer Partial Resync
1 file changed, 4 insertions(+)
Oran Agra in commit 61738154:
fix for flaky psync2 test
1 file changed, 21 insertions(+)
antirez in commit 70e0e499:
ae.c: fix crash when resizing the event loop.
1 file changed, 6 insertions(+), 2 deletions(-)
antirez in commit b3e4aa67:
Fix release notes spelling mistake.
1 file changed, 1 insertion(+), 1 deletion(-)
================================================================================
Redis 6.0 RC2 Released Thu Mar 05 15:40:53 CET 2020
================================================================================
Upgrade urgency MODERATE: Normal bugfixing release of a non-GA branch.
Hi Redis users, Redis 6 is approaching and will be released 30th of April.
New release candidates will be released at the end of March, then another
one mid April, to finally reach the GA at the end of April.
Redis 6 RC2 brings many fixes and new things, especially in the area of
client side caching. This is the list of big changes in this release. As
usually you can find the full list of commits at the end:
New features and improvements:
* ACL LOG: log denied commands, keys accesses and authentications.
* Client side caching redesigned. Now we use keys not caching slots.
* Client side caching: Broadcasting mode implemented.
* Client side caching: OPTIN/OPTOUT modes implemented.
* Remove RDB files used for replication in persistence-less instances (option).
Fixes (only selected ones, see commits for all the fixes):
* Different fixes to streams in edge cases.
* Fix duplicated CLIENT SETNAME reply because of RESP3 changes.
* Fix crash due to new active expire division by zero.
* Avoid sentinel changes promoted_slave to be its own replica.
* Fix bug on KEYS command where pattern starts with * followed by \x00.
* Threaded I/O: now the main thread is used as well to do I/O.
* Many fixes to modules APIs, and more to come in the next RCs.
* ld2string should fail if string contains \0 in the middle.
* Make the Redis test more reliable.
* Fix SPOP returning nil (see #4709). WARNING: API change.
qetu3790 in commit 4af0d7fd:
Fix not used constant in lru_test_mode.
1 file changed, 1 insertion(+), 1 deletion(-)
hwware in commit 6ef01878:
add missing file marco
1 file changed, 5 insertions(+)
ShooterIT in commit fe81d5c8:
Avoid compiler warnings
1 file changed, 1 insertion(+)
antirez in commit c2f01d7f:
RDB deletion: document it in example redis.conf.
1 file changed, 13 insertions(+)
antirez in commit 127e09bc:
Make sync RDB deletion configurable. Default to no.
3 files changed, 22 insertions(+), 4 deletions(-)
antirez in commit a20303c6:
Check that the file exists in removeRDBUsedToSyncReplicas().
1 file changed, 8 insertions(+), 4 deletions(-)
antirez in commit 7a23b945:
Log RDB deletion in persistence-less instances.
1 file changed, 15 insertions(+), 2 deletions(-)
antirez in commit baaf869f:
Introduce bg_unlink().
1 file changed, 31 insertions(+), 3 deletions(-)
antirez in commit be4bc1a5:
Remove RDB files used for replication in persistence-less instances.
3 files changed, 56 insertions(+), 1 deletion(-)
antirez in commit 07dc1b42:
Use a smaller getkeys global buffer.
1 file changed, 1 insertion(+), 1 deletion(-)
Oran Agra in commit 10e71b3d:
Optimize temporary memory allocations for getKeysFromCommand mechanism
1 file changed, 31 insertions(+), 10 deletions(-)
antirez in commit edc0ed14:
Modules: reformat RM_Scan() top comment a bit.
1 file changed, 21 insertions(+), 12 deletions(-)
antirez in commit c5319612:
Modules: more details in RM_Scan API top comment.
1 file changed, 22 insertions(+), 6 deletions(-)
Oran Agra in commit fff6b26a:
RM_Scan disable dict rehashing
2 files changed, 21 insertions(+), 6 deletions(-)
Guy Benoish in commit 65048460:
Add RM_CreateStringFromDouble
2 files changed, 14 insertions(+)
Oran Agra in commit 3144a278:
add no_auth to COMMAND INFO
1 file changed, 1 insertion(+)
Oran Agra in commit afe0b16c:
module api docs for aux_save and aux_load
2 files changed, 7 insertions(+), 1 deletion(-)
Guy Benoish in commit df152b0c:
streamReplyWithRangeFromConsumerPEL: Redundant streamDecodeID
1 file changed, 1 insertion(+), 3 deletions(-)
antirez in commit e3c1f439:
Show Redis version when not understanding a config directive.
1 file changed, 2 insertions(+), 1 deletion(-)
antirez in commit 141c0679:
Changelog: explain Redis 6 SPOP change.
1 file changed, 4 insertions(+), 1 deletion(-)
bodong.ybd in commit fe902461:
Fix spop return nil #4709
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 9d4219eb:
Fix SDS misuse in enumConfigSet(). Related to #6778.
1 file changed, 3 insertions(+), 3 deletions(-)
antirez in commit 84243064:
Remove useless comment from enumConfigSet().
1 file changed, 1 deletion(-)
Ponnuvel Palaniyappan in commit dafb94db:
Fix a potential overflow with strncpy
1 file changed, 5 insertions(+), 5 deletions(-)
antirez in commit ea697b63:
Improve aeDeleteEventLoop() top comment grammar.
1 file changed, 2 insertions(+), 1 deletion(-)
wangyuan21 in commit dd479880:
free time event when delete eventloop
1 file changed, 7 insertions(+)
srzhao in commit ecf3b2ef:
fix impl of aof-child whitelist SIGUSR1 feature.
1 file changed, 5 insertions(+), 4 deletions(-)
meir@redislabs.com in commit 2966132c:
Changed log level for module fork api from 'notice' to 'verbos'.
1 file changed, 2 insertions(+), 2 deletions(-)
hwware in commit 7277e5d8:
format fix
1 file changed, 1 insertion(+), 1 deletion(-)
hwware in commit 1bb5ee9c:
fix potentical memory leaks
1 file changed, 4 insertions(+), 1 deletion(-)
Hengjian Tang in commit 97329733:
modify the read buf size according to the write buf size PROTO_IOBUF_LEN defined before
1 file changed, 1 insertion(+), 1 deletion(-)
Ariel in commit 15ea1324:
fix ThreadSafeContext lock/unlock function names
1 file changed, 2 insertions(+), 2 deletions(-)
Guy Benoish in commit 4d12c37c:
XREADGROUP should propagate XCALIM/SETID in MULTI/EXEC
1 file changed, 2 insertions(+), 2 deletions(-)
Oran Agra in commit 12626ce9:
fix race in module api test for fork
2 files changed, 2 insertions(+), 3 deletions(-)
Guy Benoish in commit 2ecab0b6:
Modules: Do not auto-unblock clients if not blocked on keys
1 file changed, 22 insertions(+), 7 deletions(-)
Oran Agra in commit 635321d4:
fix github actions failing latency test for active defrag - part 2
2 files changed, 5 insertions(+), 4 deletions(-)
Oran Agra in commit 0b988fa9:
fix github actions failing latency test for active defrag
2 files changed, 14 insertions(+), 13 deletions(-)
Oran Agra in commit 60096bc1:
Fix latency sensitivity of new defrag test
1 file changed, 32 insertions(+), 8 deletions(-)
antirez in commit b4395426:
Tracking: optin/out implemented.
3 files changed, 82 insertions(+), 16 deletions(-)
antirez in commit ef3551d1:
Test engine: experimental change to avoid busy port problems.
1 file changed, 84 insertions(+), 49 deletions(-)
antirez in commit 72c05351:
Test engine: detect timeout when checking for Redis startup.
1 file changed, 11 insertions(+), 1 deletion(-)
antirez in commit 294c9af4:
Test engine: better tracking of what workers are doing.
2 files changed, 12 insertions(+), 4 deletions(-)
hwware in commit ba027079:
add missing subcommand description for debug oom
1 file changed, 1 insertion(+)
Guy Benoish in commit 5d0890c0:
Fix memory leak in test_ld_conv
1 file changed, 4 insertions(+)
Madelyn Olson in commit d1f22eac:
Give an error message if you specify redirect twice
1 file changed, 7 insertions(+)
Madelyn Olson in commit 762fbcb6:
Minor CSC fixes and fixed documentation
2 files changed, 16 insertions(+), 17 deletions(-)
Oran Agra in commit 349aa245:
Defrag big lists in portions to avoid latency and freeze
4 files changed, 350 insertions(+), 34 deletions(-)
Guy Benoish in commit b4ddc7b7:
XGROUP DESTROY should unblock XREADGROUP with -NOGROUP
2 files changed, 11 insertions(+)
hayashier in commit 73806f74:
fix typo from fss to rss
1 file changed, 2 insertions(+), 2 deletions(-)
antirez in commit b6129f86:
Test is more complex now, increase default timeout.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit f15fb727:
Tracking: fix max-keys configuration directive.
2 files changed, 2 insertions(+), 2 deletions(-)
Itamar Haber in commit e374573f:
Fixes segfault on calling trackingGetTotalKeys
1 file changed, 1 insertion(+)
antirez in commit 73d47d57:
Signal key as modified when expired on-access.
1 file changed, 4 insertions(+), 2 deletions(-)
antirez in commit b7cb28d5:
Tracking: first set of tests for the feature.
1 file changed, 66 insertions(+)
antirez in commit 1db72571:
Tracking: fix operators precedence error in bcast check.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit fe96e29d:
Tracking: fix behavior when switchinig from normal to BCAST.
1 file changed, 11 insertions(+), 1 deletion(-)
antirez in commit f21be1ec:
Tracking: fix sending messages bug + tracking off bug.
2 files changed, 28 insertions(+), 20 deletions(-)
antirez in commit 6fb1aa23:
Tracking: BCAST: basic feature now works.
3 files changed, 55 insertions(+), 40 deletions(-)
antirez in commit d4fe79a1:
Tracking: BCAST: broadcasting of keys in prefixes implemented.
2 files changed, 94 insertions(+), 9 deletions(-)
antirez in commit abb81c63:
Tracking: BCAST: registration in the prefix table.
3 files changed, 67 insertions(+), 20 deletions(-)
antirez in commit 77da9608:
Tracking: BCAST: parsing of the options + skeleton.
4 files changed, 73 insertions(+), 19 deletions(-)
antirez in commit 3e8c69a9:
Tracking: always reply with an array of keys.
2 files changed, 10 insertions(+), 3 deletions(-)
antirez in commit a788c373:
Tracking: minor change of names and new INFO field.
4 files changed, 11 insertions(+), 4 deletions(-)
antirez in commit df838927:
Rax.c: populate data field after random walk.
1 file changed, 1 insertion(+)
antirez in commit 0517da36:
Tracking: rename INFO field with total items.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 3c16d6b3:
Tracking: first conversion from hashing to key names.
3 files changed, 84 insertions(+), 114 deletions(-)
Oran Agra in commit 3b4f1477:
add no-slowlog option to RM_CreateCommand
1 file changed, 3 insertions(+)
Khem Raj in commit 5e762d84:
Mark extern definition of SDS_NOINIT in sds.h
1 file changed, 1 insertion(+), 1 deletion(-)
lifubang in commit 54f5499a:
correct help info for --user and --pass
1 file changed, 2 insertions(+), 2 deletions(-)
Seunghoon Woo in commit 0c952b13:
[FIX] revisit CVE-2015-8080 vulnerability
1 file changed, 6 insertions(+), 4 deletions(-)
Guy Benoish in commit dd34f703:
Diskless-load emptyDb-related fixes
3 files changed, 44 insertions(+), 28 deletions(-)
lifubang in commit 5e042dbc:
fix ssl flag check for redis-cli
1 file changed, 10 insertions(+), 9 deletions(-)
Guy Benoish in commit dcbe8bfa:
Exclude "keymiss" notification from NOTIFY_ALL
5 files changed, 12 insertions(+), 7 deletions(-)
Oran Agra in commit 36caf2e4:
update RM_SignalModifiedKey doc comment
1 file changed, 2 insertions(+), 1 deletion(-)
Oran Agra in commit 3067352a:
Add handling of short read of module id in rdb
1 file changed, 4 insertions(+), 1 deletion(-)
Yossi Gottlieb in commit 9baaf858:
TLS: Update documentation.
2 files changed, 32 insertions(+), 31 deletions(-)
Oran Agra in commit 4440133e:
A few non-data commands that should be allowed while loading or stale
1 file changed, 8 insertions(+), 8 deletions(-)
Oran Agra in commit c9577941:
Memory leak when bind config is provided twice
1 file changed, 4 insertions(+)
Oran Agra in commit 1333a46b:
fix maxmemory config warning
1 file changed, 3 insertions(+), 2 deletions(-)
Oran Agra in commit 8e7282eb:
Fix client flags to be int64 in module.c
1 file changed, 3 insertions(+), 3 deletions(-)
Oran Agra in commit a678390e:
moduleRDBLoadError, add key name, and use panic rather than exit
1 file changed, 5 insertions(+), 4 deletions(-)
Oran Agra in commit 919fbf42:
reduce repeated calls to use_diskless_load
1 file changed, 3 insertions(+), 4 deletions(-)
Oran Agra in commit 22e45d46:
freeClientAsync don't lock mutex if there's just one thread
1 file changed, 6 insertions(+), 1 deletion(-)
Oran Agra in commit ba289244:
move restartAOFAfterSYNC from replicaofCommand to replicationUnsetMaster
1 file changed, 4 insertions(+), 3 deletions(-)
Oran Agra in commit f42ce57d:
stopAppendOnly resets aof_rewrite_scheduled
1 file changed, 1 insertion(+)
Oran Agra in commit df096bc9:
add SAVE subcommand to ACL HELP and top comment
1 file changed, 2 insertions(+)
Oran Agra in commit a55e5847:
DEBUG HELP - add PROTOCOL
1 file changed, 3 insertions(+), 2 deletions(-)
Guy Benoish in commit 5a6cfbf4:
Some refactroing using getClientType instead of CLIENT_SLAVE
2 files changed, 18 insertions(+), 26 deletions(-)
Guy Benoish in commit fae306b3:
Fix small bugs related to replica and monitor ambiguity
2 files changed, 8 insertions(+), 6 deletions(-)
Yossi Gottlieb in commit 73630966:
TLS: Some redis.conf clarifications.
1 file changed, 10 insertions(+), 11 deletions(-)
Oran Agra in commit 488e1947:
config.c verbose error replies for CONFIG SET, like config file parsing
1 file changed, 31 insertions(+), 97 deletions(-)
Oran Agra in commit c82ccf06:
memoryGetKeys helper function so that ACL can limit access to keys for MEMORY command
3 files changed, 18 insertions(+), 1 deletion(-)
antirez in commit 51c1a9f8:
ACL LOG: make max log entries configurable.
4 files changed, 19 insertions(+)
antirez in commit ea1e1b12:
ACL LOG: test for AUTH reason.
1 file changed, 9 insertions(+)
antirez in commit 7379c78a:
ACL LOG: log failed auth attempts.
5 files changed, 34 insertions(+), 12 deletions(-)
antirez in commit 9f6e84f6:
ACL LOG: implement a few basic tests.
1 file changed, 87 insertions(+)
antirez in commit 82790e51:
ACL LOG: also log ACL errors in the scripting/MULTI ctx.
2 files changed, 6 insertions(+), 2 deletions(-)
antirez in commit 943008eb:
ACL LOG: implement LOG RESET.
1 file changed, 6 insertions(+), 2 deletions(-)
antirez in commit e271a611:
ACL LOG: group similar entries in a given time delta.
1 file changed, 58 insertions(+), 3 deletions(-)
antirez in commit f1974d5d:
ACL LOG: actually emit entries.
3 files changed, 34 insertions(+), 5 deletions(-)
antirez in commit d9b153c9:
ACL LOG: implement ACL LOG subcommadn skeleton.
1 file changed, 37 insertions(+)
antirez in commit 577fc438:
ACL LOG: data structures and initial functions.
5 files changed, 54 insertions(+), 5 deletions(-)
Leo Murillo in commit f7a94526:
Set ZSKIPLIST_MAXLEVEL to optimal value given 2^64 elements and p=0.25
1 file changed, 1 insertion(+), 1 deletion(-)
WuYunlong in commit eecfa979:
Fix lua related memory leak.
1 file changed, 1 insertion(+)
WuYunlong in commit d2509811:
Add tcl regression test in scripting.tcl to reproduce memory leak.
1 file changed, 5 insertions(+)
Yossi Gottlieb in commit 29d4a150:
TLS: Fix missing initialization in redis-cli.
1 file changed, 9 insertions(+)
Oran Agra in commit ec0c61da:
fix uninitialized info_cb var in module.c
1 file changed, 1 insertion(+)
Guy Benoish in commit 6fe55c2f:
ld2string should fail if string contains \0 in the middle
5 files changed, 20 insertions(+), 11 deletions(-)
antirez in commit bbce3ba9:
Add more info in the unblockClientFromModule() function.
1 file changed, 7 insertions(+), 1 deletion(-)
Guy Benoish in commit 40295fb3:
Modules: Fix blocked-client-related memory leak
3 files changed, 51 insertions(+), 6 deletions(-)
antirez in commit 8e9d19bc:
Change error message for #6775.
1 file changed, 2 insertions(+), 2 deletions(-)
Vasyl Melnychuk in commit ba146d4c:
Make error when submitting command in incorrect context more explicit
1 file changed, 4 insertions(+), 1 deletion(-)
antirez in commit 721a39dd:
Document I/O threads in redis.conf.
1 file changed, 46 insertions(+)
antirez in commit 5be3a15a:
Setting N I/O threads should mean N-1 additional + 1 main thread.
1 file changed, 25 insertions(+), 22 deletions(-)
antirez in commit cbabf779:
Simplify #6379 changes.
2 files changed, 4 insertions(+), 9 deletions(-)
WuYunlong in commit 658749cc:
Free allocated sds in pfdebugCommand() to avoid memory leak.
1 file changed, 1 insertion(+)
WuYunlong in commit 47988c96:
Fix potential memory leak of clusterLoadConfig().
1 file changed, 20 insertions(+), 5 deletions(-)
WuYunlong in commit cc90f79b:
Fix potential memory leak of rioWriteBulkStreamID().
1 file changed, 4 insertions(+), 1 deletion(-)
antirez in commit ecd17e81:
Jump to right label on AOF parsing error.
1 file changed, 6 insertions(+), 4 deletions(-)
antirez in commit 1927932b:
Port PR #6110 to new connection object code.
1 file changed, 2 insertions(+), 2 deletions(-)
antirez in commit f2df5773:
A few comments about main thread serving I/O as well.
1 file changed, 7 insertions(+), 1 deletion(-)
zhaozhao.zz in commit b3ff8a4b:
Threaded IO: use main thread to handle read work
1 file changed, 8 insertions(+), 1 deletion(-)
zhaozhao.zz in commit b1f2c510:
Threaded IO: use main thread to handle write work
1 file changed, 10 insertions(+), 2 deletions(-)
ShooterIT in commit 7bbafc56:
Rename rdb asynchronously
1 file changed, 7 insertions(+)
Leo Murillo in commit c7f75266:
Fix bug on KEYS command where pattern starts with * followed by \x00 (null char).
1 file changed, 1 insertion(+), 1 deletion(-)
Jamie Scott in commit ed7ea13a:
Update to directive in redis.conf (missing s)
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 3be77623:
Free fakeclient argv on AOF error.
1 file changed, 11 insertions(+), 3 deletions(-)
antirez in commit 15f6b748:
Git ignore: ignore more files.
1 file changed, 2 insertions(+)
Guy Benoish in commit 1b5bf40c:
Blocking XREAD[GROUP] should always reply with valid data (or timeout)
3 files changed, 44 insertions(+), 10 deletions(-)
John Sully in commit 954c20ed:
Add support for incremental build with header files
2 files changed, 6 insertions(+), 1 deletion(-)
WuYunlong in commit 11c3afd7:
Fix petential cluster link error.
1 file changed, 4 insertions(+)
Yossi Gottlieb in commit b752e83d:
Add REDISMODULE_CTX_FLAGS_MULTI_DIRTY.
2 files changed, 8 insertions(+)
hwware in commit e16eb874:
typo fix in acl.c
1 file changed, 2 insertions(+), 2 deletions(-)
Itamar Haber in commit 35ea9d23:
Adjusts 'io_threads_num' max to 128
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 38729126:
XCLAIM: Create the consumer only on successful claims.
1 file changed, 4 insertions(+), 2 deletions(-)
yz1509 in commit b9a15303:
avoid sentinel changes promoted_slave to be its own replica.
1 file changed, 1 insertion(+), 1 deletion(-)
antirez in commit 5e7e5e6b:
Fix active expire division by zero.
1 file changed, 7 insertions(+), 4 deletions(-)
antirez in commit e61dde88:
Fix duplicated CLIENT SETNAME reply.
1 file changed, 1 deletion(-)
Guy Benoish in commit cddf1da2:
Stream: Handle streamID-related edge cases
4 files changed, 54 insertions(+), 4 deletions(-)
Oran Agra in commit 52ea44e5:
config.c adjust config limits and mutable
2 files changed, 7 insertions(+), 7 deletions(-)
antirez in commit 0f28ea16:
Inline protocol: handle empty strings well.
1 file changed, 2 insertions(+), 6 deletions(-)
antirez in commit 00e5fefe:
Fix ip and missing mode in RM_GetClusterNodeInfo().
1 file changed, 5 insertions(+), 2 deletions(-)
================================================================================
Redis 6.0 RC1 Released Thu Dec 19 09:58:24 CEST 2019
================================================================================
Upgrade urgency LOW: This is the first RC of Redis 6.
Introduction to the Redis 6 release
===================================
Redis 6 improves Redis in a number of key areas and is one of the largest
Redis releases in the history of the project, so here we'll list only
the biggest features in this release:
* The modules system now has a number of new APIs that allow module authors
to make things otherwise not possible in the past. It is possible to
store arbitrary module private data in RDB files, to hook on different
server events, capture and rewrite commands executions, block clients on
keys, and so forth.
* The Redis active expire cycle was rewritten for much faster eviction of keys
that are already expired. Now the effort is tunable.
* Redis now supports SSL on all channels.
* ACL support, you can define users that can run only certain commands and/or
can only access only certain keys patterns.
* Redis now supports a new protocol called RESP3, which returns more
semantical replies: new clients using this protocol can understand just
from the reply what type to return to the calling program.
* There is server-side support for client-side caching of key values. This
feature is still experimental and will get more changes during the next
release candidates, but you can already test it and read about it here:
https://redis.io/topics/client-side-caching
* Redis can now optionally use threads to handle I/O, allowing to serve
2 times as much operations per second in a single instance when
pipelining cannot be used.
* Diskless replication is now supported even on replicas: a replica is now
able, under certain conditions the user can configure, to load the RDB
in the first synchronization directly from the socket to the memory.
* Redis-benchmark now supports a Redis Cluster mode.
* SRANDMEMBER and similar commands have a better distribution.
* Redis-cli improvements.
* Systemd support rewritten.
* A Redis Cluster proxy was released here:
https://github.com/artix75/redis-cluster-proxy
* A Disque module for Redis was released here:
https://github.com/antirez/disque-module
Thanks to all the users and developers who made this release possible.
We'll follow up with more RC releases, until the code looks production ready
and we don't get reports of serious issues for a while.
A special thank you for the amount of work put into this release
(in decreasing number of commits, only listing contributors with more
than a single commit) by:
685 antirez
81 zhaozhao.zz
76 Oran Agra
51 artix
28 Madelyn Olson
27 Yossi Gottlieb
15 David Carlier
14 Guy Benoish
14 Guy Korland
13 Itamar Haber
9 Angus Pearson
8 WuYunlong
8 yongman
7 vattezhang
7 Chris Lamb
5 Dvir Volk
5 meir@redislabs.com
5 chendianqiang
5 John Sully
4 dejun.xdj
4 Daniel Dai
4 Johannes Truschnigg
4 swilly22
3 Bruce Merry
3 filipecosta90
3 youjiali1995
2 James Rouzier
2 Andrey Bugaevskiy
2 Brad Solomon
2 Hamid Alaei
2 Michael Chaten
2 Steve Webster
2 Wander Hillen
2 Weiliang Li
2 Yuan Zhou
2 charsyam
2 hujie
2 jem
2 shenlongxing
2 valentino
2 zhudacai 00228490
2 喜欢兰花山丘
Migrating from 5.0 to 6.0
=========================
Redis 6.0 is mostly a strict superset of 5.0, you should not have any problem
upgrading your application from 5.0 to 6.0. However this is a list of small
non-backward compatible changes introduced in the 6.0 release:
* The SPOP <count> command no longer returns null when the set key does not
exist. Now it returns the empty set as it should and as happens when it is
called with a 0 argument. This is technically a fix, however it changes the
old behavior.
--------------------------------------------------------------------------------
Credits: For each release, a list of changes with the relative author is
provided. Where not specified the implementation and design is done by
Salvatore Sanfilippo. Thanks to Redis Labs for making all this possible.
Also many thanks to all the other contributors and the amazing community
we have.
Commit messages may contain additional credits.
Enjoy,
Salvatore
================================================
FILE: Chapter02/redis-6.0.3/BUGS
================================================
Please check https://github.com/antirez/redis/issues
================================================
FILE: Chapter02/redis-6.0.3/CONTRIBUTING
================================================
Note: by contributing code to the Redis project in any form, including sending
a pull request via Github, a code fragment or patch via private email or
public discussion groups, you agree to release your code under the terms
of the BSD license that you can find in the COPYING file included in the Redis
source distribution. You will include BSD license in the COPYING file within
each source file that you contribute.
# IMPORTANT: HOW TO USE REDIS GITHUB ISSUES
* Github issues SHOULD ONLY BE USED to report bugs, and for DETAILED feature
requests. Everything else belongs to the Redis Google Group:
https://groups.google.com/forum/m/#!forum/Redis-db
PLEASE DO NOT POST GENERAL QUESTIONS that are not about bugs or suspected
bugs in the Github issues system. We'll be very happy to help you and provide
all the support in the mailing list.
There is also an active community of Redis users at Stack Overflow:
http://stackoverflow.com/questions/tagged/redis
# How to provide a patch for a new feature
1. If it is a major feature or a semantical change, please don't start coding
straight away: if your feature is not a conceptual fit you'll lose a lot of
time writing the code without any reason. Start by posting in the mailing list
and creating an issue at Github with the description of, exactly, what you want
to accomplish and why. Use cases are important for features to be accepted.
Here you'll see if there is consensus about your idea.
2. If in step 1 you get an acknowledgment from the project leaders, use the
following procedure to submit a patch:
a. Fork Redis on github ( http://help.github.com/fork-a-repo/ )
b. Create a topic branch (git checkout -b my_branch)
c. Push to your branch (git push origin my_branch)
d. Initiate a pull request on github ( https://help.github.com/articles/creating-a-pull-request/ )
e. Done :)
3. Keep in mind that we are very overloaded, so issues and PRs sometimes wait
for a *very* long time. However this is not lack of interest, as the project
gets more and more users, we find ourselves in a constant need to prioritize
certain issues/PRs over others. If you think your issue/PR is very important
try to popularize it, have other users commenting and sharing their point of
view and so forth. This helps.
4. For minor fixes just open a pull request on Github.
Thanks!
================================================
FILE: Chapter02/redis-6.0.3/COPYING
================================================
Copyright (c) 2006-2015, Salvatore Sanfilippo
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of Redis nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: Chapter02/redis-6.0.3/INSTALL
================================================
See README
================================================
FILE: Chapter02/redis-6.0.3/MANIFESTO
================================================
[Note: this is the Redis manifesto, for general information about
installing and running Redis read the README file instead.]
Redis Manifesto
===============
1 - A DSL for Abstract Data Types. Redis is a DSL (Domain Specific Language)
that manipulates abstract data types and implemented as a TCP daemon.
Commands manipulate a key space where keys are binary-safe strings and
values are different kinds of abstract data types. Every data type
represents an abstract version of a fundamental data structure. For instance
Redis Lists are an abstract representation of linked lists. In Redis, the
essence of a data type isn't just the kind of operations that the data types
support, but also the space and time complexity of the data type and the
operations performed upon it.
2 - Memory storage is #1. The Redis data set, composed of defined key-value
pairs, is primarily stored in the computer's memory. The amount of memory in
all kinds of computers, including entry-level servers, is increasing
significantly each year. Memory is fast, and allows Redis to have very
predictable performance. Datasets composed of 10k or 40 millions keys will
perform similarly. Complex data types like Redis Sorted Sets are easy to
implement and manipulate in memory with good performance, making Redis very
simple. Redis will continue to explore alternative options (where data can
be optionally stored on disk, say) but the main goal of the project remains
the development of an in-memory database.
3 - Fundamental data structures for a fundamental API. The Redis API is a direct
consequence of fundamental data structures. APIs can often be arbitrary but
not an API that resembles the nature of fundamental data structures. If we
ever meet intelligent life forms from another part of the universe, they'll
likely know, understand and recognize the same basic data structures we have
in our computer science books. Redis will avoid intermediate layers in API,
so that the complexity is obvious and more complex operations can be
performed as the sum of the basic operations.
4 - We believe in code efficiency. Computers get faster and faster, yet we
believe that abusing computing capabilities is not wise: the amount of
operations you can do for a given amount of energy remains anyway a
significant parameter: it allows to do more with less computers and, at
the same time, having a smaller environmental impact. Similarly Redis is
able to "scale down" to smaller devices. It is perfectly usable in a
Raspberry Pi and other small ARM based computers. Faster code having
just the layers of abstractions that are really needed will also result,
often, in more predictable performances. We think likewise about memory
usage, one of the fundamental goals of the Redis project is to
incrementally build more and more memory efficient data structures, so that
problems that were not approachable in RAM in the past will be perfectly
fine to handle in the future.
5 - Code is like a poem; it's not just something we write to reach some
practical result. Sometimes people that are far from the Redis philosophy
suggest using other code written by other authors (frequently in other
languages) in order to implement something Redis currently lacks. But to us
this is like if Shakespeare decided to end Enrico IV using the Paradiso from
the Divina Commedia. Is using any external code a bad idea? Not at all. Like
in "One Thousand and One Nights" smaller self contained stories are embedded
in a bigger story, we'll be happy to use beautiful self contained libraries
when needed. At the same time, when writing the Redis story we're trying to
write smaller stories that will fit in to other code.
6 - We're against complexity. We believe designing systems is a fight against
complexity. We'll accept to fight the complexity when it's worthwhile but
we'll try hard to recognize when a small feature is not worth 1000s of lines
of code. Most of the time the best way to fight complexity is by not
creating it at all. Complexity is also a form of lock-in: code that is
very hard to understand cannot be modified by users in an independent way
regardless of the license. One of the main Redis goals is to remain
understandable, enough for a single programmer to have a clear idea of how
it works in detail just reading the source code for a couple of weeks.
7 - Threading is not a silver bullet. Instead of making Redis threaded we
believe on the idea of an efficient (mostly) single threaded Redis core.
Multiple of such cores, that may run in the same computer or may run
in multiple computers, are abstracted away as a single big system by
higher order protocols and features: Redis Cluster and the upcoming
Redis Proxy are our main goals. A shared nothing approach is not just
much simpler (see the previous point in this document), is also optimal
in NUMA systems. In the specific case of Redis it allows for each instance
to have a more limited amount of data, making the Redis persist-by-fork
approach more sounding. In the future we may explore parallelism only for
I/O, which is the low hanging fruit: minimal complexity could provide an
improved single process experience.
8 - Two levels of API. The Redis API has two levels: 1) a subset of the API fits
naturally into a distributed version of Redis and 2) a more complex API that
supports multi-key operations. Both are useful if used judiciously but
there's no way to make the more complex multi-keys API distributed in an
opaque way without violating our other principles. We don't want to provide
the illusion of something that will work magically when actually it can't in
all cases. Instead we'll provide commands to quickly migrate keys from one
instance to another to perform multi-key operations and expose the
trade-offs to the user.
9 - We optimize for joy. We believe writing code is a lot of hard work, and the
only way it can be worth is by enjoying it. When there is no longer joy in
writing code, the best thing to do is stop. To prevent this, we'll avoid
taking paths that will make Redis less of a joy to develop.
10 - All the above points are put together in what we call opportunistic
programming: trying to get the most for the user with minimal increases
in complexity (hanging fruits). Solve 95% of the problem with 5% of the
code when it is acceptable. Avoid a fixed schedule but follow the flow of
user requests, inspiration, Redis internal readiness for certain features
(sometimes many past changes reach a critical point making a previously
complex feature very easy to obtain).
================================================
FILE: Chapter02/redis-6.0.3/Makefile
================================================
# Top level makefile, the real shit is at src/Makefile
default: all
.DEFAULT:
cd src && $(MAKE) $@
install:
cd src && $(MAKE) $@
.PHONY: install
================================================
FILE: Chapter02/redis-6.0.3/README.md
================================================
This README is just a fast *quick start* document. You can find more detailed documentation at [redis.io](https://redis.io).
What is Redis?
--------------
Redis is often referred as a *data structures* server. What this means is that Redis provides access to mutable data structures via a set of commands, which are sent using a *server-client* model with TCP sockets and a simple protocol. So different processes can query and modify the same data structures in a shared way.
Data structures implemented into Redis have a few special properties:
* Redis cares to store them on disk, even if they are always served and modified into the server memory. This means that Redis is fast, but that is also non-volatile.
* Implementation of data structures stress on memory efficiency, so data structures inside Redis will likely use less memory compared to the same data structure modeled using an high level programming language.
* Redis offers a number of features that are natural to find in a database, like replication, tunable levels of durability, cluster, high availability.
Another good example is to think of Redis as a more complex version of memcached, where the operations are not just SETs and GETs, but operations to work with complex data types like Lists, Sets, ordered data structures, and so forth.
If you want to know more, this is a list of selected starting points:
* Introduction to Redis data types. http://redis.io/topics/data-types-intro
* Try Redis directly inside your browser. http://try.redis.io
* The full list of Redis commands. http://redis.io/commands
* There is much more inside the Redis official documentation. http://redis.io/documentation
Building Redis
--------------
Redis can be compiled and used on Linux, OSX, OpenBSD, NetBSD, FreeBSD.
We support big endian and little endian architectures, and both 32 bit
and 64 bit systems.
It may compile on Solaris derived systems (for instance SmartOS) but our
support for this platform is *best effort* and Redis is not guaranteed to
work as well as in Linux, OSX, and \*BSD there.
It is as simple as:
% make
To build with TLS support, you'll need OpenSSL development libraries (e.g.
libssl-dev on Debian/Ubuntu) and run:
% make BUILD_TLS=yes
You can run a 32 bit Redis binary using:
% make 32bit
After building Redis, it is a good idea to test it using:
% make test
If TLS is built, running the tests with TLS enabled (you will need `tcl-tls`
installed):
% ./utils/gen-test-certs.sh
% ./runtest --tls
Fixing build problems with dependencies or cached build options
---------
Redis has some dependencies which are included into the `deps` directory.
`make` does not automatically rebuild dependencies even if something in
the source code of dependencies changes.
When you update the source code with `git pull` or when code inside the
dependencies tree is modified in any other way, make sure to use the following
command in order to really clean everything and rebuild from scratch:
make distclean
This will clean: jemalloc, lua, hiredis, linenoise.
Also if you force certain build options like 32bit target, no C compiler
optimizations (for debugging purposes), and other similar build time options,
those options are cached indefinitely until you issue a `make distclean`
command.
Fixing problems building 32 bit binaries
---------
If after building Redis with a 32 bit target you need to rebuild it
with a 64 bit target, or the other way around, you need to perform a
`make distclean` in the root directory of the Redis distribution.
In case of build errors when trying to build a 32 bit binary of Redis, try
the following steps:
* Install the packages libc6-dev-i386 (also try g++-multilib).
* Try using the following command line instead of `make 32bit`:
`make CFLAGS="-m32 -march=native" LDFLAGS="-m32"`
Allocator
---------
Selecting a non-default memory allocator when building Redis is done by setting
the `MALLOC` environment variable. Redis is compiled and linked against libc
malloc by default, with the exception of jemalloc being the default on Linux
systems. This default was picked because jemalloc has proven to have fewer
fragmentation problems than libc malloc.
To force compiling against libc malloc, use:
% make MALLOC=libc
To compile against jemalloc on Mac OS X systems, use:
% make MALLOC=jemalloc
Verbose build
-------------
Redis will build with a user friendly colorized output by default.
If you want to see a more verbose output use the following:
% make V=1
Running Redis
-------------
To run Redis with the default configuration just type:
% cd src
% ./redis-server
If you want to provide your redis.conf, you have to run it using an additional
parameter (the path of the configuration file):
% cd src
% ./redis-server /path/to/redis.conf
It is possible to alter the Redis configuration by passing parameters directly
as options using the command line. Examples:
% ./redis-server --port 9999 --replicaof 127.0.0.1 6379
% ./redis-server /etc/redis/6379.conf --loglevel debug
All the options in redis.conf are also supported as options using the command
line, with exactly the same name.
Running Redis with TLS:
------------------
Please consult the [TLS.md](TLS.md) file for more information on
how to use Redis with TLS.
Playing with Redis
------------------
You can use redis-cli to play with Redis. Start a redis-server instance,
then in another terminal try the following:
% cd src
% ./redis-cli
redis> ping
PONG
redis> set foo bar
OK
redis> get foo
"bar"
redis> incr mycounter
(integer) 1
redis> incr mycounter
(integer) 2
redis>
You can find the list of all the available commands at http://redis.io/commands.
Installing Redis
-----------------
In order to install Redis binaries into /usr/local/bin just use:
% make install
You can use `make PREFIX=/some/other/directory install` if you wish to use a
different destination.
Make install will just install binaries in your system, but will not configure
init scripts and configuration files in the appropriate place. This is not
needed if you want just to play a bit with Redis, but if you are installing
it the proper way for a production system, we have a script doing this
for Ubuntu and Debian systems:
% cd utils
% ./install_server.sh
_Note_: `install_server.sh` will not work on Mac OSX; it is built for Linux only.
The script will ask you a few questions and will setup everything you need
to run Redis properly as a background daemon that will start again on
system reboots.
You'll be able to stop and start Redis using the script named
`/etc/init.d/redis_<portnumber>`, for instance `/etc/init.d/redis_6379`.
Code contributions
-----------------
Note: by contributing code to the Redis project in any form, including sending
a pull request via Github, a code fragment or patch via private email or
public discussion groups, you agree to release your code under the terms
of the BSD license that you can find in the [COPYING][1] file included in the Redis
source distribution.
Please see the [CONTRIBUTING][2] file in this source distribution for more
information.
[1]: https://github.com/antirez/redis/blob/unstable/COPYING
[2]: https://github.com/antirez/redis/blob/unstable/CONTRIBUTING
Redis internals
===
If you are reading this README you are likely in front of a Github page
or you just untarred the Redis distribution tar ball. In both the cases
you are basically one step away from the source code, so here we explain
the Redis source code layout, what is in each file as a general idea, the
most important functions and structures inside the Redis server and so forth.
We keep all the discussion at a high level without digging into the details
since this document would be huge otherwise and our code base changes
continuously, but a general idea should be a good starting point to
understand more. Moreover most of the code is heavily commented and easy
to follow.
Source code layout
---
The Redis root directory just contains this README, the Makefile which
calls the real Makefile inside the `src` directory and an example
configuration for Redis and Sentinel. You can find a few shell
scripts that are used in order to execute the Redis, Redis Cluster and
Redis Sentinel unit tests, which are implemented inside the `tests`
directory.
Inside the root are the following important directories:
* `src`: contains the Redis implementation, written in C.
* `tests`: contains the unit tests, implemented in Tcl.
* `deps`: contains libraries Redis uses. Everything needed to compile Redis is inside this directory; your system just needs to provide `libc`, a POSIX compatible interface and a C compiler. Notably `deps` contains a copy of `jemalloc`, which is the default allocator of Redis under Linux. Note that under `deps` there are also things which started with the Redis project, but for which the main repository is not `antirez/redis`.
There are a few more directories but they are not very important for our goals
here. We'll focus mostly on `src`, where the Redis implementation is contained,
exploring what there is inside each file. The order in which files are
exposed is the logical one to follow in order to disclose different layers
of complexity incrementally.
Note: lately Redis was refactored quite a bit. Function names and file
names have been changed, so you may find that this documentation reflects the
`unstable` branch more closely. For instance in Redis 3.0 the `server.c`
and `server.h` files were named `redis.c` and `redis.h`. However the overall
structure is the same. Keep in mind that all the new developments and pull
requests should be performed against the `unstable` branch.
server.h
---
The simplest way to understand how a program works is to understand the
data structures it uses. So we'll start from the main header file of
Redis, which is `server.h`.
All the server configuration and in general all the shared state is
defined in a global structure called `server`, of type `struct redisServer`.
A few important fields in this structure are:
* `server.db` is an array of Redis databases, where data is stored.
* `server.commands` is the command table.
* `server.clients` is a linked list of clients connected to the server.
* `server.master` is a special client, the master, if the instance is a replica.
There are tons of other fields. Most fields are commented directly inside
the structure definition.
Another important Redis data structure is the one defining a client.
In the past it was called `redisClient`, now just `client`. The structure
has many fields, here we'll just show the main ones:
struct client {
int fd;
sds querybuf;
int argc;
robj **argv;
redisDb *db;
int flags;
list *reply;
char buf[PROTO_REPLY_CHUNK_BYTES];
... many other fields ...
}
The client structure defines a *connected client*:
* The `fd` field is the client socket file descriptor.
* `argc` and `argv` are populated with the command the client is executing, so that functions implementing a given Redis command can read the arguments.
* `querybuf` accumulates the requests from the client, which are parsed by the Redis server according to the Redis protocol and executed by calling the implementations of the commands the client is executing.
* `reply` and `buf` are dynamic and static buffers that accumulate the replies the server sends to the client. These buffers are incrementally written to the socket as soon as the file descriptor is writable.
As you can see in the client structure above, arguments in a command
are described as `robj` structures. The following is the full `robj`
structure, which defines a *Redis object*:
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
} robj;
Basically this structure can represent all the basic Redis data types like
strings, lists, sets, sorted sets and so forth. The interesting thing is that
it has a `type` field, so that it is possible to know what type a given
object has, and a `refcount`, so that the same object can be referenced
in multiple places without allocating it multiple times. Finally the `ptr`
field points to the actual representation of the object, which might vary
even for the same type, depending on the `encoding` used.
Redis objects are used extensively in the Redis internals, however in order
to avoid the overhead of indirect accesses, recently in many places
we just use plain dynamic strings not wrapped inside a Redis object.
server.c
---
This is the entry point of the Redis server, where the `main()` function
is defined. The following are the most important steps in order to startup
the Redis server.
* `initServerConfig()` setups the default values of the `server` structure.
* `initServer()` allocates the data structures needed to operate, setup the listening socket, and so forth.
* `aeMain()` starts the event loop which listens for new connections.
There are two special functions called periodically by the event loop:
1. `serverCron()` is called periodically (according to `server.hz` frequency), and performs tasks that must be performed from time to time, like checking for timedout clients.
2. `beforeSleep()` is called every time the event loop fired, Redis served a few requests, and is returning back into the event loop.
Inside server.c you can find code that handles other vital things of the Redis server:
* `call()` is used in order to call a given command in the context of a given client.
* `activeExpireCycle()` handles eviciton of keys with a time to live set via the `EXPIRE` command.
* `freeMemoryIfNeeded()` is called when a new write command should be performed but Redis is out of memory according to the `maxmemory` directive.
* The global variable `redisCommandTable` defines all the Redis commands, specifying the name of the command, the function implementing the command, the number of arguments required, and other properties of each command.
networking.c
---
This file defines all the I/O functions with clients, masters and replicas
(which in Redis are just special clients):
* `createClient()` allocates and initializes a new client.
* the `addReply*()` family of functions are used by commands implementations in order to append data to the client structure, that will be transmitted to the client as a reply for a given command executed.
* `writeToClient()` transmits the data pending in the output buffers to the client and is called by the *writable event handler* `sendReplyToClient()`.
* `readQueryFromClient()` is the *readable event handler* and accumulates data from read from the client into the query buffer.
* `processInputBuffer()` is the entry point in order to parse the client query buffer according to the Redis protocol. Once commands are ready to be processed, it calls `processCommand()` which is defined inside `server.c` in order to actually execute the command.
* `freeClient()` deallocates, disconnects and removes a client.
aof.c and rdb.c
---
As you can guess from the names these files implement the RDB and AOF
persistence for Redis. Redis uses a persistence model based on the `fork()`
system call in order to create a thread with the same (shared) memory
content of the main Redis thread. This secondary thread dumps the content
of the memory on disk. This is used by `rdb.c` to create the snapshots
on disk and by `aof.c` in order to perform the AOF rewrite when the
append only file gets too big.
The implementation inside `aof.c` has additional functions in order to
implement an API that allows commands to append new commands into the AOF
file as clients execute them.
The `call()` function defined inside `server.c` is responsible to call
the functions that in turn will write the commands into the AOF.
db.c
---
Certain Redis commands operate on specific data types, others are general.
Examples of generic commands are `DEL` and `EXPIRE`. They operate on keys
and not on their values specifically. All those generic commands are
defined inside `db.c`.
Moreover `db.c` implements an API in order to perform certain operations
on the Redis dataset without directly accessing the internal data structures.
The most important functions inside `db.c` which are used in many commands
implementations are the following:
* `lookupKeyRead()` and `lookupKeyWrite()` are used in order to get a pointer to the value associated to a given key, or `NULL` if the key does not exist.
* `dbAdd()` and its higher level counterpart `setKey()` create a new key in a Redis database.
* `dbDelete()` removes a key and its associated value.
* `emptyDb()` removes an entire single database or all the databases defined.
The rest of the file implements the generic commands exposed to the client.
object.c
---
The `robj` structure defining Redis objects was already described. Inside
`object.c` there are all the functions that operate with Redis objects at
a basic level, like functions to allocate new objects, handle the reference
counting and so forth. Notable functions inside this file:
* `incrRefcount()` and `decrRefCount()` are used in order to increment or decrement an object reference count. When it drops to 0 the object is finally freed.
* `createObject()` allocates a new object. There are also specialized functions to allocate string objects having a specific content, like `createStringObjectFromLongLong()` and similar functions.
This file also implements the `OBJECT` command.
replication.c
---
This is one of the most complex files inside Redis, it is recommended to
approach it only after getting a bit familiar with the rest of the code base.
In this file there is the implementation of both the master and replica role
of Redis.
One of the most important functions inside this file is `replicationFeedSlaves()` that writes commands to the clients representing replica instances connected
to our master, so that the replicas can get the writes performed by the clients:
this way their data set will remain synchronized with the one in the master.
This file also implements both the `SYNC` and `PSYNC` commands that are
used in order to perform the first synchronization between masters and
replicas, or to continue the replication after a disconnection.
Other C files
---
* `t_hash.c`, `t_list.c`, `t_set.c`, `t_string.c`, `t_zset.c` and `t_stream.c` contains the implementation of the Redis data types. They implement both an API to access a given data type, and the client commands implementations for these data types.
* `ae.c` implements the Redis event loop, it's a self contained library which is simple to read and understand.
* `sds.c` is the Redis string library, check http://github.com/antirez/sds for more information.
* `anet.c` is a library to use POSIX networking in a simpler way compared to the raw interface exposed by the kernel.
* `dict.c` is an implementation of a non-blocking hash table which rehashes incrementally.
* `scripting.c` implements Lua scripting. It is completely self contained from the rest of the Redis implementation and is simple enough to understand if you are familar with the Lua API.
* `cluster.c` implements the Redis Cluster. Probably a good read only after being very familiar with the rest of the Redis code base. If you want to read `cluster.c` make sure to read the [Redis Cluster specification][3].
[3]: http://redis.io/topics/cluster-spec
Anatomy of a Redis command
---
All the Redis commands are defined in the following way:
void foobarCommand(client *c) {
printf("%s",c->argv[1]->ptr); /* Do something with the argument. */
addReply(c,shared.ok); /* Reply something to the client. */
}
The command is then referenced inside `server.c` in the command table:
{"foobar",foobarCommand,2,"rtF",0,NULL,0,0,0,0,0},
In the above example `2` is the number of arguments the command takes,
while `"rtF"` are the command flags, as documented in the command table
top comment inside `server.c`.
After the command operates in some way, it returns a reply to the client,
usually using `addReply()` or a similar function defined inside `networking.c`.
There are tons of commands implementations inside the Redis source code
that can serve as examples of actual commands implementations. To write
a few toy commands can be a good exercise to familiarize with the code base.
There are also many other files not described here, but it is useless to
cover everything. We want to just help you with the first steps.
Eventually you'll find your way inside the Redis code base :-)
Enjoy!
================================================
FILE: Chapter02/redis-6.0.3/TLS.md
================================================
TLS Support
===========
Getting Started
---------------
### Building
To build with TLS support you'll need OpenSSL development libraries (e.g.
libssl-dev on Debian/Ubuntu).
Run `make BUILD_TLS=yes`.
### Tests
To run Redis test suite with TLS, you'll need TLS support for TCL (i.e.
`tcl-tls` package on Debian/Ubuntu).
1. Run `./utils/gen-test-certs.sh` to generate a root CA and a server
certificate.
2. Run `./runtest --tls` or `./runtest-cluster --tls` to run Redis and Redis
Cluster tests in TLS mode.
### Running manually
To manually run a Redis server with TLS mode (assuming `gen-test-certs.sh` was
invoked so sample certificates/keys are available):
./src/redis-server --tls-port 6379 --port 0 \
--tls-cert-file ./tests/tls/redis.crt \
--tls-key-file ./tests/tls/redis.key \
--tls-ca-cert-file ./tests/tls/ca.crt
To connect to this Redis server with `redis-cli`:
./src/redis-cli --tls \
--cert ./tests/tls/redis.crt \
--key ./tests/tls/redis.key \
--cacert ./tests/tls/ca.crt
This will disable TCP and enable TLS on port 6379. It's also possible to have
both TCP and TLS available, but you'll need to assign different ports.
To make a Replica connect to the master using TLS, use `--tls-replication yes`,
and to make Redis Cluster use TLS across nodes use `--tls-cluster yes`.
Connections
-----------
All socket operations now go through a connection abstraction layer that hides
I/O and read/write event handling from the caller.
**Multi-threading I/O is not currently supported for TLS**, as a TLS connection
needs to do its own manipulation of AE events which is not thread safe. The
solution is probably to manage independent AE loops for I/O threads and longer
term association of connections with threads. This may potentially improve
overall performance as well.
Sync IO for TLS is currently implemented in a hackish way, i.e. making the
socket blocking and configuring socket-level timeout. This means the timeout
value may not be so accurate, and there would be a lot of syscall overhead.
However I believe that getting rid of syncio completely in favor of pure async
work is probably a better move than trying to fix that. For replication it would
probably not be so hard. For cluster keys migration it might be more difficult,
but there are probably other good reasons to improve that part anyway.
To-Do List
----------
- [ ] Add session caching support. Check if/how it's handled by clients to
assess how useful/important it is.
- [ ] redis-benchmark support. The current implementation is a mix of using
hiredis for parsing and basic networking (establishing connections), but
directly manipulating sockets for most actions. This will need to be cleaned
up for proper TLS support. The best approach is probably to migrate to hiredis
async mode.
- [ ] redis-cli `--slave` and `--rdb` support.
Multi-port
----------
Consider the implications of allowing TLS to be configured on a separate port,
making Redis listening on multiple ports:
1. Startup banner port notification
2. Proctitle
3. How slaves announce themselves
4. Cluster bus port calculation
================================================
FILE: Chapter02/redis-6.0.3/deps/Makefile
================================================
# Redis dependency Makefile
uname_S:= $(shell sh -c 'uname -s 2>/dev/null || echo not')
CCCOLOR="\033[34m"
LINKCOLOR="\033[34;1m"
SRCCOLOR="\033[33m"
BINCOLOR="\033[37;1m"
MAKECOLOR="\033[32;1m"
ENDCOLOR="\033[0m"
default:
@echo "Explicit target required"
.PHONY: default
# Prerequisites target
.make-prerequisites:
@touch $@
# Clean everything when CFLAGS is different
ifneq ($(shell sh -c '[ -f .make-cflags ] && cat .make-cflags || echo none'), $(CFLAGS))
.make-cflags: distclean
-(echo "$(CFLAGS)" > .make-cflags)
.make-prerequisites: .make-cflags
endif
# Clean everything when LDFLAGS is different
ifneq ($(shell sh -c '[ -f .make-ldflags ] && cat .make-ldflags || echo none'), $(LDFLAGS))
.make-ldflags: distclean
-(echo "$(LDFLAGS)" > .make-ldflags)
.make-prerequisites: .make-ldflags
endif
distclean:
-(cd hiredis && $(MAKE) clean) > /dev/null || true
-(cd linenoise && $(MAKE) clean) > /dev/null || true
-(cd lua && $(MAKE) clean) > /dev/null || true
-(cd jemalloc && [ -f Makefile ] && $(MAKE) distclean) > /dev/null || true
-(rm -f .make-*)
.PHONY: distclean
ifeq ($(BUILD_TLS),yes)
HIREDIS_MAKE_FLAGS = USE_SSL=1
endif
hiredis: .make-prerequisites
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR)
cd hiredis && $(MAKE) static $(HIREDIS_MAKE_FLAGS)
.PHONY: hiredis
linenoise: .make-prerequisites
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR)
cd linenoise && $(MAKE)
.PHONY: linenoise
ifeq ($(uname_S),SunOS)
# Make isinf() available
LUA_CFLAGS= -D__C99FEATURES__=1
endif
LUA_CFLAGS+= -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -DREDIS_STATIC='' $(CFLAGS)
LUA_LDFLAGS+= $(LDFLAGS)
# lua's Makefile defines AR="ar rcu", which is unusual, and makes it more
# challenging to cross-compile lua (and redis). These defines make it easier
# to fit redis into cross-compilation environments, which typically set AR.
AR=ar
ARFLAGS=rcu
lua: .make-prerequisites
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR)
cd lua/src && $(MAKE) all CFLAGS="$(LUA_CFLAGS)" MYLDFLAGS="$(LUA_LDFLAGS)" AR="$(AR) $(ARFLAGS)"
.PHONY: lua
JEMALLOC_CFLAGS= -std=gnu99 -Wall -pipe -g3 -O3 -funroll-loops $(CFLAGS)
JEMALLOC_LDFLAGS= $(LDFLAGS)
jemalloc: .make-prerequisites
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR)
cd jemalloc && ./configure --with-version=5.1.0-0-g0 --with-lg-quantum=3 --with-jemalloc-prefix=je_ --enable-cc-silence CFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)"
cd jemalloc && $(MAKE) CFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)" lib/libjemalloc.a
.PHONY: jemalloc
================================================
FILE: Chapter02/redis-6.0.3/deps/README.md
================================================
This directory contains all Redis dependencies, except for the libc that
should be provided by the operating system.
* **Jemalloc** is our memory allocator, used as replacement for libc malloc on Linux by default. It has good performances and excellent fragmentation behavior. This component is upgraded from time to time.
* **hiredis** is the official C client library for Redis. It is used by redis-cli, redis-benchmark and Redis Sentinel. It is part of the Redis official ecosystem but is developed externally from the Redis repository, so we just upgrade it as needed.
* **linenoise** is a readline replacement. It is developed by the same authors of Redis but is managed as a separated project and updated as needed.
* **lua** is Lua 5.1 with minor changes for security and additional libraries.
How to upgrade the above dependencies
===
Jemalloc
---
Jemalloc is modified with changes that allow us to implement the Redis
active defragmentation logic. However this feature of Redis is not mandatory
and Redis is able to understand if the Jemalloc version it is compiled
against supports such Redis-specific modifications. So in theory, if you
are not interested in the active defragmentation, you can replace Jemalloc
just following tose steps:
1. Remove the jemalloc directory.
2. Substitute it with the new jemalloc source tree.
3. Edit the Makefile localted in the same directory as the README you are
reading, and change the --with-version in the Jemalloc configure script
options with the version you are using. This is required because otherwise
Jemalloc configuration script is broken and will not work nested in another
git repository.
However note that we change Jemalloc settings via the `configure` script of Jemalloc using the `--with-lg-quantum` option, setting it to the value of 3 instead of 4. This provides us with more size classes that better suit the Redis data structures, in order to gain memory efficiency.
If you want to upgrade Jemalloc while also providing support for
active defragmentation, in addition to the above steps you need to perform
the following additional steps:
5. In Jemalloc three, file `include/jemalloc/jemalloc_macros.h.in`, make sure
to add `#define JEMALLOC_FRAG_HINT`.
6. Implement the function `je_get_defrag_hint()` inside `src/jemalloc.c`. You
can see how it is implemented in the current Jemalloc source tree shipped
with Redis, and rewrite it according to the new Jemalloc internals, if they
changed, otherwise you could just copy the old implementation if you are
upgrading just to a similar version of Jemalloc.
Hiredis
---
Hiredis uses the SDS string library, that must be the same version used inside Redis itself. Hiredis is also very critical for Sentinel. Historically Redis often used forked versions of hiredis in a way or the other. In order to upgrade it is advised to take a lot of care:
1. Check with diff if hiredis API changed and what impact it could have in Redis.
2. Make sure thet the SDS library inside Hiredis and inside Redis are compatible.
3. After the upgrade, run the Redis Sentinel test.
4. Check manually that redis-cli and redis-benchmark behave as expecteed, since we have no tests for CLI utilities currently.
Linenoise
---
Linenoise is rarely upgraded as needed. The upgrade process is trivial since
Redis uses a non modified version of linenoise, so to upgrade just do the
following:
1. Remove the linenoise directory.
2. Substitute it with the new linenoise source tree.
Lua
---
We use Lua 5.1 and no upgrade is planned currently, since we don't want to break
Lua scripts for new Lua features: in the context of Redis Lua scripts the
capabilities of 5.1 are usually more than enough, the release is rock solid,
and we definitely don't want to break old scripts.
So upgrading of Lua is up to the Redis project maintainers and should be a
manual procedure performed by taking a diff between the different versions.
Currently we have at least the following differences between official Lua 5.1
and our version:
1. Makefile is modified to allow a different compiler than GCC.
2. We have the implementation source code, and directly link to the following external libraries: `lua_cjson.o`, `lua_struct.o`, `lua_cmsgpack.o` and `lua_bit.o`.
3. There is a security fix in `ldo.c`, line 498: The check for `LUA_SIGNATURE[0]` is removed in order toa void direct bytecode execution.
================================================
FILE: Chapter02/redis-6.0.3/deps/hiredis/.gitignore
================================================
/hiredis-test
/examples/hiredis-example*
/*.o
/*.so
/*.dylib
/*.a
/*.pc
*.dSYM
================================================
FILE: Chapter02/redis-6.0.3/deps/hiredis/.travis.yml
================================================
language: c
sudo: false
compiler:
- gcc
- clang
os:
- linux
- osx
branches:
only:
- staging
- trying
- master
before_script:
- if [ "$TRAVIS_OS_NAME" == "osx" ] ; then brew update; brew install redis; fi
addons:
apt:
packages:
- libc6-dbg
- libc6-dev
- libc6:i386
- libc6-dev-i386
- libc6-dbg:i386
- gcc-multilib
- g++-multilib
- valgrind
env:
- BITS="32"
- BITS="64"
script:
- EXTRA_CMAKE_OPTS="-DENABLE_EXAMPLES:BOOL=ON -DHIREDIS_SSL:BOOL=ON";
if [ "$TRAVIS_OS_NAME" == "osx" ]; then
if [ "$BITS" == "32" ]; then
CFLAGS="-m32 -Werror";
CXXFLAGS="-m32 -Werror";
LDFLAGS="-m32";
EXTRA_CMAKE_OPTS=;
else
CFLAGS="-Werror";
CXXFLAGS="-Werror";
fi;
else
TEST_PREFIX="valgrind --track-origins=yes --leak-check=full";
if [ "$BITS" == "32" ]; then
CFLAGS="-m32 -Werror";
CXXFLAGS="-m32 -Werror";
LDFLAGS="-m32";
EXTRA_CMAKE_OPTS=;
else
CFLAGS="-Werror";
CXXFLAGS="-Werror";
fi;
fi;
export CFLAGS CXXFLAGS LDFLAGS TEST_PREFIX EXTRA_CMAKE_OPTS
- mkdir build/ && cd build/
- cmake .. ${EXTRA_CMAKE_OPTS}
- make VERBOSE=1
- ctest -V
matrix:
include:
# Windows MinGW cross compile on Linux
- os: linux
dist: xenial
compiler: mingw
addons:
apt:
packages:
- ninja-build
- gcc-mingw-w64-x86-64
- g++-mingw-w64-x86-64
script:
- mkdir build && cd build
- CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_BUILD_WITH_INSTALL_RPATH=on
- ninja -v
# Windows MSVC 2017
- os: windows
compiler: msvc
env:
- MATRIX_EVAL="CC=cl.exe && CXX=cl.exe"
before_install:
- eval "${MATRIX_EVAL}"
install:
- choco install ninja
script:
- mkdir build && cd build
- cmd.exe /C '"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" amd64 &&
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release &&
ninja -v'
- ctest -V
================================================
FILE: Chapter02/redis-6.0.3/deps/hiredis/CHANGELOG.md
================================================
### 1.0.0 (unreleased)
**BREAKING CHANGES**:
* Bulk and multi-bulk lengths less than -1 or greater than `LLONG_MAX` are now
protocol errors. This is consistent with the RESP specification. On 32-bit
platforms, the upper bound is lowered to `SIZE_MAX`.
* Change `redisReply.len` to `size_t`, as it denotes the the size of a string
User code should compare this to `size_t` values as well. If it was used to
compare to other values, casting might be necessary or can be removed, if
casting was applied before.
### 0.x.x (unreleased)
**BREAKING CHANGES**:
* Change `redisReply.len` to `size_t`, as it denotes the the size of a string
User code should compare this to `size_t` values as well.
If it was used to compare to other values, casting might be necessary or can be removed, if casting was applied before.
* `redisReplyObjectFunctions.createArray` now takes `size_t` for its length parameter.
### 0.14.0 (2018-09-25)
* Make string2ll static to fix conflict with Redis (Tom Lee [c3188b])
* Use -dynamiclib instead of -shared for OSX (Ryan Schmidt [a65537])
* Use string2ll from Redis w/added tests (Michael Grunder [7bef04, 60f622])
* Makefile - OSX compilation fixes (Ryan Schmidt [881fcb, 0e9af8])
* Remove redundant NULL checks (Justin Brewer [54acc8, 58e6b8])
* Fix bulk and multi-bulk length truncation (Justin Brewer [109197])
* Fix SIGSEGV in OpenBSD by checking for NULL before calling freeaddrinfo (Justin Brewer [546d94])
* Several POSIX compatibility fixes (Justin Brewer [bbeab8, 49bbaa, d1c1b6])
* Makefile - Compatibility fixes (Dimitri Vorobiev [3238cf, 12a9d1])
* Makefile - Fix make install on FreeBSD (Zach Shipko [a2ef2b])
* Makefile - don't assume $(INSTALL) is cp (Igor Gnatenko [725a96])
* Separate side-effect causing function from assert and small cleanup (amallia [b46413, 3c3234])
* Don't send negative values to `__redisAsyncCommand` (Frederik Deweerdt [706129])
* Fix leak if setsockopt fails (Frederik Deweerdt [e21c9c])
* Fix libevent leak (zfz [515228])
* Clean up GCC warning (Ichito Nagata [2ec774])
* Keep track of errno in `__redisSetErrorFromErrno()` as snprintf may use it (Jin Qing [25cd88])
* Solaris compilation fix (Donald Whyte [41b07d])
* Reorder linker arguments when building examples (Tustfarm-heart [06eedd])
* Keep track of subscriptions in case of rapid subscribe/unsubscribe (Hyungjin Kim [073dc8, be76c5, d46999])
* libuv use after free fix (Paul Scott [cbb956])
* Properly close socket fd on reconnect attempt (WSL [64d1ec])
* Skip valgrind in OSX tests (Jan-Erik Rediger [9deb78])
* Various updates for Travis testing OSX (Ted Nyman [fa3774, 16a459, bc0ea5])
* Update libevent (Chris Xin [386802])
* Change sds.h for building in C++ projects (Ali Volkan ATLI [f5b32e])
* Use proper format specifier in redisFormatSdsCommandArgv (Paulino Huerta, Jan-Erik Rediger [360a06, 8655a6])
* Better handling of NULL reply in example code (Jan-Erik Rediger [1b8ed3])
* Prevent overflow when formatting an error (Jan-Erik Rediger [0335cb])
* Compatibility fix for strerror_r (Tom Lee [bb1747])
* Properly detect integer parse/overflow errors (Justin Brewer [93421f])
* Adds CI for Windows and cygwin fixes (owent, [6c53d6, 6c3e40])
* Catch a buffer overflow when formatting the error message
* Import latest upstream sds. This breaks applications that are linked against the old hiredis v0.13
* Fix warnings, when compiled with -Wshadow
* Make hiredis compile in Cygwin on Windows, now CI-tested
* Bulk and multi-bulk lengths less than -1 or greater than `LLONG_MAX` are now
protocol errors. This is consistent with the RESP specification. On 32-bit
platforms, the upper bound is lowered to `SIZE_MAX`.
* Remove backwards compatibility macro's
This removes the following old function aliases, use the new name now:
| Old | New |
| --------------------------- | ---------------------- |
| redisReplyReaderCreate | redisReaderCreate |
| redisReplyReaderCreate | redisReaderCreate |
| redisReplyReaderFree | redisReaderFree |
| redisReplyReaderFeed | redisReaderFeed |
| redisReplyReaderGetReply | redisReaderGetReply |
| redisReplyReaderSetPrivdata | redisReaderSetPrivdata |
| redisReplyReaderGetObject | redisReaderGetObject |
| redisReplyReaderGetError | redisReaderGetError |
* The `DEBUG` variable in the Makefile was renamed to `DEBUG_FLAGS`
Previously it broke some builds for people that had `DEBUG` set to some arbitrary value,
due to debugging other software.
By renaming we avoid unintentional name clashes.
Simply rename `DEBUG` to `DEBUG_FLAGS` in your environment to make it working again.
### 0.13.3 (2015-09-16)
* Revert "Clear `REDIS_CONNECTED` flag when connection is closed".
* Make tests pass on FreeBSD (Thanks, Giacomo Olgeni)
If the `REDIS_CONNECTED` flag is cleared,
the async onDisconnect callback function will never be called.
This causes problems as the disconnect is never reported back to the user.
### 0.13.2 (2015-08-25)
* Prevent crash on pending replies in async code (Thanks, @switch-st)
* Clear `REDIS_CONNECTED` flag when connection is closed (Thanks, Jerry Jacobs)
* Add MacOS X addapter (Thanks, @dizzus)
* Add Qt adapter (Thanks, Pietro Cerutti)
* Add Ivykis adapter (Thanks, Gergely Nagy)
All adapters are provided as is and are only tested where possible.
### 0.13.1 (2015-05-03)
This is a bug fix release.
The new `reconnect` method introduced new struct members, which clashed with pre-defined names in pre-C99 code.
Another commit forced C99 compilation just to make it work, but of course this is not desirable for outside projects.
Other non-C99 code can now use hiredis as usual again.
Sorry for the inconvenience.
* Fix memory leak in async reply handling (Salvatore Sanfilippo)
* Rename struct member to avoid name clash with pre-c99 code (Alex Balashov, ncopa)
### 0.13.0 (2015-04-16)
This release adds a minimal Windows compatibility layer.
The parser, standalone since v0.12.0, can now be compiled on Windows
(and thus used in other client libraries as well)
* Windows compatibility layer for parser code (tzickel)
* Properly escape data printed to PKGCONF file (Dan Skorupski)
* Fix tests when assert() undefined (Keith Bennett, Matt Stancliff)
* Implement a reconnect method for the client context, this changes the structure of `redisContext` (Aaron Bedra)
### 0.12.1 (2015-01-26)
* Fix `make install`: DESTDIR support, install all required files, install PKGCONF in proper location
* Fix `make test` as 32 bit build on 64 bit platform
### 0.12.0 (2015-01-22)
* Add optional KeepAlive support
* Try again on EINTR errors
* Add libuv adapter
* Add IPv6 support
* Remove possibility of multiple close on same fd
* Add ability to bind source address on connect
* Add redisConnectFd() and redisFreeKeepFd()
* Fix getaddrinfo() memory leak
* Free string if it is unused (fixes memory leak)
* Improve redisAppendCommandArgv performance 2.5x
* Add support for SO_REUSEADDR
* Fix redisvFormatCommand format parsing
* Add GLib 2.0 adapter
* Refactor reading code into read.c
* Fix errno error buffers to not clobber errors
* Generate pkgconf during build
* Silence _BSD_SOURCE warnings
* Improve digit counting for multibulk creation
### 0.11.0
* Increase the maximum multi-bulk reply depth to 7.
* Increase the read buffer size from 2k to 16k.
* Use poll(2) instead of select(2) to support large fds (>= 1024).
### 0.10.1
* Makefile overhaul. Important to check out if you override one or more
variables using environment variables or via arguments to the "make" tool.
* Issue #45: Fix potential memory leak for a multi bulk reply with 0 elements
being created by the default reply object functions.
* Issue #43: Don't crash in an asynchronous context when Redis returns an error
reply after the connection has been made (this happens when the maximum
number of connections is reached).
### 0.10.0
* See commit log.
================================================
FILE: Chapter02/redis-6.0.3/deps/hiredis/CMakeLists.txt
================================================
CMAKE_MINIMUM_REQUIRED(VERSION 3.4.0)
INCLUDE(GNUInstallDirs)
PROJECT(hiredis)
OPTION(ENABLE_SSL "Build hiredis_ssl for SSL support" OFF)
MACRO(getVersionBit name)
SET(VERSION_REGEX "^#define ${name} (.+)$")
FILE(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/hiredis.h"
VERSION_BIT REGEX ${VERSION_REGEX})
STRING(REGEX REPLACE ${VERSION_REGEX} "\\1" ${name} "${VERSION_BIT}")
ENDMACRO(getVersionBit)
getVersionBit(HIREDIS_MAJOR)
getVersionBit(HIREDIS_MINOR)
getVersionBit(HIREDIS_PATCH)
getVersionBit(HIREDIS_SONAME)
SET(VERSION "${HIREDIS_MAJOR}.${HIREDIS_MINOR}.${HIREDIS_PATCH}")
MESSAGE("Detected version: ${VERSION}")
PROJECT(hiredis VERSION "${VERSION}")
SET(ENABLE_EXAMPLES OFF CACHE BOOL "Enable building hiredis examples")
ADD_LIBRARY(hiredis SHARED
async.c
dict.c
hiredis.c
net.c
read.c
sds.c
sockcompat.c)
SET_TARGET_PROPERTIES(hiredis
PROPERTIES
VERSION "${HIREDIS_SONAME}")
IF(WIN32 OR MINGW)
TARGET_LINK_LIBRARIES(hiredis PRIVATE ws2_32)
ENDIF()
TARGET_INCLUDE_DIRECTORIES(hiredis PUBLIC .)
CONFIGURE_FILE(hiredis.pc.in hiredis.pc @ONLY)
INSTALL(TARGETS hiredis
DESTINATION "${CMAKE_INSTALL_LIBDIR}")
INSTALL(FILES hiredis.h read.h sds.h async.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)
INSTALL(DIRECTORY adapters
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
IF(ENABLE_SSL)
IF (NOT OPENSSL_ROOT_DIR)
IF (APPLE)
SET(OPENSSL_ROOT_DIR "/usr/local/opt/openssl")
ENDIF()
ENDIF()
FIND_PACKAGE(OpenSSL REQUIRED)
ADD_LIBRARY(hiredis_ssl SHARED
ssl.c)
TARGET_INCLUDE_DIRECTORIES(hiredis_ssl PRIVATE "${OPENSSL_INCLUDE_DIR}")
TARGET_LINK_LIBRARIES(hiredis_ssl PRIVATE ${OPENSSL_LIBRARIES})
CONFIGURE_FILE(hiredis_ssl.pc.in hiredis_ssl.pc @ONLY)
INSTALL(TARGETS hiredis_ssl
DESTINATION "${CMAKE_INSTALL_LIBDIR}")
INSTALL(FILES hiredis_ssl.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hiredis)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/hiredis_ssl.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
ENDIF()
IF(NOT (WIN32 OR MINGW))
ENABLE_TESTING()
ADD_EXECUTABLE(hiredis-test test.c)
TARGET_LINK_LIBRARIES(hiredis-test hiredis)
ADD_TEST(NAME hiredis-test
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/test.sh)
ENDIF()
# Add examples
IF(ENABLE_EXAMPLES)
ADD_SUBDIRECTORY(examples)
ENDIF(ENABLE_EXAMPLES)
================================================
FILE: Chapter02/redis-6.0.3/deps/hiredis/COPYING
================================================
Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>
Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Redis nor the names of its contributors may be used
to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: Chapter02/redis-6.0.3/deps/hiredis/Makefile
================================================
# Hiredis Makefile
# Copyright (C) 2010-2011 Salvatore Sanfilippo <antirez at gmail dot com>
# Copyright (C) 2010-2011 Pieter Noordhuis <pcnoordhuis at gmail dot com>
# This file is released under the BSD license, see the COPYING file
OBJ=net.o hiredis.o sds.o async.o read.o sockcompat.o
SSL_OBJ=ssl.o
EXAMPLES=hiredis-example hiredis-example-libevent hiredis-example-libev hiredis-example-glib
ifeq ($(USE_SSL),1)
EXAMPLES+=hiredis-example-ssl hiredis-example-libevent-ssl
endif
TESTS=hiredis-test
LIBNAME=libhiredis
SSL_LIBNAME=libhiredis_ssl
PKGCONFNAME=hiredis.pc
SSL_PKGCONFNAME=hiredis_ssl.pc
HIREDIS_MAJOR=$(shell grep HIREDIS_MAJOR hiredis.h | awk '{print $$3}')
HIREDIS_MINOR=$(shell grep HIREDIS_MINOR hiredis.h | awk '{print $$3}')
HIREDIS_PATCH=$(shell grep HIREDIS_PATCH hiredis.h | awk '{print $$3}')
HIREDIS_SONAME=$(shell grep HIREDIS_SONAME hiredis.h | awk '{print $$3}')
# Installation related variables and target
PREFIX?=/usr/local
INCLUDE_PATH?=include/hiredis
LIBRARY_PATH?=lib
PKGCONF_PATH?=pkgconfig
INSTALL_INCLUDE_PATH= $(DESTDIR)$(PREFIX)/$(INCLUDE_PATH)
INSTALL_LIBRARY_PATH= $(DESTDIR)$(PREFIX)/$(LIBRARY_PATH)
INSTALL_PKGCONF_PATH= $(INSTALL_LIBRARY_PATH)/$(PKGCONF_PATH)
# redis-server configuration used for testing
REDIS_PORT=56379
REDIS_SERVER=redis-server
define REDIS_TEST_CONFIG
daemonize yes
pidfile /tmp/hiredis-test-redis.pid
port $(REDIS_PORT)
bind 127.0.0.1
unixsocket /tmp/hiredis-test-redis.sock
endef
export REDIS_TEST_CONFIG
# Fallback to gcc when $CC is not in $PATH.
CC:=$(shell sh -c 'type $${CC%% *} >/dev/null 2>/dev/null && echo $(CC) || echo gcc')
CXX:=$(shell sh -c 'type $${CXX%% *} >/dev/null 2>/dev/null && echo $(CXX) || echo g++')
OPTIMIZATION?=-O3
WARNINGS=-Wall -W -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers
DEBUG_FLAGS?= -g -ggdb
REAL_CFLAGS=$(OPTIMIZATION) -fPIC $(CPPFLAGS) $(CFLAGS) $(WARNINGS) $(DEBUG_FLAGS)
REAL_LDFLAGS=$(LDFLAGS)
DYLIBSUFFIX=so
STLIBSUFFIX=a
DYLIB_MINOR_NAME=$(LIBNAME).$(DYLIBSUFFIX).$(HIREDIS_SONAME)
DYLIB_MAJOR_NAME=$(LIBNAME).$(DYLIBSUFFIX).$(HIREDIS_MAJOR)
DYLIBNAME=$(LIBNAME).$(DYLIBSUFFIX)
SSL_DYLIBNAME=$(SSL_LIBNAME).$(DYLIBSUFFIX)
DYLIB_MAKE_CMD=$(CC) -shared -Wl,-soname,$(DYLIB_MINOR_NAME)
STLIBNAME=$(LIBNAME).$(STLIBSUFFIX)
SSL_STLIBNAME=$(SSL_LIBNAME).$(STLIBSUFFIX)
STLIB_MAKE_CMD=$(AR) rcs
# Platform-specific overrides
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
USE_SSL?=0
# This is required for test.c only
ifeq ($(USE_SSL),1)
CFLAGS+=-DHIREDIS_TEST_SSL
endif
ifeq ($(uname_S),Linux)
SSL_LDFLAGS=-lssl -lcrypto
else
OPENSSL_PREFIX?=/usr/local/opt/openssl
CFLAGS+=-I$(OPENSSL_PREFIX)/include
SSL_LDFLAGS+=-L$(OPENSSL_PREFIX)/lib -lssl -lcrypto
endif
ifeq ($(uname_S),SunOS)
REAL_LDFLAGS+= -ldl -lnsl -lsocket
DYLIB_MAKE_CMD=$(CC) -G -o $(DYLIBNAME) -h $(DYLIB_MINOR_NAME) $(LDFLAGS)
endif
ifeq ($(uname_S),Darwin)
DYLIBSUFFIX=dylib
DYLIB_MINOR_NAME=$(LIBNAME).$(HIREDIS_SONAME).$(DYLIBSUFFIX)
DYLIB_MAKE_CMD=$(CC) -dynamiclib -Wl,-install_name,$(PREFIX)/$(LIBRARY_PATH)/$(DYLIB_MINOR_NAME) -o $(DYLIBNAME) $(LDFLAGS)
endif
all: $(DYLIBNAME) $(STLIBNAME) hiredis-test $(PKGCONFNAME)
ifeq ($(USE_SSL),1)
all: $(SSL_DYLIBNAME) $(SSL_STLIBNAME) $(SSL_PKGCONFNAME)
endif
# Deps (use make dep to generate this)
async.o: async.c fmacros.h async.h hiredis.h read.h sds.h net.h dict.c dict.h
dict.o: dict.c fmacros.h dict.h
hiredis.o: hiredis.c fmacros.h hiredis.h read.h sds.h net.h win32.h
net.o: net.c fmacros.h net.h hiredis.h read.h sds.h sockcompat.h win32.h
read.o: read.c fmacros.h read.h sds.h
sds.o: sds.c sds.h
sockcompat.o: sockcompat.c sockcompat.h
ssl.o: ssl.c hiredis.h
test.o: test.c fmacros.h hiredis.h read.h sds.h
$(DYLIBNAME): $(OBJ)
$(DYLIB_MAKE_CMD) -o $(DYLIBNAME) $(OBJ) $(REAL_LDFLAGS)
$(STLIBNAME): $(OBJ)
$(STLIB_MAKE_CMD) $(STLIBNAME) $(OBJ)
$(SSL_DYLIBNAME): $(SSL_OBJ)
$(DYLIB_MAKE_CMD) -o $(SSL_DYLIBNAME) $(SSL_OBJ) $(REAL_LDFLAGS) $(SSL_LDFLAGS)
$(SSL_STLIBNAME): $(SSL_OBJ)
$(STLIB_MAKE_CMD) $(SSL_STLIBNAME) $(SSL_OBJ)
dynamic: $(DYLIBNAME)
static: $(STLIBNAME)
ifeq ($(USE_SSL),1)
dynamic: $(SSL_DYLIBNAME)
static: $(SSL_STLIBNAME)
endif
# Binaries:
hiredis-example-libevent: examples/example-libevent.c adapters/libevent.h $(STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) -I. $< -levent $(STLIBNAME) $(REAL_LDFLAGS)
hiredis-example-libevent-ssl: examples/example-libevent-ssl.c adapters/libevent.h $(STLIBNAME) $(SSL_STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) -I. $< -levent $(STLIBNAME) $(SSL_STLIBNAME) $(REAL_LDFLAGS) $(SSL_LDFLAGS)
hiredis-example-libev: examples/example-libev.c adapters/libev.h $(STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) -I. $< -lev $(STLIBNAME) $(REAL_LDFLAGS)
hiredis-example-glib: examples/example-glib.c adapters/glib.h $(STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) -I. $< $(shell pkg-config --cflags --libs glib-2.0) $(STLIBNAME) $(REAL_LDFLAGS)
hiredis-example-ivykis: examples/example-ivykis.c adapters/ivykis.h $(STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) -I. $< -livykis $(STLIBNAME) $(REAL_LDFLAGS)
hiredis-example-macosx: examples/example-macosx.c adapters/macosx.h $(STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) -I. $< -framework CoreFoundation $(STLIBNAME) $(REAL_LDFLAGS)
hiredis-example-ssl: examples/example-ssl.c $(STLIBNAME) $(SSL_STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) -I. $< $(STLIBNAME) $(SSL_STLIBNAME) $(REAL_LDFLAGS) $(SSL_LDFLAGS)
ifndef AE_DIR
hiredis-example-ae:
@echo "Please specify AE_DIR (e.g. <redis repository>/src)"
@false
else
hiredis-example-ae: examples/example-ae.c adapters/ae.h $(STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) -I. -I$(AE_DIR) $< $(AE_DIR)/ae.o $(AE_DIR)/zmalloc.o $(AE_DIR)/../deps/jemalloc/lib/libjemalloc.a -pthread $(STLIBNAME)
endif
ifndef LIBUV_DIR
hiredis-example-libuv:
@echo "Please specify LIBUV_DIR (e.g. ../libuv/)"
@false
else
hiredis-example-libuv: examples/example-libuv.c adapters/libuv.h $(STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) -I. -I$(LIBUV_DIR)/include $< $(LIBUV_DIR)/.libs/libuv.a -lpthread -lrt $(STLIBNAME) $(REAL_LDFLAGS)
endif
ifeq ($(and $(QT_MOC),$(QT_INCLUDE_DIR),$(QT_LIBRARY_DIR)),)
hiredis-example-qt:
@echo "Please specify QT_MOC, QT_INCLUDE_DIR AND QT_LIBRARY_DIR"
@false
else
hiredis-example-qt: examples/example-qt.cpp adapters/qt.h $(STLIBNAME)
$(QT_MOC) adapters/qt.h -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore | \
$(CXX) -x c++ -o qt-adapter-moc.o -c - $(REAL_CFLAGS) -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore
$(QT_MOC) examples/example-qt.h -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore | \
$(CXX) -x c++ -o qt-example-moc.o -c - $(REAL_CFLAGS) -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore
$(CXX) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore -L$(QT_LIBRARY_DIR) qt-adapter-moc.o qt-example-moc.o $< -pthread $(STLIBNAME) -lQtCore
endif
hiredis-example: examples/example.c $(STLIBNAME)
$(CC) -o examples/$@ $(REAL_CFLAGS) -I. $< $(STLIBNAME) $(REAL_LDFLAGS)
examples: $(EXAMPLES)
TEST_LIBS = $(STLIBNAME)
ifeq ($(USE_SSL),1)
TEST_LIBS += $(SSL_STLIBNAME) -lssl -lcrypto -lpthread
endif
hiredis-test: test.o $(TEST_LIBS)
hiredis-%: %.o $(STLIBNAME)
$(CC) $(REAL_CFLAGS) -o $@ $< $(TEST_LIBS) $(REAL_LDFLAGS)
test: hiredis-test
./hiredis-test
check: hiredis-test
TEST_SSL=$(USE_SSL) ./test.sh
.c.o:
$(CC) -std=c99 -pedantic -c $(REAL_CFLAGS) $<
clean:
rm -rf $(DYLIBNAME) $(STLIBNAME) $(SSL_DYLIBNAME) $(SSL_STLIBNAME) $(TESTS) $(PKGCONFNAME) examples/hiredis-example* *.o *.gcda *.gcno *.gcov
dep:
$(CC) $(CPPFLAGS) $(CFLAGS) -MM *.c
INSTALL?= cp -pPR
$(PKGCONFNAME): hiredis.h
@echo "Generating $@ for pkgconfig..."
@echo prefix=$(PREFIX) > $@
@echo exec_prefix=\$${prefix} >> $@
@echo libdir=$(PREFIX)/$(LIBRARY_PATH) >> $@
@echo includedir=$(PREFIX)/$(INCLUDE_PATH) >> $@
@echo >> $@
@echo Name: hiredis >> $@
@echo Description: Minimalistic C client library for Redis. >> $@
@echo Version: $(HIREDIS_MAJOR).$(HIREDIS_MINOR).$(HIREDIS_PATCH) >> $@
@echo Libs: -L\$${libdir} -lhiredis >> $@
@echo Cflags: -I\$${includedir} -D_FILE_OFFSET_BITS=64 >> $@
$(SSL_PKGCONFNAME): hiredis.h
@echo "Generating $@ for pkgconfig..."
@echo prefix=$(PREFIX) > $@
@echo exec_prefix=\$${prefix} >> $@
@echo libdir=$(PREFIX)/$(LIBRARY_PATH) >> $@
@echo includedir=$(PREFIX)/$(INCLUDE_PATH) >> $@
@echo >> $@
@echo Name: hiredis_ssl >> $@
@echo Description: SSL Support for hiredis. >> $@
@echo Version: $(HIREDIS_MAJOR).$(HIREDIS_MINOR).$(HIREDIS_PATCH) >> $@
@echo Requires: hiredis >> $@
@echo Libs: -L\$${libdir} -lhiredis_ssl >> $@
@echo Libs.private: -lssl -lcrypto >> $@
install: $(DYLIBNAME) $(STLIBNAME) $(PKGCONFNAME)
mkdir -p $(INSTALL_INCLUDE_PATH) $(INSTALL_INCLUDE_PATH)/adapters $(INSTALL_LIBRARY_PATH)
$(INSTALL) hiredis.h async.h read.h sds.h $(INSTALL_INCLUDE_PATH)
$(INSTALL) adapters/*.h $(INSTALL_INCLUDE_PATH)/adapters
$(INSTALL) $(DYLIBNAME) $(INSTALL_LIBRARY_PATH)/$(DYLIB_MINOR_NAME)
cd $(INSTALL_LIBRARY_PATH) && ln -sf $(DYLIB_MINOR_NAME) $(DYLIBNAME)
$(INSTALL) $(STLIBNAME) $(INSTALL_LIBRARY_PATH)
mkdir -p $(INSTALL_PKGCONF_PATH)
$(INSTALL) $(PKGCONFNAME) $(INSTALL_PKGCONF_PATH)
32bit:
@echo ""
@echo "WARNING: if this fails under Linux you probably need to install libc6-dev-i386"
@echo ""
$(MAKE) CFLAGS="-m32" LDFLAGS="-m32"
32bit-vars:
$(eval CFLAGS=-m32)
$(eval LDFLAGS=-m32)
gprof:
$(MAKE) CFLAGS="-pg" LDFLAGS="-pg"
gcov:
$(MAKE) CFLAGS="-fprofile-arcs -ftest-coverage" LDFLAGS="-fprofile-arcs"
coverage: gcov
make check
mkdir -p tmp/lcov
lcov -d . -c -o tmp/lcov/hiredis.info
genhtml --legend -o tmp/lcov/report tmp/lcov/hiredis.info
noopt:
$(MAKE) OPTIMIZATION=""
.PHONY: all test check clean dep install 32bit 32bit-vars gprof gcov noopt
================================================
FILE: Chapter02/redis-6.0.3/deps/hiredis/README.md
================================================
[](https://travis-ci.org/redis/hiredis)
**This Readme reflects the latest changed in the master branch. See [v0.13.3](https://github.com/redis/hiredis/tree/v0.13.3) for the Readme and documentation for the latest release.**
# HIREDIS
Hiredis is a minimalistic C client library for the [Redis](http://redis.io/) database.
It is minimalistic because it just adds minimal support for the protocol, but
at the same time it uses a high level printf-alike API in order to make it
much higher level than otherwise suggested by its minimal code base and the
lack of explicit bindings for every Redis command.
Apart from supporting sending commands and receiving replies, it comes with
a reply parser that is decoupled from the I/O layer. It
is a stream parser designed for easy reusability, which can for instance be used
in higher level language bindings for efficient reply parsing.
Hiredis only supports the binary-safe Redis protocol, so you can use it with any
Redis version >= 1.2.0.
The library comes with multiple APIs. There is the
*synchronous API*, the *asynchronous API* and the *reply parsing API*.
## Upgrading to `1.0.0`
Version 1.0.0 marks a stable release of hiredis.
It includes some minor breaking changes, mostly to make the exposed API more uniform and self-explanatory.
It also bundles the updated `sds` library, to sync up with upstream and Redis.
For most applications a recompile against the new hiredis should be enough.
For code changes see the [Changelog](CHANGELOG.md).
## Upgrading from `<0.9.0`
Version 0.9.0 is a major overhaul of hiredis in every aspect. However, upgrading existing
code using hiredis should not be a big pain. The key thing to keep in mind when
upgrading is that hiredis >= 0.9.0 uses a `redisContext*` to keep state, in contrast to
the stateless 0.0.1 that only has a file descriptor to work with.
## Synchronous API
To consume the synchronous API, there are only a few function calls that need to be introduced:
```c
redisContext *redisConnect(const char *ip, int port);
void *redisCommand(redisContext *c, const char *format, ...);
void freeReplyObject(void *reply);
```
### Connecting
The function `redisConnect` is used to create a so-called `redisContext`. The
context is where Hiredis holds state for a connection. The `redisContext`
struct has an integer `err` field that is non-zero when the connection is in
an error state. The field `errstr` will contain a string with a description of
the error. More information on errors can be found in the **Errors** section.
After trying to connect to Redis using `redisConnect` you should
check the `err` field to see if establishing the connection was successful:
```c
redisContext *c = redisConnect("127.0.0.1", 6379);
if (c == NULL || c->err) {
if (c) {
printf("Error: %s\n", c->errstr);
// handle error
} else {
printf("Can't allocate redis context\n");
}
}
```
*Note: A `redisContext` is not thread-safe.*
### Sending commands
There are several ways to issue commands to Redis. The first that will be introduced is
`redisCommand`. This function takes a format similar to printf. In the simplest form,
it is used like this:
```c
reply = redisCommand(context, "SET foo bar");
```
The specifier `%s` interpolates a string in the command, and uses `strlen` to
determine the length of the string:
```c
reply = redisCommand(context, "SET foo %s", value);
```
When you need to pass binary safe strings in a command, the `%b` specifier can be
used. Together with a pointer to the string, it requires a `size_t` length argument
of the string:
```c
reply = redisCommand(context, "SET foo %b", value, (size_t) valuelen);
```
Internally, Hiredis splits the command in different arguments and will
convert it to the protocol used to communicate with Redis.
One or more spaces separates arguments, so you can use the specifiers
anywhere in an argument:
```c
reply = redisCommand(context, "SET key:%s %s", myid, value);
```
### Using replies
The return value of `redisCommand` holds a reply when the command was
successfully executed. When an error occurs, the return value is `NULL` and
the `err` field in the context will be set (see section on **Errors**).
Once an error is returned the context cannot be reused and you should set up
a new connection.
The standard replies that `redisCommand` are of the type `redisReply`. The
`type` field in the `redisReply` should be used to test what kind of reply
was received:
* **`REDIS_REPLY_STATUS`**:
* The command replied with a status reply. The status string can be accessed using `reply->str`.
The length of this string can be accessed using `reply->len`.
* **`REDIS_REPLY_ERROR`**:
* The command replied with an error. The error string can be accessed identical to `REDIS_REPLY_STATUS`.
* **`REDIS_REPLY_INTEGER`**:
* The command replied with an integer. The integer value can be accessed using the
`reply->integer` field of type `long long`.
* **`REDIS_REPLY_NIL`**:
* The command replied with a **nil** object. There is no data to access.
* **`REDIS_REPLY_STRING`**:
* A bulk (string) reply. The value of the reply can be accessed using `reply->str`.
The length of this string can be accessed using `reply->len`.
* **`REDIS_REPLY_ARRAY`**:
* A multi bulk reply. The number of elements in the multi bulk reply is stored in
`reply->elements`. Every element in the multi bulk reply is a `redisReply` object as well
and can be accessed via `reply->element[..index..]`.
Redis may reply with nested arrays but this is fully supported.
Replies should be freed using the `freeReplyObject()` function.
Note that this function will take care of freeing sub-reply objects
contained in arrays and nested arrays, so there is no need for the user to
free the sub replies (it is actually harmful and will corrupt the memory).
**Important:** the current version of hiredis (0.10.0) frees replies when the
asynchronous API is used. This means you should not call `freeReplyObject` when
you use this API. The reply is cleaned up by hiredis _after_ the callback
returns. This behavior will probably change in future releases, so make sure to
keep an eye on the changelog when upgrading (see issue #39).
### Cleaning up
To disconnect and free the context the following function can be used:
```c
void redisFree(redisContext *c);
```
This function immediately closes the socket and then frees the allocations done in
creating the context.
### Sending commands (cont'd)
Together with `redisCommand`, the function `redisCommandArgv` can be used to issue commands.
It has the following prototype:
```c
void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
```
It takes the number of arguments `argc`, an array of strings `argv` and the lengths of the
arguments `argvlen`. For convenience, `argvlen` may be set to `NULL` and the function will
use `strlen(3)` on every argument to determine its length. Obviously, when any of the arguments
need to be binary safe, the entire array of lengths `argvlen` should be provided.
The return value has the same semantic as `redisCommand`.
### Pipelining
To explain how Hiredis supports pipelining in a blocking connection, there needs to be
understanding of the internal execution flow.
When any of the functions in the `redisCommand` family is called, Hiredis first formats the
command according to the Redis protocol. The formatted command is then put in the output buffer
of the context. This output buffer is dynamic, so it can hold any number of commands.
After the command is put in the output buffer, `redisGetReply` is called. This function has the
following two execution paths:
1. The input buffer is non-empty:
* Try to parse a single reply from the input buffer and return it
* If no reply could be parsed, continue at *2*
2. The input buffer is empty:
* Write the **entire** output buffer to the socket
* Read from the socket until a single reply could be parsed
The function `redisGetReply` is exported as part of the Hiredis API and can be used when a reply
is expected on the socket. To pipeline commands, the only things that needs to be done is
filling up the output buffer. For this cause, two commands can be used that are identical
to the `redisCommand` family, apart from not returning a reply:
```c
void redisAppendCommand(redisContext *c, const char *format, ...);
void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
```
After calling either function one or more times, `redisGetReply` can be used to receive the
subsequent replies. The return value for this function is either `REDIS_OK` or `REDIS_ERR`, where
the latter means an error occurred while reading a reply. Just as with the other commands,
the `err` field in the context can be used to find out what the cause of this error is.
The following examples shows a simple pipeline (resulting in only a single call to `write(2)` and
a single call to `read(2)`):
```c
redisReply *reply;
redisAppendCommand(context,"SET foo bar");
redisAppendCommand(context,"GET foo");
redisGetReply(context,&reply); // reply for SET
freeReplyObject(reply);
redisGetReply(context,&reply); // reply for GET
freeReplyObject(reply);
```
This API can also be used to implement a blocking subscriber:
```c
reply = redisCommand(context,"SUBSCRIBE foo");
freeReplyObject(reply);
while(redisGetReply(context,&reply) == REDIS_OK) {
// consume message
freeReplyObject(reply);
}
```
### Errors
When a function call is not successful, depending on the function either `NULL` or `REDIS_ERR` is
returned. The `err` field inside the context will be non-zero and set to one of the
following constants:
* **`REDIS_ERR_IO`**:
There was an I/O error while creating the connection, trying to write
to the socket or read from the socket. If you included `errno.h` in your
application, you can use the global `errno` variable to find out what is
wrong.
* **`REDIS_ERR_EOF`**:
The server closed the connection which resulted in an empty read.
* **`REDIS_ERR_PROTOCOL`**:
There was an error while parsing the protocol.
* **`REDIS_ERR_OTHER`**:
Any other error. Currently, it is only used when a specified hostname to connect
to cannot be resolved.
In every case, the `errstr` field in the context will be set to hold a string representation
of the error.
## Asynchronous API
Hiredis comes with an asynchronous API that works easily with any event library.
Examples are bundled that show using Hiredis with [libev](http://software.schmorp.de/pkg/libev.html)
and [libevent](http://monkey.org/~provos/libevent/).
### Connecting
The function `redisAsyncConnect` can be used to establish a non-blocking connection to
Redis. It returns a pointer to the newly created `redisAsyncContext` struct. The `err` field
should be checked after creation to see if there were errors creating the connection.
Because the connection that will be created is non-blocking, the kernel is not able to
instantly return if the specified host and port is able to accept a connection.
*Note: A `redisAsyncContext` is not thread-safe.*
```c
redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379);
if (c->err) {
printf("Error: %s\n", c->errstr);
// handle error
}
```
The asynchronous context can hold a disconnect callback function that is called when the
connection is disconnected (either because of an error or per user request). This function should
have the following prototype:
```c
void(const redisAsyncContext *c, int status);
```
On a disconnect, the `status` argument is set to `REDIS_OK` when disconnection was initiated by the
user, or `REDIS_ERR` when the disconnection was caused by an error. When it is `REDIS_ERR`, the `err`
field in the context can be accessed to find out the cause of the error.
The context object is always freed after the disconnect callback fired. When a reconnect is needed,
the disconnect callback is a good point to do so.
Setting the disconnect callback can only be done once per context. For subsequent calls it will
return `REDIS_ERR`. The function to set the disconnect callback has the following prototype:
```c
int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn);
```
`ac->data` may be used to pass user data to this callback, the same can be done for redisConnectCallback.
### Sending commands and their callbacks
In an asynchronous context, commands are automatically pipelined due to the nature of an event loop.
Therefore, unlike the synchronous API, there is only a single way to send commands.
Because commands are sent to Redis asynchronously, issuing a command requires a callback function
that is called when the reply is received. Reply callbacks should have the following prototype:
```c
void(redisAsyncContext *c, void *reply, void *privdata);
```
The `privdata` argument can be used to curry arbitrary data to the callback from the point where
the command is initially queued for execution.
The functions that can be used to issue commands in an asynchronous context are:
```c
int redisAsyncCommand(
redisAsyncContext *ac, redisCallbackFn *fn, void *privdata,
const char *format, ...);
int redisAsyncCommandArgv(
redisAsyncContext *ac, redisCallbackFn *fn, void *privdata,
int argc, const char **argv, const size_t *argvlen);
```
Both functions work like their blocking counterparts. The return value is `REDIS_OK` when the command
was successfully added to the output buffer and `REDIS_ERR` otherwise. Example: when the connection
is being disconnected per user-request, no new commands may be added to the output buffer and `REDIS_ERR` is
returned on calls to the `redisAsyncCommand` family.
If the reply for a command with a `NULL` callback is read, it is immediately freed. When the callback
for a command is non-`NULL`, the memory is freed immediately following the callback: the reply is only
valid for the duration of the callback.
All pending callbacks are called with a `NULL` reply when the context encountered an error.
### Disconnecting
An asynchronous connection can be terminated using:
```c
void redisAsyncDisconnect(redisAsyncContext *ac);
```
When this function is called, the connection is **not** immediately terminated. Instead, new
commands are no longer accepted and the connection is only terminated when all pending commands
have been written to the socket, their respective replies have been read and their respective
callbacks have been executed. After this, the disconnection callback is executed with the
`REDIS_OK` status and the context object is freed.
### Hooking it up to event library *X*
There are a few hooks that need to be set on the context object after it is created.
See the `adapters/` directory for bindings to *libev* and *libevent*.
## Reply parsing API
Hiredis comes with a reply parsing API that makes it easy for writing higher
level language bindings.
The reply parsing API consists of the following functions:
```c
redisReader *redisReaderCreate(void);
void redisReaderFree(redisReader *reader);
int redisReaderFeed(redisReader *reader, const char *buf, size_t len);
int redisReaderGetReply(redisReader *reader, void **reply);
```
The same set of functions are used internally by hiredis when creating a
normal Redis context, the above API just exposes it to the user for a direct
usage.
### Usage
The function `redisReaderCreate` creates a `redisReader` structure that holds a
buffer with unparsed data and state for the protocol parser.
Incoming data -- most likely from a socket -- can be placed in the internal
buffer of the `redisReader` using `redisReaderFeed`. This function will make a
copy of the buffer pointed to by `buf` for `len` bytes. This data is parsed
when `redisReaderGetReply` is called. This function returns an integer status
and a reply object (as described above) via `void **reply`. The returned status
can be either `REDIS_OK` or `REDIS_ERR`, where the latter means something went
wrong (either a protocol error, or an out of memory error).
The parser limits the level of nesting for multi bulk payloads to 7. If the
multi bulk nesting level is higher than this, the parser returns an error.
### Customizing replies
The function `redisReaderGetReply` creates `redisReply` and makes the function
argument `reply` point to the created `redisReply` variable. For instance, if
the response of type `REDIS_REPLY_STATUS` then the `str` field of `redisReply`
will hold the status as a vanilla C string. However, the functions that are
responsible for creating instances of the `redisReply` can be customized by
setting the `fn` field on the `redisReader` struct. This should be done
immediately after creating the `redisReader`.
For example, [hiredis-rb](https://github.com/pietern/hiredis-rb/blob/master/ext/hiredis_ext/reader.c)
uses customized reply object functions to create Ruby objects.
### Reader max buffer
Both when using the Reader API directly or when using it indirectly via a
normal Redis context, the redisReader structure uses a buffer in order to
accumulate data from the server.
Usually this buffer is destroyed when it is empty and is larger than 16
KiB in order to avoid wasting memory in unused buffers
However when working with very big payloads destroying the buffer may slow
down performances considerably, so it is possible to modify the max size of
an idle buffer changing the value of the `maxbuf` field of the reader structure
to the desired value. The special value of 0 means that there is no maximum
value for an idle buffer, so the buffer will never get freed.
For instance if you have a normal Redis context you can set the maximum idle
buffer to zero (unlimited) just with:
```c
context->reader->maxbuf = 0;
```
This should be done only in order to maximize performances when working with
large payloads. The context should be set back to `REDIS_READER_MAX_BUF` again
as soon as possible in order to prevent allocation of useless memory.
## AUTHORS
Hiredis was written by Salvatore Sanfilippo (antirez at gmail) and
Pieter Noordhuis (pcnoordhuis at gmail) and is released under the BSD license.
Hiredis is currently maintained by Matt Stancliff (matt at genges dot com) and
Jan-Erik Rediger (janerik at fnordig dot com)
================================================
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/ae.h
================================================
/*
* Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Redis nor the names of its contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __HIREDIS_AE_H__
#define __HIREDIS_AE_H__
#include <sys/types.h>
#include <ae.h>
#include "../hiredis.h"
#include "../async.h"
typedef struct redisAeEvents {
redisAsyncContext *context;
aeEventLoop *loop;
int fd;
int reading, writing;
} redisAeEvents;
static void redisAeReadEvent(aeEventLoop *el, int fd, void *privdata, int mask) {
((void)el); ((void)fd); ((void)mask);
redisAeEvents *e = (redisAeEvents*)privdata;
redisAsyncHandleRead(e->context);
}
static void redisAeWriteEvent(aeEventLoop *el, int fd, void *privdata, int mask) {
((void)el); ((void)fd); ((void)mask);
redisAeEvents *e = (redisAeEvents*)privdata;
redisAsyncHandleWrite(e->context);
}
static void redisAeAddRead(void *privdata) {
redisAeEvents *e = (redisAeEvents*)privdata;
aeEventLoop *loop = e->loop;
if (!e->reading) {
e->reading = 1;
aeCreateFileEvent(loop,e->fd,AE_READABLE,redisAeReadEvent,e);
}
}
static void redisAeDelRead(void *privdata) {
redisAeEvents *e = (redisAeEvents*)privdata;
aeEventLoop *loop = e->loop;
if (e->reading) {
e->reading = 0;
aeDeleteFileEvent(loop,e->fd,AE_READABLE);
}
}
static void redisAeAddWrite(void *privdata) {
redisAeEvents *e = (redisAeEvents*)privdata;
aeEventLoop *loop = e->loop;
if (!e->writing) {
e->writing = 1;
aeCreateFileEvent(loop,e->fd,AE_WRITABLE,redisAeWriteEvent,e);
}
}
static void redisAeDelWrite(void *privdata) {
redisAeEvents *e = (redisAeEvents*)privdata;
aeEventLoop *loop = e->loop;
if (e->writing) {
e->writing = 0;
aeDeleteFileEvent(loop,e->fd,AE_WRITABLE);
}
}
static void redisAeCleanup(void *privdata) {
redisAeEvents *e = (redisAeEvents*)privdata;
redisAeDelRead(privdata);
redisAeDelWrite(privdata);
free(e);
}
static int redisAeAttach(aeEventLoop *loop, redisAsyncContext *ac) {
redisContext *c = &(ac->c);
redisAeEvents *e;
/* Nothing should be attached when something is already attached */
if (ac->ev.data != NULL)
return REDIS_ERR;
/* Create container for context and r/w events */
e = (redisAeEvents*)malloc(sizeof(*e));
e->context = ac;
e->loop = loop;
e->fd = c->fd;
e->reading = e->writing = 0;
/* Register functions to start/stop listening for events */
ac->ev.addRead = redisAeAddRead;
ac->ev.delRead = redisAeDelRead;
ac->ev.addWrite = redisAeAddWrite;
ac->ev.delWrite = redisAeDelWrite;
ac->ev.cleanup = redisAeCleanup;
ac->ev.data = e;
return REDIS_OK;
}
#endif
================================================
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/glib.h
================================================
#ifndef __HIREDIS_GLIB_H__
#define __HIREDIS_GLIB_H__
#include <glib.h>
#include "../hiredis.h"
#include "../async.h"
typedef struct
{
GSource source;
redisAsyncContext *ac;
GPollFD poll_fd;
} RedisSource;
static void
redis_source_add_read (gpointer data)
{
RedisSource *source = (RedisSource *)data;
g_return_if_fail(source);
source->poll_fd.events |= G_IO_IN;
g_main_context_wakeup(g_source_get_context((GSource *)data));
}
static void
redis_source_del_read (gpointer data)
{
RedisSource *source = (RedisSource *)data;
g_return_if_fail(source);
source->poll_fd.events &= ~G_IO_IN;
g_main_context_wakeup(g_source_get_context((GSource *)data));
}
static void
redis_source_add_write (gpointer data)
{
RedisSource *source = (RedisSource *)data;
g_return_if_fail(source);
source->poll_fd.events |= G_IO_OUT;
g_main_context_wakeup(g_source_get_context((GSource *)data));
}
static void
redis_source_del_write (gpointer data)
{
RedisSource *source = (RedisSource *)data;
g_return_if_fail(source);
source->poll_fd.events &= ~G_IO_OUT;
g_main_context_wakeup(g_source_get_context((GSource *)data));
}
static void
redis_source_cleanup (gpointer data)
{
RedisSource *source = (RedisSource *)data;
g_return_if_fail(source);
redis_source_del_read(source);
redis_source_del_write(source);
/*
* It is not our responsibility to remove ourself from the
* current main loop. However, we will remove the GPollFD.
*/
if (source->poll_fd.fd >= 0) {
g_source_remove_poll((GSource *)data, &source->poll_fd);
source->poll_fd.fd = -1;
}
}
static gboolean
redis_source_prepare (GSource *source,
gint *timeout_)
{
RedisSource *redis = (RedisSource *)source;
*timeout_ = -1;
return !!(redis->poll_fd.events & redis->poll_fd.revents);
}
static gboolean
redis_source_check (GSource *source)
{
RedisSource *redis = (RedisSource *)source;
return !!(redis->poll_fd.events & redis->poll_fd.revents);
}
static gboolean
redis_source_dispatch (GSource *source,
GSourceFunc callback,
gpointer user_data)
{
RedisSource *redis = (RedisSource *)source;
if ((redis->poll_fd.revents & G_IO_OUT)) {
redisAsyncHandleWrite(redis->ac);
redis->poll_fd.revents &= ~G_IO_OUT;
}
if ((redis->poll_fd.revents & G_IO_IN)) {
redisAsyncHandleRead(redis->ac);
redis->poll_fd.revents &= ~G_IO_IN;
}
if (callback) {
return callback(user_data);
}
return TRUE;
}
static void
redis_source_finalize (GSource *source)
{
RedisSource *redis = (RedisSource *)source;
if (redis->poll_fd.fd >= 0) {
g_source_remove_poll(source, &redis->poll_fd);
redis->poll_fd.fd = -1;
}
}
static GSource *
redis_source_new (redisAsyncContext *ac)
{
static GSourceFuncs source_funcs = {
.prepare = redis_source_prepare,
.check = redis_source_check,
.dispatch = redis_source_dispatch,
.finalize = redis_source_finalize,
};
redisContext *c = &ac->c;
gitextract_gn_xoge9/ ├── .gitignore ├── Chapter01/ │ └── codes/ │ ├── TestRAII1/ │ │ ├── ReadMe.txt │ │ ├── TestRAII1.cpp │ │ ├── TestRAII1.sln │ │ ├── TestRAII1.vcxproj │ │ ├── TestRAII1.vcxproj.filters │ │ ├── TestRAII2.cpp │ │ ├── TestRAII3.cpp │ │ ├── TestRAII4.cpp │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ ├── construct_complex_objects.cpp │ ├── test_auto_ptr.cpp │ ├── test_custom_foreach_loop.cpp │ ├── test_initializer_list.cpp │ ├── test_map_insert_or_assign.cpp │ ├── test_map_try_emplace.cpp │ ├── test_map_try_emplace_with_directobject.cpp │ ├── test_map_try_emplace_with_smartpointer.cpp │ ├── test_map_try_emplace_with_smartpointer2.cpp │ ├── test_shared_ptr_use_count.cpp │ ├── test_std_enable_shared_from_this.cpp │ ├── test_std_enable_shared_from_this_problem.cpp │ ├── test_unique_ptr.cpp │ ├── test_unique_ptr_deletor.cpp │ ├── test_unique_ptr_with_array.cpp │ └── test_weak_ptr.cpp ├── Chapter02/ │ ├── VisualGDB 下载与安装.md │ ├── cgdb下载与安装.md │ ├── codes/ │ │ └── main.cpp │ └── redis-6.0.3/ │ ├── .github/ │ │ └── workflows/ │ │ ├── ci.yml │ │ └── daily.yml │ ├── .gitignore │ ├── 00-RELEASENOTES │ ├── BUGS │ ├── CONTRIBUTING │ ├── COPYING │ ├── INSTALL │ ├── MANIFESTO │ ├── Makefile │ ├── README.md │ ├── TLS.md │ ├── deps/ │ │ ├── Makefile │ │ ├── README.md │ │ ├── hiredis/ │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── CHANGELOG.md │ │ │ ├── CMakeLists.txt │ │ │ ├── COPYING │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── adapters/ │ │ │ │ ├── ae.h │ │ │ │ ├── glib.h │ │ │ │ ├── ivykis.h │ │ │ │ ├── libev.h │ │ │ │ ├── libevent.h │ │ │ │ ├── libuv.h │ │ │ │ ├── macosx.h │ │ │ │ └── qt.h │ │ │ ├── appveyor.yml │ │ │ ├── async.c │ │ │ ├── async.h │ │ │ ├── async_private.h │ │ │ ├── dict.c │ │ │ ├── dict.h │ │ │ ├── examples/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── example-ae.c │ │ │ │ ├── example-glib.c │ │ │ │ ├── example-ivykis.c │ │ │ │ ├── example-libev.c │ │ │ │ ├── example-libevent-ssl.c │ │ │ │ ├── example-libevent.c │ │ │ │ ├── example-libuv.c │ │ │ │ ├── example-macosx.c │ │ │ │ ├── example-qt.cpp │ │ │ │ ├── example-qt.h │ │ │ │ ├── example-ssl.c │ │ │ │ └── example.c │ │ │ ├── fmacros.h │ │ │ ├── hiredis.c │ │ │ ├── hiredis.h │ │ │ ├── hiredis.pc.in │ │ │ ├── hiredis_ssl.h │ │ │ ├── hiredis_ssl.pc.in │ │ │ ├── net.c │ │ │ ├── net.h │ │ │ ├── read.c │ │ │ ├── read.h │ │ │ ├── sds.c │ │ │ ├── sds.h │ │ │ ├── sdsalloc.h │ │ │ ├── sockcompat.c │ │ │ ├── sockcompat.h │ │ │ ├── ssl.c │ │ │ ├── test.c │ │ │ ├── test.sh │ │ │ └── win32.h │ │ ├── jemalloc/ │ │ │ ├── .appveyor.yml │ │ │ ├── .autom4te.cfg │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── COPYING │ │ │ ├── ChangeLog │ │ │ ├── INSTALL.md │ │ │ ├── Makefile.in │ │ │ ├── README │ │ │ ├── TUNING.md │ │ │ ├── autogen.sh │ │ │ ├── bin/ │ │ │ │ ├── jemalloc-config.in │ │ │ │ ├── jemalloc.sh.in │ │ │ │ └── jeprof.in │ │ │ ├── build-aux/ │ │ │ │ ├── config.guess │ │ │ │ ├── config.sub │ │ │ │ └── install-sh │ │ │ ├── config.stamp.in │ │ │ ├── configure.ac │ │ │ ├── doc/ │ │ │ │ ├── html.xsl.in │ │ │ │ ├── jemalloc.xml.in │ │ │ │ ├── manpages.xsl.in │ │ │ │ └── stylesheet.xsl │ │ │ ├── include/ │ │ │ │ ├── jemalloc/ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ ├── arena_externs.h │ │ │ │ │ │ ├── arena_inlines_a.h │ │ │ │ │ │ ├── arena_inlines_b.h │ │ │ │ │ │ ├── arena_stats.h │ │ │ │ │ │ ├── arena_structs_a.h │ │ │ │ │ │ ├── arena_structs_b.h │ │ │ │ │ │ ├── arena_types.h │ │ │ │ │ │ ├── assert.h │ │ │ │ │ │ ├── atomic.h │ │ │ │ │ │ ├── atomic_c11.h │ │ │ │ │ │ ├── atomic_gcc_atomic.h │ │ │ │ │ │ ├── atomic_gcc_sync.h │ │ │ │ │ │ ├── atomic_msvc.h │ │ │ │ │ │ ├── background_thread_externs.h │ │ │ │ │ │ ├── background_thread_inlines.h │ │ │ │ │ │ ├── background_thread_structs.h │ │ │ │ │ │ ├── base_externs.h │ │ │ │ │ │ ├── base_inlines.h │ │ │ │ │ │ ├── base_structs.h │ │ │ │ │ │ ├── base_types.h │ │ │ │ │ │ ├── bin.h │ │ │ │ │ │ ├── bin_stats.h │ │ │ │ │ │ ├── bit_util.h │ │ │ │ │ │ ├── bitmap.h │ │ │ │ │ │ ├── cache_bin.h │ │ │ │ │ │ ├── ckh.h │ │ │ │ │ │ ├── ctl.h │ │ │ │ │ │ ├── div.h │ │ │ │ │ │ ├── emitter.h │ │ │ │ │ │ ├── extent_dss.h │ │ │ │ │ │ ├── extent_externs.h │ │ │ │ │ │ ├── extent_inlines.h │ │ │ │ │ │ ├── extent_mmap.h │ │ │ │ │ │ ├── extent_structs.h │ │ │ │ │ │ ├── extent_types.h │ │ │ │ │ │ ├── hash.h │ │ │ │ │ │ ├── hooks.h │ │ │ │ │ │ ├── jemalloc_internal_decls.h │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in │ │ │ │ │ │ ├── jemalloc_internal_externs.h │ │ │ │ │ │ ├── jemalloc_internal_includes.h │ │ │ │ │ │ ├── jemalloc_internal_inlines_a.h │ │ │ │ │ │ ├── jemalloc_internal_inlines_b.h │ │ │ │ │ │ ├── jemalloc_internal_inlines_c.h │ │ │ │ │ │ ├── jemalloc_internal_macros.h │ │ │ │ │ │ ├── jemalloc_internal_types.h │ │ │ │ │ │ ├── jemalloc_preamble.h.in │ │ │ │ │ │ ├── large_externs.h │ │ │ │ │ │ ├── log.h │ │ │ │ │ │ ├── malloc_io.h │ │ │ │ │ │ ├── mutex.h │ │ │ │ │ │ ├── mutex_pool.h │ │ │ │ │ │ ├── mutex_prof.h │ │ │ │ │ │ ├── nstime.h │ │ │ │ │ │ ├── pages.h │ │ │ │ │ │ ├── ph.h │ │ │ │ │ │ ├── private_namespace.sh │ │ │ │ │ │ ├── private_symbols.sh │ │ │ │ │ │ ├── prng.h │ │ │ │ │ │ ├── prof_externs.h │ │ │ │ │ │ ├── prof_inlines_a.h │ │ │ │ │ │ ├── prof_inlines_b.h │ │ │ │ │ │ ├── prof_structs.h │ │ │ │ │ │ ├── prof_types.h │ │ │ │ │ │ ├── public_namespace.sh │ │ │ │ │ │ ├── public_unnamespace.sh │ │ │ │ │ │ ├── ql.h │ │ │ │ │ │ ├── qr.h │ │ │ │ │ │ ├── rb.h │ │ │ │ │ │ ├── rtree.h │ │ │ │ │ │ ├── rtree_tsd.h │ │ │ │ │ │ ├── size_classes.sh │ │ │ │ │ │ ├── smoothstep.h │ │ │ │ │ │ ├── smoothstep.sh │ │ │ │ │ │ ├── spin.h │ │ │ │ │ │ ├── stats.h │ │ │ │ │ │ ├── sz.h │ │ │ │ │ │ ├── tcache_externs.h │ │ │ │ │ │ ├── tcache_inlines.h │ │ │ │ │ │ ├── tcache_structs.h │ │ │ │ │ │ ├── tcache_types.h │ │ │ │ │ │ ├── ticker.h │ │ │ │ │ │ ├── tsd.h │ │ │ │ │ │ ├── tsd_generic.h │ │ │ │ │ │ ├── tsd_malloc_thread_cleanup.h │ │ │ │ │ │ ├── tsd_tls.h │ │ │ │ │ │ ├── tsd_types.h │ │ │ │ │ │ ├── tsd_win.h │ │ │ │ │ │ ├── util.h │ │ │ │ │ │ └── witness.h │ │ │ │ │ ├── jemalloc.sh │ │ │ │ │ ├── jemalloc_defs.h.in │ │ │ │ │ ├── jemalloc_macros.h.in │ │ │ │ │ ├── jemalloc_mangle.sh │ │ │ │ │ ├── jemalloc_protos.h.in │ │ │ │ │ ├── jemalloc_rename.sh │ │ │ │ │ └── jemalloc_typedefs.h.in │ │ │ │ └── msvc_compat/ │ │ │ │ ├── C99/ │ │ │ │ │ ├── stdbool.h │ │ │ │ │ └── stdint.h │ │ │ │ ├── strings.h │ │ │ │ └── windows_extra.h │ │ │ ├── jemalloc.pc.in │ │ │ ├── m4/ │ │ │ │ └── ax_cxx_compile_stdcxx.m4 │ │ │ ├── msvc/ │ │ │ │ ├── ReadMe.txt │ │ │ │ ├── jemalloc_vc2015.sln │ │ │ │ ├── jemalloc_vc2017.sln │ │ │ │ ├── projects/ │ │ │ │ │ ├── vc2015/ │ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ │ ├── jemalloc.vcxproj │ │ │ │ │ │ │ └── jemalloc.vcxproj.filters │ │ │ │ │ │ └── test_threads/ │ │ │ │ │ │ ├── test_threads.vcxproj │ │ │ │ │ │ └── test_threads.vcxproj.filters │ │ │ │ │ └── vc2017/ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ ├── jemalloc.vcxproj │ │ │ │ │ │ └── jemalloc.vcxproj.filters │ │ │ │ │ └── test_threads/ │ │ │ │ │ ├── test_threads.vcxproj │ │ │ │ │ └── test_threads.vcxproj.filters │ │ │ │ └── test_threads/ │ │ │ │ ├── test_threads.cpp │ │ │ │ ├── test_threads.h │ │ │ │ └── test_threads_main.cpp │ │ │ ├── run_tests.sh │ │ │ ├── scripts/ │ │ │ │ ├── gen_run_tests.py │ │ │ │ └── gen_travis.py │ │ │ ├── src/ │ │ │ │ ├── arena.c │ │ │ │ ├── background_thread.c │ │ │ │ ├── base.c │ │ │ │ ├── bin.c │ │ │ │ ├── bitmap.c │ │ │ │ ├── ckh.c │ │ │ │ ├── ctl.c │ │ │ │ ├── div.c │ │ │ │ ├── extent.c │ │ │ │ ├── extent_dss.c │ │ │ │ ├── extent_mmap.c │ │ │ │ ├── hash.c │ │ │ │ ├── hooks.c │ │ │ │ ├── jemalloc.c │ │ │ │ ├── jemalloc_cpp.cpp │ │ │ │ ├── large.c │ │ │ │ ├── log.c │ │ │ │ ├── malloc_io.c │ │ │ │ ├── mutex.c │ │ │ │ ├── mutex_pool.c │ │ │ │ ├── nstime.c │ │ │ │ ├── pages.c │ │ │ │ ├── prng.c │ │ │ │ ├── prof.c │ │ │ │ ├── rtree.c │ │ │ │ ├── stats.c │ │ │ │ ├── sz.c │ │ │ │ ├── tcache.c │ │ │ │ ├── ticker.c │ │ │ │ ├── tsd.c │ │ │ │ ├── witness.c │ │ │ │ └── zone.c │ │ │ └── test/ │ │ │ ├── include/ │ │ │ │ └── test/ │ │ │ │ ├── SFMT-alti.h │ │ │ │ ├── SFMT-params.h │ │ │ │ ├── SFMT-params11213.h │ │ │ │ ├── SFMT-params1279.h │ │ │ │ ├── SFMT-params132049.h │ │ │ │ ├── SFMT-params19937.h │ │ │ │ ├── SFMT-params216091.h │ │ │ │ ├── SFMT-params2281.h │ │ │ │ ├── SFMT-params4253.h │ │ │ │ ├── SFMT-params44497.h │ │ │ │ ├── SFMT-params607.h │ │ │ │ ├── SFMT-params86243.h │ │ │ │ ├── SFMT-sse2.h │ │ │ │ ├── SFMT.h │ │ │ │ ├── btalloc.h │ │ │ │ ├── extent_hooks.h │ │ │ │ ├── jemalloc_test.h.in │ │ │ │ ├── jemalloc_test_defs.h.in │ │ │ │ ├── math.h │ │ │ │ ├── mq.h │ │ │ │ ├── mtx.h │ │ │ │ ├── test.h │ │ │ │ ├── thd.h │ │ │ │ └── timer.h │ │ │ ├── integration/ │ │ │ │ ├── MALLOCX_ARENA.c │ │ │ │ ├── aligned_alloc.c │ │ │ │ ├── allocated.c │ │ │ │ ├── extent.c │ │ │ │ ├── extent.sh │ │ │ │ ├── mallocx.c │ │ │ │ ├── mallocx.sh │ │ │ │ ├── overflow.c │ │ │ │ ├── posix_memalign.c │ │ │ │ ├── rallocx.c │ │ │ │ ├── sdallocx.c │ │ │ │ ├── thread_arena.c │ │ │ │ ├── thread_tcache_enabled.c │ │ │ │ ├── xallocx.c │ │ │ │ └── xallocx.sh │ │ │ ├── src/ │ │ │ │ ├── SFMT.c │ │ │ │ ├── btalloc.c │ │ │ │ ├── btalloc_0.c │ │ │ │ ├── btalloc_1.c │ │ │ │ ├── math.c │ │ │ │ ├── mq.c │ │ │ │ ├── mtx.c │ │ │ │ ├── test.c │ │ │ │ ├── thd.c │ │ │ │ └── timer.c │ │ │ ├── stress/ │ │ │ │ └── microbench.c │ │ │ ├── test.sh.in │ │ │ └── unit/ │ │ │ ├── SFMT.c │ │ │ ├── a0.c │ │ │ ├── arena_reset.c │ │ │ ├── arena_reset_prof.c │ │ │ ├── arena_reset_prof.sh │ │ │ ├── atomic.c │ │ │ ├── background_thread.c │ │ │ ├── background_thread_enable.c │ │ │ ├── base.c │ │ │ ├── bit_util.c │ │ │ ├── bitmap.c │ │ │ ├── ckh.c │ │ │ ├── decay.c │ │ │ ├── decay.sh │ │ │ ├── div.c │ │ │ ├── emitter.c │ │ │ ├── extent_quantize.c │ │ │ ├── fork.c │ │ │ ├── hash.c │ │ │ ├── hooks.c │ │ │ ├── junk.c │ │ │ ├── junk.sh │ │ │ ├── junk_alloc.c │ │ │ ├── junk_alloc.sh │ │ │ ├── junk_free.c │ │ │ ├── junk_free.sh │ │ │ ├── log.c │ │ │ ├── mallctl.c │ │ │ ├── malloc_io.c │ │ │ ├── math.c │ │ │ ├── mq.c │ │ │ ├── mtx.c │ │ │ ├── nstime.c │ │ │ ├── pack.c │ │ │ ├── pack.sh │ │ │ ├── pages.c │ │ │ ├── ph.c │ │ │ ├── prng.c │ │ │ ├── prof_accum.c │ │ │ ├── prof_accum.sh │ │ │ ├── prof_active.c │ │ │ ├── prof_active.sh │ │ │ ├── prof_gdump.c │ │ │ ├── prof_gdump.sh │ │ │ ├── prof_idump.c │ │ │ ├── prof_idump.sh │ │ │ ├── prof_reset.c │ │ │ ├── prof_reset.sh │ │ │ ├── prof_tctx.c │ │ │ ├── prof_tctx.sh │ │ │ ├── prof_thread_name.c │ │ │ ├── prof_thread_name.sh │ │ │ ├── ql.c │ │ │ ├── qr.c │ │ │ ├── rb.c │ │ │ ├── retained.c │ │ │ ├── rtree.c │ │ │ ├── size_classes.c │ │ │ ├── slab.c │ │ │ ├── smoothstep.c │ │ │ ├── spin.c │ │ │ ├── stats.c │ │ │ ├── stats_print.c │ │ │ ├── ticker.c │ │ │ ├── tsd.c │ │ │ ├── witness.c │ │ │ ├── zero.c │ │ │ └── zero.sh │ │ ├── linenoise/ │ │ │ ├── .gitignore │ │ │ ├── Makefile │ │ │ ├── README.markdown │ │ │ ├── example.c │ │ │ ├── linenoise.c │ │ │ └── linenoise.h │ │ ├── lua/ │ │ │ ├── COPYRIGHT │ │ │ ├── HISTORY │ │ │ ├── INSTALL │ │ │ ├── Makefile │ │ │ ├── README │ │ │ ├── doc/ │ │ │ │ ├── contents.html │ │ │ │ ├── lua.1 │ │ │ │ ├── lua.css │ │ │ │ ├── lua.html │ │ │ │ ├── luac.1 │ │ │ │ ├── luac.html │ │ │ │ ├── manual.css │ │ │ │ ├── manual.html │ │ │ │ └── readme.html │ │ │ ├── etc/ │ │ │ │ ├── Makefile │ │ │ │ ├── README │ │ │ │ ├── all.c │ │ │ │ ├── lua.hpp │ │ │ │ ├── lua.pc │ │ │ │ ├── luavs.bat │ │ │ │ ├── min.c │ │ │ │ ├── noparser.c │ │ │ │ └── strict.lua │ │ │ ├── src/ │ │ │ │ ├── Makefile │ │ │ │ ├── fpconv.c │ │ │ │ ├── fpconv.h │ │ │ │ ├── lapi.c │ │ │ │ ├── lapi.h │ │ │ │ ├── lauxlib.c │ │ │ │ ├── lauxlib.h │ │ │ │ ├── lbaselib.c │ │ │ │ ├── lcode.c │ │ │ │ ├── lcode.h │ │ │ │ ├── ldblib.c │ │ │ │ ├── ldebug.c │ │ │ │ ├── ldebug.h │ │ │ │ ├── ldo.c │ │ │ │ ├── ldo.h │ │ │ │ ├── ldump.c │ │ │ │ ├── lfunc.c │ │ │ │ ├── lfunc.h │ │ │ │ ├── lgc.c │ │ │ │ ├── lgc.h │ │ │ │ ├── linit.c │ │ │ │ ├── liolib.c │ │ │ │ ├── llex.c │ │ │ │ ├── llex.h │ │ │ │ ├── llimits.h │ │ │ │ ├── lmathlib.c │ │ │ │ ├── lmem.c │ │ │ │ ├── lmem.h │ │ │ │ ├── loadlib.c │ │ │ │ ├── lobject.c │ │ │ │ ├── lobject.h │ │ │ │ ├── lopcodes.c │ │ │ │ ├── lopcodes.h │ │ │ │ ├── loslib.c │ │ │ │ ├── lparser.c │ │ │ │ ├── lparser.h │ │ │ │ ├── lstate.c │ │ │ │ ├── lstate.h │ │ │ │ ├── lstring.c │ │ │ │ ├── lstring.h │ │ │ │ ├── lstrlib.c │ │ │ │ ├── ltable.c │ │ │ │ ├── ltable.h │ │ │ │ ├── ltablib.c │ │ │ │ ├── ltm.c │ │ │ │ ├── ltm.h │ │ │ │ ├── lua.c │ │ │ │ ├── lua.h │ │ │ │ ├── lua_bit.c │ │ │ │ ├── lua_cjson.c │ │ │ │ ├── lua_cmsgpack.c │ │ │ │ ├── lua_struct.c │ │ │ │ ├── luac.c │ │ │ │ ├── luaconf.h │ │ │ │ ├── lualib.h │ │ │ │ ├── lundump.c │ │ │ │ ├── lundump.h │ │ │ │ ├── lvm.c │ │ │ │ ├── lvm.h │ │ │ │ ├── lzio.c │ │ │ │ ├── lzio.h │ │ │ │ ├── print.c │ │ │ │ ├── strbuf.c │ │ │ │ └── strbuf.h │ │ │ └── test/ │ │ │ ├── README │ │ │ ├── bisect.lua │ │ │ ├── cf.lua │ │ │ ├── echo.lua │ │ │ ├── env.lua │ │ │ ├── factorial.lua │ │ │ ├── fib.lua │ │ │ ├── fibfor.lua │ │ │ ├── globals.lua │ │ │ ├── hello.lua │ │ │ ├── life.lua │ │ │ ├── luac.lua │ │ │ ├── printf.lua │ │ │ ├── readonly.lua │ │ │ ├── sieve.lua │ │ │ ├── sort.lua │ │ │ ├── table.lua │ │ │ ├── trace-calls.lua │ │ │ ├── trace-globals.lua │ │ │ └── xd.lua │ │ └── update-jemalloc.sh │ ├── redis.conf │ ├── runtest │ ├── runtest-cluster │ ├── runtest-moduleapi │ ├── runtest-sentinel │ ├── sentinel.conf │ ├── src/ │ │ ├── .gitignore │ │ ├── Makefile │ │ ├── acl.c │ │ ├── adlist.c │ │ ├── adlist.h │ │ ├── ae.c │ │ ├── ae.h │ │ ├── ae_epoll.c │ │ ├── ae_evport.c │ │ ├── ae_kqueue.c │ │ ├── ae_select.c │ │ ├── anet.c │ │ ├── anet.h │ │ ├── aof.c │ │ ├── asciilogo.h │ │ ├── atomicvar.h │ │ ├── bio.c │ │ ├── bio.h │ │ ├── bitops.c │ │ ├── blocked.c │ │ ├── childinfo.c │ │ ├── cluster.c │ │ ├── cluster.h │ │ ├── config.c │ │ ├── config.h │ │ ├── connection.c │ │ ├── connection.h │ │ ├── connhelpers.h │ │ ├── crc16.c │ │ ├── crc16_slottable.h │ │ ├── crc64.c │ │ ├── crc64.h │ │ ├── crcspeed.c │ │ ├── crcspeed.h │ │ ├── db.c │ │ ├── debug.c │ │ ├── debugmacro.h │ │ ├── defrag.c │ │ ├── dict.c │ │ ├── dict.h │ │ ├── endianconv.c │ │ ├── endianconv.h │ │ ├── evict.c │ │ ├── expire.c │ │ ├── fmacros.h │ │ ├── geo.c │ │ ├── geo.h │ │ ├── geohash.c │ │ ├── geohash.h │ │ ├── geohash_helper.c │ │ ├── geohash_helper.h │ │ ├── gopher.c │ │ ├── help.h │ │ ├── hyperloglog.c │ │ ├── intset.c │ │ ├── intset.h │ │ ├── latency.c │ │ ├── latency.h │ │ ├── lazyfree.c │ │ ├── listpack.c │ │ ├── listpack.h │ │ ├── listpack_malloc.h │ │ ├── localtime.c │ │ ├── lolwut.c │ │ ├── lolwut.h │ │ ├── lolwut5.c │ │ ├── lolwut6.c │ │ ├── lzf.h │ │ ├── lzfP.h │ │ ├── lzf_c.c │ │ ├── lzf_d.c │ │ ├── memtest.c │ │ ├── mkreleasehdr.sh │ │ ├── module.c │ │ ├── modules/ │ │ │ ├── .gitignore │ │ │ ├── Makefile │ │ │ ├── gendoc.rb │ │ │ ├── helloacl.c │ │ │ ├── helloblock.c │ │ │ ├── hellocluster.c │ │ │ ├── hellodict.c │ │ │ ├── hellohook.c │ │ │ ├── hellotimer.c │ │ │ ├── hellotype.c │ │ │ ├── helloworld.c │ │ │ └── testmodule.c │ │ ├── multi.c │ │ ├── networking.c │ │ ├── notify.c │ │ ├── object.c │ │ ├── pqsort.c │ │ ├── pqsort.h │ │ ├── pubsub.c │ │ ├── quicklist.c │ │ ├── quicklist.h │ │ ├── rand.c │ │ ├── rand.h │ │ ├── rax.c │ │ ├── rax.h │ │ ├── rax_malloc.h │ │ ├── rdb.c │ │ ├── rdb.h │ │ ├── redis-benchmark.c │ │ ├── redis-check-aof.c │ │ ├── redis-check-rdb.c │ │ ├── redis-cli.c │ │ ├── redis-trib.rb │ │ ├── redisassert.h │ │ ├── redismodule.h │ │ ├── release.c │ │ ├── replication.c │ │ ├── rio.c │ │ ├── rio.h │ │ ├── scripting.c │ │ ├── sds.c │ │ ├── sds.h │ │ ├── sdsalloc.h │ │ ├── sentinel.c │ │ ├── server.c │ │ ├── server.h │ │ ├── setcpuaffinity.c │ │ ├── setproctitle.c │ │ ├── sha1.c │ │ ├── sha1.h │ │ ├── sha256.c │ │ ├── sha256.h │ │ ├── siphash.c │ │ ├── slowlog.c │ │ ├── slowlog.h │ │ ├── solarisfixes.h │ │ ├── sort.c │ │ ├── sparkline.c │ │ ├── sparkline.h │ │ ├── stream.h │ │ ├── syncio.c │ │ ├── t_hash.c │ │ ├── t_list.c │ │ ├── t_set.c │ │ ├── t_stream.c │ │ ├── t_string.c │ │ ├── t_zset.c │ │ ├── testhelp.h │ │ ├── timeout.c │ │ ├── tls.c │ │ ├── tracking.c │ │ ├── util.c │ │ ├── util.h │ │ ├── valgrind.sup │ │ ├── version.h │ │ ├── ziplist.c │ │ ├── ziplist.h │ │ ├── zipmap.c │ │ ├── zipmap.h │ │ ├── zmalloc.c │ │ └── zmalloc.h │ ├── tests/ │ │ ├── assets/ │ │ │ ├── default.conf │ │ │ ├── encodings.rdb │ │ │ └── hash-zipmap.rdb │ │ ├── cluster/ │ │ │ ├── cluster.tcl │ │ │ ├── run.tcl │ │ │ ├── tests/ │ │ │ │ ├── 00-base.tcl │ │ │ │ ├── 01-faildet.tcl │ │ │ │ ├── 02-failover.tcl │ │ │ │ ├── 03-failover-loop.tcl │ │ │ │ ├── 04-resharding.tcl │ │ │ │ ├── 05-slave-selection.tcl │ │ │ │ ├── 06-slave-stop-cond.tcl │ │ │ │ ├── 07-replica-migration.tcl │ │ │ │ ├── 08-update-msg.tcl │ │ │ │ ├── 09-pubsub.tcl │ │ │ │ ├── 10-manual-failover.tcl │ │ │ │ ├── 11-manual-takeover.tcl │ │ │ │ ├── 12-replica-migration-2.tcl │ │ │ │ ├── 13-no-failover-option.tcl │ │ │ │ ├── 14-consistency-check.tcl │ │ │ │ ├── 15-cluster-slots.tcl │ │ │ │ ├── helpers/ │ │ │ │ │ └── onlydots.tcl │ │ │ │ └── includes/ │ │ │ │ └── init-tests.tcl │ │ │ └── tmp/ │ │ │ └── .gitignore │ │ ├── helpers/ │ │ │ ├── bg_block_op.tcl │ │ │ ├── bg_complex_data.tcl │ │ │ └── gen_write_load.tcl │ │ ├── instances.tcl │ │ ├── integration/ │ │ │ ├── aof-race.tcl │ │ │ ├── aof.tcl │ │ │ ├── block-repl.tcl │ │ │ ├── convert-zipmap-hash-on-load.tcl │ │ │ ├── logging.tcl │ │ │ ├── psync2-pingoff.tcl │ │ │ ├── psync2-reg.tcl │ │ │ ├── psync2.tcl │ │ │ ├── rdb.tcl │ │ │ ├── redis-cli.tcl │ │ │ ├── replication-2.tcl │ │ │ ├── replication-3.tcl │ │ │ ├── replication-4.tcl │ │ │ ├── replication-psync.tcl │ │ │ └── replication.tcl │ │ ├── modules/ │ │ │ ├── Makefile │ │ │ ├── auth.c │ │ │ ├── blockonkeys.c │ │ │ ├── commandfilter.c │ │ │ ├── datatype.c │ │ │ ├── fork.c │ │ │ ├── hooks.c │ │ │ ├── infotest.c │ │ │ ├── misc.c │ │ │ ├── propagate.c │ │ │ ├── scan.c │ │ │ └── testrdb.c │ │ ├── sentinel/ │ │ │ ├── run.tcl │ │ │ ├── tests/ │ │ │ │ ├── 00-base.tcl │ │ │ │ ├── 01-conf-update.tcl │ │ │ │ ├── 02-slaves-reconf.tcl │ │ │ │ ├── 03-runtime-reconf.tcl │ │ │ │ ├── 04-slave-selection.tcl │ │ │ │ ├── 05-manual.tcl │ │ │ │ ├── 06-ckquorum.tcl │ │ │ │ ├── 07-down-conditions.tcl │ │ │ │ └── includes/ │ │ │ │ └── init-tests.tcl │ │ │ └── tmp/ │ │ │ └── .gitignore │ │ ├── support/ │ │ │ ├── cli.tcl │ │ │ ├── cluster.tcl │ │ │ ├── redis.tcl │ │ │ ├── server.tcl │ │ │ ├── test.tcl │ │ │ ├── tmpfile.tcl │ │ │ └── util.tcl │ │ ├── test_helper.tcl │ │ └── unit/ │ │ ├── acl.tcl │ │ ├── aofrw.tcl │ │ ├── auth.tcl │ │ ├── bitfield.tcl │ │ ├── bitops.tcl │ │ ├── dump.tcl │ │ ├── expire.tcl │ │ ├── geo.tcl │ │ ├── hyperloglog.tcl │ │ ├── introspection-2.tcl │ │ ├── introspection.tcl │ │ ├── keyspace.tcl │ │ ├── latency-monitor.tcl │ │ ├── lazyfree.tcl │ │ ├── limits.tcl │ │ ├── maxmemory.tcl │ │ ├── memefficiency.tcl │ │ ├── moduleapi/ │ │ │ ├── auth.tcl │ │ │ ├── blockonkeys.tcl │ │ │ ├── commandfilter.tcl │ │ │ ├── datatype.tcl │ │ │ ├── fork.tcl │ │ │ ├── hooks.tcl │ │ │ ├── infotest.tcl │ │ │ ├── misc.tcl │ │ │ ├── propagate.tcl │ │ │ ├── scan.tcl │ │ │ └── testrdb.tcl │ │ ├── multi.tcl │ │ ├── obuf-limits.tcl │ │ ├── other.tcl │ │ ├── pendingquerybuf.tcl │ │ ├── printver.tcl │ │ ├── protocol.tcl │ │ ├── pubsub.tcl │ │ ├── quit.tcl │ │ ├── scan.tcl │ │ ├── scripting.tcl │ │ ├── slowlog.tcl │ │ ├── sort.tcl │ │ ├── tls.tcl │ │ ├── tracking.tcl │ │ ├── type/ │ │ │ ├── hash.tcl │ │ │ ├── incr.tcl │ │ │ ├── list-2.tcl │ │ │ ├── list-3.tcl │ │ │ ├── list-common.tcl │ │ │ ├── list.tcl │ │ │ ├── set.tcl │ │ │ ├── stream-cgroups.tcl │ │ │ ├── stream.tcl │ │ │ ├── string.tcl │ │ │ └── zset.tcl │ │ └── wait.tcl │ └── utils/ │ ├── build-static-symbols.tcl │ ├── cluster_fail_time.tcl │ ├── corrupt_rdb.c │ ├── create-cluster/ │ │ ├── .gitignore │ │ ├── README │ │ └── create-cluster │ ├── gen-test-certs.sh │ ├── generate-command-help.rb │ ├── graphs/ │ │ └── commits-over-time/ │ │ ├── README.md │ │ └── genhtml.tcl │ ├── hashtable/ │ │ ├── README │ │ └── rehashing.c │ ├── hyperloglog/ │ │ ├── .gitignore │ │ ├── hll-err.rb │ │ └── hll-gnuplot-graph.rb │ ├── install_server.sh │ ├── lru/ │ │ ├── README │ │ ├── lfu-simulation.c │ │ └── test-lru.rb │ ├── redis-copy.rb │ ├── redis-sha1.rb │ ├── redis_init_script │ ├── redis_init_script.tpl │ ├── releasetools/ │ │ ├── 01_create_tarball.sh │ │ ├── 02_upload_tarball.sh │ │ ├── 03_test_release.sh │ │ ├── 04_release_hash.sh │ │ └── changelog.tcl │ ├── speed-regression.tcl │ ├── srandmember/ │ │ ├── README.md │ │ ├── showdist.rb │ │ └── showfreq.rb │ ├── systemd-redis_multiple_servers@.service │ ├── systemd-redis_server.service │ ├── tracking_collisions.c │ └── whatisdoing.sh ├── Chapter03/ │ └── code/ │ ├── SharedMutex.cpp │ ├── SharedMutex.h │ ├── SingleInstance/ │ │ ├── Resource.h │ │ ├── SingleInstance.cpp │ │ ├── SingleInstance.h │ │ ├── SingleInstance.rc │ │ ├── SingleInstance.sln │ │ ├── SingleInstance.vcxproj │ │ ├── SingleInstance.vcxproj.filters │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ ├── TaskPool.cpp │ ├── TaskPool.h │ ├── TestFiber.cpp │ ├── TestSharedMutexBenchmark.cpp │ ├── TestWindowsConditionVariable/ │ │ ├── TestWindowsConditionVariable.cpp │ │ ├── TestWindowsConditionVariable.sln │ │ ├── TestWindowsConditionVariable.vcxproj │ │ └── TestWindowsConditionVariable.vcxproj.filters │ ├── c11mutex.cpp │ ├── c11threadlocal.cpp │ ├── cpp11cv.cpp │ ├── cv.cpp │ ├── insecurecrtfunction.cpp │ ├── linuxtid.cpp │ ├── linuxtls.cpp │ ├── linuxtls2.cpp │ ├── makesurethread.cpp │ ├── makesurethreadgroup.cpp │ ├── rwlock.cpp │ ├── rwlock2.cpp │ ├── rwlock3.cpp │ ├── semaphore.cpp │ ├── semaphore_timewait.cpp │ ├── taskpoolmain.cpp │ ├── test_cpp11_thread_id.cpp │ ├── test_destroy_locked_mutex.cpp │ └── windowstls.cpp ├── Chapter04/ │ └── code/ │ ├── IOCPServerDemo/ │ │ ├── IOCPModel.cpp │ │ ├── IOCPModel.h │ │ ├── IOCPServerApp.cpp │ │ ├── IOCPServerApp.h │ │ ├── IOCPServerDemo.rc │ │ ├── IOCPServerDemo.sln │ │ ├── IOCPServerDemo.vcproj │ │ ├── IOCPServerDemo.vcxproj │ │ ├── IOCPServerDemo.vcxproj.filters │ │ ├── MainDlg.cpp │ │ ├── MainDlg.h │ │ ├── XPStyle.manifest │ │ ├── res/ │ │ │ ├── IOCPServerDemo.rc2 │ │ │ └── vssver2.scc │ │ ├── resource.h │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ ├── WSAAsyncSelect/ │ │ ├── Resource.h │ │ ├── WSAAsyncSelect.cpp │ │ ├── WSAAsyncSelect.h │ │ ├── WSAAsyncSelect.rc │ │ ├── WSAAsyncSelect.sln │ │ ├── WSAAsyncSelect.vcxproj │ │ ├── WSAAsyncSelect.vcxproj.filters │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ ├── WSAEventSelect/ │ │ ├── WSAEventSelect.cpp │ │ ├── WSAEventSelect.sln │ │ ├── WSAEventSelect.vcxproj │ │ ├── WSAEventSelect.vcxproj.filters │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ ├── blocking_client.cpp │ ├── blocking_client_recv.cpp │ ├── blocking_client_send.cpp │ ├── blocking_server.cpp │ ├── client.cpp │ ├── client2.cpp │ ├── epoll_server.cpp │ ├── epoll_server_with_oneshot.cpp │ ├── epoll_server_with_oneshot_2.cpp │ ├── epoll_server_write_event_et.cpp │ ├── epoll_server_write_event_lt.cpp │ ├── gethostbyname_linux.cpp │ ├── linux_ioctl.cpp │ ├── linux_nonblocking_connect.cpp │ ├── linux_nonblocking_connect_poll.cpp │ ├── nagle_client.cpp │ ├── nodelay_client.cpp │ ├── nonblocking_client.cpp │ ├── nonblocking_client_recv.cpp │ ├── nonblocking_client_send.cpp │ ├── nonblocking_client_send_zero_bytes.cpp │ ├── nonblocking_connect.cpp │ ├── poll_server.cpp │ ├── select_client_tv0.cpp │ ├── select_client_tvnull.cpp │ ├── select_server.cpp │ ├── server.cpp │ ├── server2.cpp │ └── server_recv_zero_bytes.cpp ├── Chapter06/ │ └── code/ │ ├── ProtocolStream.cpp │ ├── ProtocolStream.h │ ├── RecvMail/ │ │ ├── Base64Util.cpp │ │ ├── Base64Util.h │ │ ├── EncodeUtil.cpp │ │ ├── EncodeUtil.h │ │ ├── MailHelper.cpp │ │ ├── MailHelper.h │ │ ├── MailThread.cpp │ │ ├── MailThread.h │ │ ├── Platform.cpp │ │ ├── Platform.h │ │ ├── Pop3Socket.cpp │ │ ├── Pop3Socket.h │ │ ├── RecvMail.sln │ │ ├── RecvMail.vcxproj │ │ ├── RecvMail.vcxproj.filters │ │ ├── mailcontent.txt │ │ ├── main.cpp │ │ └── test.docx │ ├── SendMail/ │ │ ├── Base64Util.cpp │ │ ├── Base64Util.h │ │ ├── CMakeLists.txt │ │ ├── MailMonitor.cpp │ │ ├── MailMonitor.h │ │ ├── Platform.cpp │ │ ├── Platform.h │ │ ├── SendMail.sln │ │ ├── SendMail.vcxproj │ │ ├── SendMail.vcxproj.filters │ │ ├── SmtpSocket.cpp │ │ ├── SmtpSocket.h │ │ └── main.cpp │ ├── WebSocketServer/ │ │ ├── CMakeLists.txt │ │ ├── README.md │ │ ├── WebSocketServer.sln │ │ ├── WebSocketServer.vcxproj │ │ ├── WebSocketServer.vcxproj.filters │ │ ├── appsrc/ │ │ │ ├── BusinessSession.cpp │ │ │ ├── BusinessSession.h │ │ │ └── main.cpp │ │ ├── base/ │ │ │ ├── AsyncLog.cpp │ │ │ ├── AsyncLog.h │ │ │ ├── ConfigFileReader.cpp │ │ │ ├── ConfigFileReader.h │ │ │ ├── Platform.cpp │ │ │ ├── Platform.h │ │ │ ├── RAIIWrapper.h │ │ │ ├── Singleton.h │ │ │ ├── Timestamp.cpp │ │ │ └── Timestamp.h │ │ ├── net/ │ │ │ ├── Acceptor.cpp │ │ │ ├── Acceptor.h │ │ │ ├── Buffer.cpp │ │ │ ├── Buffer.h │ │ │ ├── Callbacks.h │ │ │ ├── Channel.cpp │ │ │ ├── Channel.h │ │ │ ├── Connector.cpp │ │ │ ├── Connector.h │ │ │ ├── Endian.h │ │ │ ├── EpollPoller.cpp │ │ │ ├── EpollPoller.h │ │ │ ├── EventLoop.cpp │ │ │ ├── EventLoop.h │ │ │ ├── EventLoopThread.cpp │ │ │ ├── EventLoopThread.h │ │ │ ├── EventLoopThreadPool.cpp │ │ │ ├── EventLoopThreadPool.h │ │ │ ├── InetAddress.cpp │ │ │ ├── InetAddress.h │ │ │ ├── PollPoller.cpp │ │ │ ├── PollPoller.h │ │ │ ├── Poller.cpp │ │ │ ├── Poller.h │ │ │ ├── ProtocolStream.cpp │ │ │ ├── ProtocolStream.h │ │ │ ├── SelectPoller.cpp │ │ │ ├── SelectPoller.h │ │ │ ├── Sockets.cpp │ │ │ ├── Sockets.h │ │ │ ├── TcpClient.cpp │ │ │ ├── TcpClient.h │ │ │ ├── TcpConnection.cpp │ │ │ ├── TcpConnection.h │ │ │ ├── TcpServer.cpp │ │ │ ├── TcpServer.h │ │ │ ├── Timer.cpp │ │ │ ├── Timer.h │ │ │ ├── TimerId.h │ │ │ ├── TimerQueue.cpp │ │ │ └── TimerQueue.h │ │ ├── utils/ │ │ │ ├── DaemonRun.cpp │ │ │ ├── DaemonRun.h │ │ │ ├── StringUtil.cpp │ │ │ ├── StringUtil.h │ │ │ ├── UUIDGenerator.cpp │ │ │ └── UUIDGenerator.h │ │ ├── websocketsrc/ │ │ │ ├── MyWebSocketServer.cpp │ │ │ ├── MyWebSocketServer.h │ │ │ ├── MyWebSocketSession.cpp │ │ │ ├── MyWebSocketSession.h │ │ │ └── WebSocketHandshake.h │ │ └── zlib1.2.11/ │ │ ├── ZlibUtil.cpp │ │ ├── ZlibUtil.h │ │ ├── adler32.c │ │ ├── compress.c │ │ ├── crc32.c │ │ ├── crc32.h │ │ ├── deflate.c │ │ ├── deflate.h │ │ ├── gzclose.c │ │ ├── gzguts.h │ │ ├── gzlib.c │ │ ├── gzread.c │ │ ├── gzwrite.c │ │ ├── infback.c │ │ ├── inffast.c │ │ ├── inffast.h │ │ ├── inffixed.h │ │ ├── inflate.c │ │ ├── inflate.h │ │ ├── inftrees.c │ │ ├── inftrees.h │ │ ├── trees.c │ │ ├── trees.h │ │ ├── uncompr.c │ │ ├── zconf.h │ │ ├── zlib.h │ │ ├── zlibdemo.c │ │ ├── zutil.c │ │ ├── zutil.h │ │ └── 文件概览.txt │ ├── curl/ │ │ ├── CurlClient.cpp │ │ ├── CurlClient.h │ │ ├── curl.h │ │ ├── curlver.h │ │ ├── easy.h │ │ ├── libcurl.lib │ │ ├── libcurl.so.4.5.0 │ │ ├── mprintf.h │ │ ├── multi.h │ │ ├── stdcheaders.h │ │ ├── system.h │ │ ├── typecheck-gcc.h │ │ └── urlapi.h │ └── 包分片逻辑.cpp ├── Chapter07/ │ ├── codes/ │ │ ├── timerV1/ │ │ │ ├── Timer.cpp │ │ │ ├── Timer.h │ │ │ ├── TimerManager.cpp │ │ │ └── TimerManager.h │ │ ├── timerV2/ │ │ │ ├── Timer.cpp │ │ │ ├── Timer.h │ │ │ ├── TimerManager.cpp │ │ │ └── TimerManager.h │ │ └── timerV3/ │ │ ├── Timer.cpp │ │ ├── Timer.h │ │ ├── TimerManager.cpp │ │ └── TimerManager.h │ └── redis-6.0.3/ │ ├── .github/ │ │ └── workflows/ │ │ ├── ci.yml │ │ └── daily.yml │ ├── .gitignore │ ├── 00-RELEASENOTES │ ├── BUGS │ ├── CONTRIBUTING │ ├── COPYING │ ├── INSTALL │ ├── MANIFESTO │ ├── Makefile │ ├── README.md │ ├── TLS.md │ ├── deps/ │ │ ├── Makefile │ │ ├── README.md │ │ ├── hiredis/ │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── CHANGELOG.md │ │ │ ├── CMakeLists.txt │ │ │ ├── COPYING │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── adapters/ │ │ │ │ ├── ae.h │ │ │ │ ├── glib.h │ │ │ │ ├── ivykis.h │ │ │ │ ├── libev.h │ │ │ │ ├── libevent.h │ │ │ │ ├── libuv.h │ │ │ │ ├── macosx.h │ │ │ │ └── qt.h │ │ │ ├── appveyor.yml │ │ │ ├── async.c │ │ │ ├── async.h │ │ │ ├── async_private.h │ │ │ ├── dict.c │ │ │ ├── dict.h │ │ │ ├── examples/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── example-ae.c │ │ │ │ ├── example-glib.c │ │ │ │ ├── example-ivykis.c │ │ │ │ ├── example-libev.c │ │ │ │ ├── example-libevent-ssl.c │ │ │ │ ├── example-libevent.c │ │ │ │ ├── example-libuv.c │ │ │ │ ├── example-macosx.c │ │ │ │ ├── example-qt.cpp │ │ │ │ ├── example-qt.h │ │ │ │ ├── example-ssl.c │ │ │ │ └── example.c │ │ │ ├── fmacros.h │ │ │ ├── hiredis.c │ │ │ ├── hiredis.h │ │ │ ├── hiredis.pc.in │ │ │ ├── hiredis_ssl.h │ │ │ ├── hiredis_ssl.pc.in │ │ │ ├── net.c │ │ │ ├── net.h │ │ │ ├── read.c │ │ │ ├── read.h │ │ │ ├── sds.c │ │ │ ├── sds.h │ │ │ ├── sdsalloc.h │ │ │ ├── sockcompat.c │ │ │ ├── sockcompat.h │ │ │ ├── ssl.c │ │ │ ├── test.c │ │ │ ├── test.sh │ │ │ └── win32.h │ │ ├── jemalloc/ │ │ │ ├── .appveyor.yml │ │ │ ├── .autom4te.cfg │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── COPYING │ │ │ ├── ChangeLog │ │ │ ├── INSTALL.md │ │ │ ├── Makefile.in │ │ │ ├── README │ │ │ ├── TUNING.md │ │ │ ├── autogen.sh │ │ │ ├── bin/ │ │ │ │ ├── jemalloc-config.in │ │ │ │ ├── jemalloc.sh.in │ │ │ │ └── jeprof.in │ │ │ ├── build-aux/ │ │ │ │ ├── config.guess │ │ │ │ ├── config.sub │ │ │ │ └── install-sh │ │ │ ├── config.stamp.in │ │ │ ├── configure.ac │ │ │ ├── doc/ │ │ │ │ ├── html.xsl.in │ │ │ │ ├── jemalloc.xml.in │ │ │ │ ├── manpages.xsl.in │ │ │ │ └── stylesheet.xsl │ │ │ ├── include/ │ │ │ │ ├── jemalloc/ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ ├── arena_externs.h │ │ │ │ │ │ ├── arena_inlines_a.h │ │ │ │ │ │ ├── arena_inlines_b.h │ │ │ │ │ │ ├── arena_stats.h │ │ │ │ │ │ ├── arena_structs_a.h │ │ │ │ │ │ ├── arena_structs_b.h │ │ │ │ │ │ ├── arena_types.h │ │ │ │ │ │ ├── assert.h │ │ │ │ │ │ ├── atomic.h │ │ │ │ │ │ ├── atomic_c11.h │ │ │ │ │ │ ├── atomic_gcc_atomic.h │ │ │ │ │ │ ├── atomic_gcc_sync.h │ │ │ │ │ │ ├── atomic_msvc.h │ │ │ │ │ │ ├── background_thread_externs.h │ │ │ │ │ │ ├── background_thread_inlines.h │ │ │ │ │ │ ├── background_thread_structs.h │ │ │ │ │ │ ├── base_externs.h │ │ │ │ │ │ ├── base_inlines.h │ │ │ │ │ │ ├── base_structs.h │ │ │ │ │ │ ├── base_types.h │ │ │ │ │ │ ├── bin.h │ │ │ │ │ │ ├── bin_stats.h │ │ │ │ │ │ ├── bit_util.h │ │ │ │ │ │ ├── bitmap.h │ │ │ │ │ │ ├── cache_bin.h │ │ │ │ │ │ ├── ckh.h │ │ │ │ │ │ ├── ctl.h │ │ │ │ │ │ ├── div.h │ │ │ │ │ │ ├── emitter.h │ │ │ │ │ │ ├── extent_dss.h │ │ │ │ │ │ ├── extent_externs.h │ │ │ │ │ │ ├── extent_inlines.h │ │ │ │ │ │ ├── extent_mmap.h │ │ │ │ │ │ ├── extent_structs.h │ │ │ │ │ │ ├── extent_types.h │ │ │ │ │ │ ├── hash.h │ │ │ │ │ │ ├── hooks.h │ │ │ │ │ │ ├── jemalloc_internal_decls.h │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in │ │ │ │ │ │ ├── jemalloc_internal_externs.h │ │ │ │ │ │ ├── jemalloc_internal_includes.h │ │ │ │ │ │ ├── jemalloc_internal_inlines_a.h │ │ │ │ │ │ ├── jemalloc_internal_inlines_b.h │ │ │ │ │ │ ├── jemalloc_internal_inlines_c.h │ │ │ │ │ │ ├── jemalloc_internal_macros.h │ │ │ │ │ │ ├── jemalloc_internal_types.h │ │ │ │ │ │ ├── jemalloc_preamble.h.in │ │ │ │ │ │ ├── large_externs.h │ │ │ │ │ │ ├── log.h │ │ │ │ │ │ ├── malloc_io.h │ │ │ │ │ │ ├── mutex.h │ │ │ │ │ │ ├── mutex_pool.h │ │ │ │ │ │ ├── mutex_prof.h │ │ │ │ │ │ ├── nstime.h │ │ │ │ │ │ ├── pages.h │ │ │ │ │ │ ├── ph.h │ │ │ │ │ │ ├── private_namespace.sh │ │ │ │ │ │ ├── private_symbols.sh │ │ │ │ │ │ ├── prng.h │ │ │ │ │ │ ├── prof_externs.h │ │ │ │ │ │ ├── prof_inlines_a.h │ │ │ │ │ │ ├── prof_inlines_b.h │ │ │ │ │ │ ├── prof_structs.h │ │ │ │ │ │ ├── prof_types.h │ │ │ │ │ │ ├── public_namespace.sh │ │ │ │ │ │ ├── public_unnamespace.sh │ │ │ │ │ │ ├── ql.h │ │ │ │ │ │ ├── qr.h │ │ │ │ │ │ ├── rb.h │ │ │ │ │ │ ├── rtree.h │ │ │ │ │ │ ├── rtree_tsd.h │ │ │ │ │ │ ├── size_classes.sh │ │ │ │ │ │ ├── smoothstep.h │ │ │ │ │ │ ├── smoothstep.sh │ │ │ │ │ │ ├── spin.h │ │ │ │ │ │ ├── stats.h │ │ │ │ │ │ ├── sz.h │ │ │ │ │ │ ├── tcache_externs.h │ │ │ │ │ │ ├── tcache_inlines.h │ │ │ │ │ │ ├── tcache_structs.h │ │ │ │ │ │ ├── tcache_types.h │ │ │ │ │ │ ├── ticker.h │ │ │ │ │ │ ├── tsd.h │ │ │ │ │ │ ├── tsd_generic.h │ │ │ │ │ │ ├── tsd_malloc_thread_cleanup.h │ │ │ │ │ │ ├── tsd_tls.h │ │ │ │ │ │ ├── tsd_types.h │ │ │ │ │ │ ├── tsd_win.h │ │ │ │ │ │ ├── util.h │ │ │ │ │ │ └── witness.h │ │ │ │ │ ├── jemalloc.sh │ │ │ │ │ ├── jemalloc_defs.h.in │ │ │ │ │ ├── jemalloc_macros.h.in │ │ │ │ │ ├── jemalloc_mangle.sh │ │ │ │ │ ├── jemalloc_protos.h.in │ │ │ │ │ ├── jemalloc_rename.sh │ │ │ │ │ └── jemalloc_typedefs.h.in │ │ │ │ └── msvc_compat/ │ │ │ │ ├── C99/ │ │ │ │ │ ├── stdbool.h │ │ │ │ │ └── stdint.h │ │ │ │ ├── strings.h │ │ │ │ └── windows_extra.h │ │ │ ├── jemalloc.pc.in │ │ │ ├── m4/ │ │ │ │ └── ax_cxx_compile_stdcxx.m4 │ │ │ ├── msvc/ │ │ │ │ ├── ReadMe.txt │ │ │ │ ├── jemalloc_vc2015.sln │ │ │ │ ├── jemalloc_vc2017.sln │ │ │ │ ├── projects/ │ │ │ │ │ ├── vc2015/ │ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ │ ├── jemalloc.vcxproj │ │ │ │ │ │ │ └── jemalloc.vcxproj.filters │ │ │ │ │ │ └── test_threads/ │ │ │ │ │ │ ├── test_threads.vcxproj │ │ │ │ │ │ └── test_threads.vcxproj.filters │ │ │ │ │ └── vc2017/ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ ├── jemalloc.vcxproj │ │ │ │ │ │ └── jemalloc.vcxproj.filters │ │ │ │ │ └── test_threads/ │ │ │ │ │ ├── test_threads.vcxproj │ │ │ │ │ └── test_threads.vcxproj.filters │ │ │ │ └── test_threads/ │ │ │ │ ├── test_threads.cpp │ │ │ │ ├── test_threads.h │ │ │ │ └── test_threads_main.cpp │ │ │ ├── run_tests.sh │ │ │ ├── scripts/ │ │ │ │ ├── gen_run_tests.py │ │ │ │ └── gen_travis.py │ │ │ ├── src/ │ │ │ │ ├── arena.c │ │ │ │ ├── background_thread.c │ │ │ │ ├── base.c │ │ │ │ ├── bin.c │ │ │ │ ├── bitmap.c │ │ │ │ ├── ckh.c │ │ │ │ ├── ctl.c │ │ │ │ ├── div.c │ │ │ │ ├── extent.c │ │ │ │ ├── extent_dss.c │ │ │ │ ├── extent_mmap.c │ │ │ │ ├── hash.c │ │ │ │ ├── hooks.c │ │ │ │ ├── jemalloc.c │ │ │ │ ├── jemalloc_cpp.cpp │ │ │ │ ├── large.c │ │ │ │ ├── log.c │ │ │ │ ├── malloc_io.c │ │ │ │ ├── mutex.c │ │ │ │ ├── mutex_pool.c │ │ │ │ ├── nstime.c │ │ │ │ ├── pages.c │ │ │ │ ├── prng.c │ │ │ │ ├── prof.c │ │ │ │ ├── rtree.c │ │ │ │ ├── stats.c │ │ │ │ ├── sz.c │ │ │ │ ├── tcache.c │ │ │ │ ├── ticker.c │ │ │ │ ├── tsd.c │ │ │ │ ├── witness.c │ │ │ │ └── zone.c │ │ │ └── test/ │ │ │ ├── include/ │ │ │ │ └── test/ │ │ │ │ ├── SFMT-alti.h │ │ │ │ ├── SFMT-params.h │ │ │ │ ├── SFMT-params11213.h │ │ │ │ ├── SFMT-params1279.h │ │ │ │ ├── SFMT-params132049.h │ │ │ │ ├── SFMT-params19937.h │ │ │ │ ├── SFMT-params216091.h │ │ │ │ ├── SFMT-params2281.h │ │ │ │ ├── SFMT-params4253.h │ │ │ │ ├── SFMT-params44497.h │ │ │ │ ├── SFMT-params607.h │ │ │ │ ├── SFMT-params86243.h │ │ │ │ ├── SFMT-sse2.h │ │ │ │ ├── SFMT.h │ │ │ │ ├── btalloc.h │ │ │ │ ├── extent_hooks.h │ │ │ │ ├── jemalloc_test.h.in │ │ │ │ ├── jemalloc_test_defs.h.in │ │ │ │ ├── math.h │ │ │ │ ├── mq.h │ │ │ │ ├── mtx.h │ │ │ │ ├── test.h │ │ │ │ ├── thd.h │ │ │ │ └── timer.h │ │ │ ├── integration/ │ │ │ │ ├── MALLOCX_ARENA.c │ │ │ │ ├── aligned_alloc.c │ │ │ │ ├── allocated.c │ │ │ │ ├── extent.c │ │ │ │ ├── extent.sh │ │ │ │ ├── mallocx.c │ │ │ │ ├── mallocx.sh │ │ │ │ ├── overflow.c │ │ │ │ ├── posix_memalign.c │ │ │ │ ├── rallocx.c │ │ │ │ ├── sdallocx.c │ │ │ │ ├── thread_arena.c │ │ │ │ ├── thread_tcache_enabled.c │ │ │ │ ├── xallocx.c │ │ │ │ └── xallocx.sh │ │ │ ├── src/ │ │ │ │ ├── SFMT.c │ │ │ │ ├── btalloc.c │ │ │ │ ├── btalloc_0.c │ │ │ │ ├── btalloc_1.c │ │ │ │ ├── math.c │ │ │ │ ├── mq.c │ │ │ │ ├── mtx.c │ │ │ │ ├── test.c │ │ │ │ ├── thd.c │ │ │ │ └── timer.c │ │ │ ├── stress/ │ │ │ │ └── microbench.c │ │ │ ├── test.sh.in │ │ │ └── unit/ │ │ │ ├── SFMT.c │ │ │ ├── a0.c │ │ │ ├── arena_reset.c │ │ │ ├── arena_reset_prof.c │ │ │ ├── arena_reset_prof.sh │ │ │ ├── atomic.c │ │ │ ├── background_thread.c │ │ │ ├── background_thread_enable.c │ │ │ ├── base.c │ │ │ ├── bit_util.c │ │ │ ├── bitmap.c │ │ │ ├── ckh.c │ │ │ ├── decay.c │ │ │ ├── decay.sh │ │ │ ├── div.c │ │ │ ├── emitter.c │ │ │ ├── extent_quantize.c │ │ │ ├── fork.c │ │ │ ├── hash.c │ │ │ ├── hooks.c │ │ │ ├── junk.c │ │ │ ├── junk.sh │ │ │ ├── junk_alloc.c │ │ │ ├── junk_alloc.sh │ │ │ ├── junk_free.c │ │ │ ├── junk_free.sh │ │ │ ├── log.c │ │ │ ├── mallctl.c │ │ │ ├── malloc_io.c │ │ │ ├── math.c │ │ │ ├── mq.c │ │ │ ├── mtx.c │ │ │ ├── nstime.c │ │ │ ├── pack.c │ │ │ ├── pack.sh │ │ │ ├── pages.c │ │ │ ├── ph.c │ │ │ ├── prng.c │ │ │ ├── prof_accum.c │ │ │ ├── prof_accum.sh │ │ │ ├── prof_active.c │ │ │ ├── prof_active.sh │ │ │ ├── prof_gdump.c │ │ │ ├── prof_gdump.sh │ │ │ ├── prof_idump.c │ │ │ ├── prof_idump.sh │ │ │ ├── prof_reset.c │ │ │ ├── prof_reset.sh │ │ │ ├── prof_tctx.c │ │ │ ├── prof_tctx.sh │ │ │ ├── prof_thread_name.c │ │ │ ├── prof_thread_name.sh │ │ │ ├── ql.c │ │ │ ├── qr.c │ │ │ ├── rb.c │ │ │ ├── retained.c │ │ │ ├── rtree.c │ │ │ ├── size_classes.c │ │ │ ├── slab.c │ │ │ ├── smoothstep.c │ │ │ ├── spin.c │ │ │ ├── stats.c │ │ │ ├── stats_print.c │ │ │ ├── ticker.c │ │ │ ├── tsd.c │ │ │ ├── witness.c │ │ │ ├── zero.c │ │ │ └── zero.sh │ │ ├── linenoise/ │ │ │ ├── .gitignore │ │ │ ├── Makefile │ │ │ ├── README.markdown │ │ │ ├── example.c │ │ │ ├── linenoise.c │ │ │ └── linenoise.h │ │ ├── lua/ │ │ │ ├── COPYRIGHT │ │ │ ├── HISTORY │ │ │ ├── INSTALL │ │ │ ├── Makefile │ │ │ ├── README │ │ │ ├── doc/ │ │ │ │ ├── contents.html │ │ │ │ ├── lua.1 │ │ │ │ ├── lua.css │ │ │ │ ├── lua.html │ │ │ │ ├── luac.1 │ │ │ │ ├── luac.html │ │ │ │ ├── manual.css │ │ │ │ ├── manual.html │ │ │ │ └── readme.html │ │ │ ├── etc/ │ │ │ │ ├── Makefile │ │ │ │ ├── README │ │ │ │ ├── all.c │ │ │ │ ├── lua.hpp │ │ │ │ ├── lua.pc │ │ │ │ ├── luavs.bat │ │ │ │ ├── min.c │ │ │ │ ├── noparser.c │ │ │ │ └── strict.lua │ │ │ ├── src/ │ │ │ │ ├── Makefile │ │ │ │ ├── fpconv.c │ │ │ │ ├── fpconv.h │ │ │ │ ├── lapi.c │ │ │ │ ├── lapi.h │ │ │ │ ├── lauxlib.c │ │ │ │ ├── lauxlib.h │ │ │ │ ├── lbaselib.c │ │ │ │ ├── lcode.c │ │ │ │ ├── lcode.h │ │ │ │ ├── ldblib.c │ │ │ │ ├── ldebug.c │ │ │ │ ├── ldebug.h │ │ │ │ ├── ldo.c │ │ │ │ ├── ldo.h │ │ │ │ ├── ldump.c │ │ │ │ ├── lfunc.c │ │ │ │ ├── lfunc.h │ │ │ │ ├── lgc.c │ │ │ │ ├── lgc.h │ │ │ │ ├── linit.c │ │ │ │ ├── liolib.c │ │ │ │ ├── llex.c │ │ │ │ ├── llex.h │ │ │ │ ├── llimits.h │ │ │ │ ├── lmathlib.c │ │ │ │ ├── lmem.c │ │ │ │ ├── lmem.h │ │ │ │ ├── loadlib.c │ │ │ │ ├── lobject.c │ │ │ │ ├── lobject.h │ │ │ │ ├── lopcodes.c │ │ │ │ ├── lopcodes.h │ │ │ │ ├── loslib.c │ │ │ │ ├── lparser.c │ │ │ │ ├── lparser.h │ │ │ │ ├── lstate.c │ │ │ │ ├── lstate.h │ │ │ │ ├── lstring.c │ │ │ │ ├── lstring.h │ │ │ │ ├── lstrlib.c │ │ │ │ ├── ltable.c │ │ │ │ ├── ltable.h │ │ │ │ ├── ltablib.c │ │ │ │ ├── ltm.c │ │ │ │ ├── ltm.h │ │ │ │ ├── lua.c │ │ │ │ ├── lua.h │ │ │ │ ├── lua_bit.c │ │ │ │ ├── lua_cjson.c │ │ │ │ ├── lua_cmsgpack.c │ │ │ │ ├── lua_struct.c │ │ │ │ ├── luac.c │ │ │ │ ├── luaconf.h │ │ │ │ ├── lualib.h │ │ │ │ ├── lundump.c │ │ │ │ ├── lundump.h │ │ │ │ ├── lvm.c │ │ │ │ ├── lvm.h │ │ │ │ ├── lzio.c │ │ │ │ ├── lzio.h │ │ │ │ ├── print.c │ │ │ │ ├── strbuf.c │ │ │ │ └── strbuf.h │ │ │ └── test/ │ │ │ ├── README │ │ │ ├── bisect.lua │ │ │ ├── cf.lua │ │ │ ├── echo.lua │ │ │ ├── env.lua │ │ │ ├── factorial.lua │ │ │ ├── fib.lua │ │ │ ├── fibfor.lua │ │ │ ├── globals.lua │ │ │ ├── hello.lua │ │ │ ├── life.lua │ │ │ ├── luac.lua │ │ │ ├── printf.lua │ │ │ ├── readonly.lua │ │ │ ├── sieve.lua │ │ │ ├── sort.lua │ │ │ ├── table.lua │ │ │ ├── trace-calls.lua │ │ │ ├── trace-globals.lua │ │ │ └── xd.lua │ │ └── update-jemalloc.sh │ ├── redis.conf │ ├── runtest │ ├── runtest-cluster │ ├── runtest-moduleapi │ ├── runtest-sentinel │ ├── sentinel.conf │ ├── src/ │ │ ├── .gitignore │ │ ├── Makefile │ │ ├── acl.c │ │ ├── adlist.c │ │ ├── adlist.h │ │ ├── ae.c │ │ ├── ae.h │ │ ├── ae_epoll.c │ │ ├── ae_evport.c │ │ ├── ae_kqueue.c │ │ ├── ae_select.c │ │ ├── anet.c │ │ ├── anet.h │ │ ├── aof.c │ │ ├── asciilogo.h │ │ ├── atomicvar.h │ │ ├── bio.c │ │ ├── bio.h │ │ ├── bitops.c │ │ ├── blocked.c │ │ ├── childinfo.c │ │ ├── cluster.c │ │ ├── cluster.h │ │ ├── config.c │ │ ├── config.h │ │ ├── connection.c │ │ ├── connection.h │ │ ├── connhelpers.h │ │ ├── crc16.c │ │ ├── crc16_slottable.h │ │ ├── crc64.c │ │ ├── crc64.h │ │ ├── crcspeed.c │ │ ├── crcspeed.h │ │ ├── db.c │ │ ├── debug.c │ │ ├── debugmacro.h │ │ ├── defrag.c │ │ ├── dict.c │ │ ├── dict.h │ │ ├── endianconv.c │ │ ├── endianconv.h │ │ ├── evict.c │ │ ├── expire.c │ │ ├── fmacros.h │ │ ├── geo.c │ │ ├── geo.h │ │ ├── geohash.c │ │ ├── geohash.h │ │ ├── geohash_helper.c │ │ ├── geohash_helper.h │ │ ├── gopher.c │ │ ├── help.h │ │ ├── hyperloglog.c │ │ ├── intset.c │ │ ├── intset.h │ │ ├── latency.c │ │ ├── latency.h │ │ ├── lazyfree.c │ │ ├── listpack.c │ │ ├── listpack.h │ │ ├── listpack_malloc.h │ │ ├── localtime.c │ │ ├── lolwut.c │ │ ├── lolwut.h │ │ ├── lolwut5.c │ │ ├── lolwut6.c │ │ ├── lzf.h │ │ ├── lzfP.h │ │ ├── lzf_c.c │ │ ├── lzf_d.c │ │ ├── memtest.c │ │ ├── mkreleasehdr.sh │ │ ├── module.c │ │ ├── modules/ │ │ │ ├── .gitignore │ │ │ ├── Makefile │ │ │ ├── gendoc.rb │ │ │ ├── helloacl.c │ │ │ ├── helloblock.c │ │ │ ├── hellocluster.c │ │ │ ├── hellodict.c │ │ │ ├── hellohook.c │ │ │ ├── hellotimer.c │ │ │ ├── hellotype.c │ │ │ ├── helloworld.c │ │ │ └── testmodule.c │ │ ├── multi.c │ │ ├── networking.c │ │ ├── notify.c │ │ ├── object.c │ │ ├── pqsort.c │ │ ├── pqsort.h │ │ ├── pubsub.c │ │ ├── quicklist.c │ │ ├── quicklist.h │ │ ├── rand.c │ │ ├── rand.h │ │ ├── rax.c │ │ ├── rax.h │ │ ├── rax_malloc.h │ │ ├── rdb.c │ │ ├── rdb.h │ │ ├── redis-benchmark.c │ │ ├── redis-check-aof.c │ │ ├── redis-check-rdb.c │ │ ├── redis-cli.c │ │ ├── redis-trib.rb │ │ ├── redisassert.h │ │ ├── redismodule.h │ │ ├── release.c │ │ ├── replication.c │ │ ├── rio.c │ │ ├── rio.h │ │ ├── scripting.c │ │ ├── sds.c │ │ ├── sds.h │ │ ├── sdsalloc.h │ │ ├── sentinel.c │ │ ├── server.c │ │ ├── server.h │ │ ├── setcpuaffinity.c │ │ ├── setproctitle.c │ │ ├── sha1.c │ │ ├── sha1.h │ │ ├── sha256.c │ │ ├── sha256.h │ │ ├── siphash.c │ │ ├── slowlog.c │ │ ├── slowlog.h │ │ ├── solarisfixes.h │ │ ├── sort.c │ │ ├── sparkline.c │ │ ├── sparkline.h │ │ ├── stream.h │ │ ├── syncio.c │ │ ├── t_hash.c │ │ ├── t_list.c │ │ ├── t_set.c │ │ ├── t_stream.c │ │ ├── t_string.c │ │ ├── t_zset.c │ │ ├── testhelp.h │ │ ├── timeout.c │ │ ├── tls.c │ │ ├── tracking.c │ │ ├── util.c │ │ ├── util.h │ │ ├── valgrind.sup │ │ ├── version.h │ │ ├── ziplist.c │ │ ├── ziplist.h │ │ ├── zipmap.c │ │ ├── zipmap.h │ │ ├── zmalloc.c │ │ └── zmalloc.h │ ├── tests/ │ │ ├── assets/ │ │ │ ├── default.conf │ │ │ ├── encodings.rdb │ │ │ └── hash-zipmap.rdb │ │ ├── cluster/ │ │ │ ├── cluster.tcl │ │ │ ├── run.tcl │ │ │ ├── tests/ │ │ │ │ ├── 00-base.tcl │ │ │ │ ├── 01-faildet.tcl │ │ │ │ ├── 02-failover.tcl │ │ │ │ ├── 03-failover-loop.tcl │ │ │ │ ├── 04-resharding.tcl │ │ │ │ ├── 05-slave-selection.tcl │ │ │ │ ├── 06-slave-stop-cond.tcl │ │ │ │ ├── 07-replica-migration.tcl │ │ │ │ ├── 08-update-msg.tcl │ │ │ │ ├── 09-pubsub.tcl │ │ │ │ ├── 10-manual-failover.tcl │ │ │ │ ├── 11-manual-takeover.tcl │ │ │ │ ├── 12-replica-migration-2.tcl │ │ │ │ ├── 13-no-failover-option.tcl │ │ │ │ ├── 14-consistency-check.tcl │ │ │ │ ├── 15-cluster-slots.tcl │ │ │ │ ├── helpers/ │ │ │ │ │ └── onlydots.tcl │ │ │ │ └── includes/ │ │ │ │ └── init-tests.tcl │ │ │ └── tmp/ │ │ │ └── .gitignore │ │ ├── helpers/ │ │ │ ├── bg_block_op.tcl │ │ │ ├── bg_complex_data.tcl │ │ │ └── gen_write_load.tcl │ │ ├── instances.tcl │ │ ├── integration/ │ │ │ ├── aof-race.tcl │ │ │ ├── aof.tcl │ │ │ ├── block-repl.tcl │ │ │ ├── convert-zipmap-hash-on-load.tcl │ │ │ ├── logging.tcl │ │ │ ├── psync2-pingoff.tcl │ │ │ ├── psync2-reg.tcl │ │ │ ├── psync2.tcl │ │ │ ├── rdb.tcl │ │ │ ├── redis-cli.tcl │ │ │ ├── replication-2.tcl │ │ │ ├── replication-3.tcl │ │ │ ├── replication-4.tcl │ │ │ ├── replication-psync.tcl │ │ │ └── replication.tcl │ │ ├── modules/ │ │ │ ├── Makefile │ │ │ ├── auth.c │ │ │ ├── blockonkeys.c │ │ │ ├── commandfilter.c │ │ │ ├── datatype.c │ │ │ ├── fork.c │ │ │ ├── hooks.c │ │ │ ├── infotest.c │ │ │ ├── misc.c │ │ │ ├── propagate.c │ │ │ ├── scan.c │ │ │ └── testrdb.c │ │ ├── sentinel/ │ │ │ ├── run.tcl │ │ │ ├── tests/ │ │ │ │ ├── 00-base.tcl │ │ │ │ ├── 01-conf-update.tcl │ │ │ │ ├── 02-slaves-reconf.tcl │ │ │ │ ├── 03-runtime-reconf.tcl │ │ │ │ ├── 04-slave-selection.tcl │ │ │ │ ├── 05-manual.tcl │ │ │ │ ├── 06-ckquorum.tcl │ │ │ │ ├── 07-down-conditions.tcl │ │ │ │ └── includes/ │ │ │ │ └── init-tests.tcl │ │ │ └── tmp/ │ │ │ └── .gitignore │ │ ├── support/ │ │ │ ├── cli.tcl │ │ │ ├── cluster.tcl │ │ │ ├── redis.tcl │ │ │ ├── server.tcl │ │ │ ├── test.tcl │ │ │ ├── tmpfile.tcl │ │ │ └── util.tcl │ │ ├── test_helper.tcl │ │ └── unit/ │ │ ├── acl.tcl │ │ ├── aofrw.tcl │ │ ├── auth.tcl │ │ ├── bitfield.tcl │ │ ├── bitops.tcl │ │ ├── dump.tcl │ │ ├── expire.tcl │ │ ├── geo.tcl │ │ ├── hyperloglog.tcl │ │ ├── introspection-2.tcl │ │ ├── introspection.tcl │ │ ├── keyspace.tcl │ │ ├── latency-monitor.tcl │ │ ├── lazyfree.tcl │ │ ├── limits.tcl │ │ ├── maxmemory.tcl │ │ ├── memefficiency.tcl │ │ ├── moduleapi/ │ │ │ ├── auth.tcl │ │ │ ├── blockonkeys.tcl │ │ │ ├── commandfilter.tcl │ │ │ ├── datatype.tcl │ │ │ ├── fork.tcl │ │ │ ├── hooks.tcl │ │ │ ├── infotest.tcl │ │ │ ├── misc.tcl │ │ │ ├── propagate.tcl │ │ │ ├── scan.tcl │ │ │ └── testrdb.tcl │ │ ├── multi.tcl │ │ ├── obuf-limits.tcl │ │ ├── other.tcl │ │ ├── pendingquerybuf.tcl │ │ ├── printver.tcl │ │ ├── protocol.tcl │ │ ├── pubsub.tcl │ │ ├── quit.tcl │ │ ├── scan.tcl │ │ ├── scripting.tcl │ │ ├── slowlog.tcl │ │ ├── sort.tcl │ │ ├── tls.tcl │ │ ├── tracking.tcl │ │ ├── type/ │ │ │ ├── hash.tcl │ │ │ ├── incr.tcl │ │ │ ├── list-2.tcl │ │ │ ├── list-3.tcl │ │ │ ├── list-common.tcl │ │ │ ├── list.tcl │ │ │ ├── set.tcl │ │ │ ├── stream-cgroups.tcl │ │ │ ├── stream.tcl │ │ │ ├── string.tcl │ │ │ └── zset.tcl │ │ └── wait.tcl │ └── utils/ │ ├── build-static-symbols.tcl │ ├── cluster_fail_time.tcl │ ├── corrupt_rdb.c │ ├── create-cluster/ │ │ ├── .gitignore │ │ ├── README │ │ └── create-cluster │ ├── gen-test-certs.sh │ ├── generate-command-help.rb │ ├── graphs/ │ │ └── commits-over-time/ │ │ ├── README.md │ │ └── genhtml.tcl │ ├── hashtable/ │ │ ├── README │ │ └── rehashing.c │ ├── hyperloglog/ │ │ ├── .gitignore │ │ ├── hll-err.rb │ │ └── hll-gnuplot-graph.rb │ ├── install_server.sh │ ├── lru/ │ │ ├── README │ │ ├── lfu-simulation.c │ │ └── test-lru.rb │ ├── redis-copy.rb │ ├── redis-sha1.rb │ ├── redis_init_script │ ├── redis_init_script.tpl │ ├── releasetools/ │ │ ├── 01_create_tarball.sh │ │ ├── 02_upload_tarball.sh │ │ ├── 03_test_release.sh │ │ ├── 04_release_hash.sh │ │ └── changelog.tcl │ ├── speed-regression.tcl │ ├── srandmember/ │ │ ├── README.md │ │ ├── showdist.rb │ │ └── showfreq.rb │ ├── systemd-redis_multiple_servers@.service │ ├── systemd-redis_server.service │ ├── tracking_collisions.c │ └── whatisdoing.sh ├── Chapter09/ │ └── code/ │ ├── AsyncLogger/ │ │ ├── AsyncLogger.cpp │ │ ├── AsyncLogger.sln │ │ ├── AsyncLogger.vcxproj │ │ ├── AsyncLogger.vcxproj.filters │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ ├── AsyncLogger1/ │ │ ├── AsyncLogger.cpp │ │ ├── AsyncLogger.sln │ │ ├── AsyncLogger.vcxproj │ │ ├── AsyncLogger.vcxproj.filters │ │ ├── stdafx.cpp │ │ ├── stdafx.h │ │ └── targetver.h │ ├── AsyncLoggerLinux.cpp │ └── AsyncLoggerWindows/ │ ├── AsyncLogger.cpp │ ├── AsyncLogger.sln │ ├── AsyncLogger.vcxproj │ ├── AsyncLogger.vcxproj.filters │ ├── stdafx.cpp │ ├── stdafx.h │ └── targetver.h └── README.md
Showing preview only (1,099K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (13213 symbols across 1008 files)
FILE: Chapter01/codes/TestRAII1/TestRAII4.cpp
class ServerSocket (line 7) | class ServerSocket
method ServerSocket (line 10) | ServerSocket()
method DoInit (line 25) | bool DoInit()
method DoBind (line 47) | bool DoBind(const char* ip, short port = 6000)
method DoListen (line 59) | bool DoListen(int backlog = 15)
method DoAccept (line 67) | bool DoAccept()
function main (line 92) | int main(int argc, char* argv[])
FILE: Chapter01/codes/construct_complex_objects.cpp
type jsonType (line 11) | enum class jsonType
type jsonNode (line 23) | struct jsonNode
method jsonNode (line 25) | jsonNode(const char* key, const char* value) :
method jsonNode (line 33) | jsonNode(const char* key, double value) :
class json (line 46) | class json
method json (line 49) | static json& array(std::initializer_list<jsonNode> nodes)
method json (line 59) | json()
method toString (line 69) | std::string toString()
function main (line 92) | int main()
FILE: Chapter01/codes/test_auto_ptr.cpp
function main (line 7) | int main()
FILE: Chapter01/codes/test_custom_foreach_loop.cpp
class A (line 5) | class A
method A (line 8) | A()
method T (line 21) | T* begin()
method T (line 26) | T* end()
function main (line 35) | int main()
FILE: Chapter01/codes/test_initializer_list.cpp
class A (line 5) | class A
method A (line 8) | A(std::initializer_list<int> integers)
method append (line 18) | void append(std::initializer_list<int> integers)
method print (line 23) | void print()
function main (line 36) | int main()
FILE: Chapter01/codes/test_map_insert_or_assign.cpp
class ChatDialog (line 9) | class ChatDialog
method ChatDialog (line 13) | ChatDialog(int64_t userid) : m_userid(userid)
method activate (line 23) | void activate()
function onDoubleClickFriendItem3 (line 36) | void onDoubleClickFriendItem3(int64_t userid)
function main (line 56) | int main()
FILE: Chapter01/codes/test_map_try_emplace.cpp
class ChatDialog (line 7) | class ChatDialog
method activate (line 11) | void activate()
function onDoubleClickFriendItem (line 21) | void onDoubleClickFriendItem(int64_t userid)
function onDoubleClickFriendItem2 (line 39) | void onDoubleClickFriendItem2(int64_t userid)
function main (line 49) | int main()
FILE: Chapter01/codes/test_map_try_emplace_with_directobject.cpp
class ChatDialog (line 9) | class ChatDialog
method ChatDialog (line 13) | ChatDialog(int64_t userid) : m_userid(userid)
method activate (line 23) | void activate()
function onDoubleClickFriendItem3 (line 36) | void onDoubleClickFriendItem3(int64_t userid)
function main (line 43) | int main()
FILE: Chapter01/codes/test_map_try_emplace_with_smartpointer.cpp
class ChatDialog (line 10) | class ChatDialog
method ChatDialog (line 14) | ChatDialog()
method activate (line 24) | void activate()
function onDoubleClickFriendItem3 (line 34) | void onDoubleClickFriendItem3(int64_t userid)
function main (line 42) | int main()
FILE: Chapter01/codes/test_map_try_emplace_with_smartpointer2.cpp
class ChatDialog (line 10) | class ChatDialog
method ChatDialog (line 14) | ChatDialog()
method activate (line 24) | void activate()
function onDoubleClickFriendItem3 (line 34) | void onDoubleClickFriendItem3(int64_t userid)
function main (line 48) | int main()
FILE: Chapter01/codes/test_shared_ptr_use_count.cpp
class A (line 7) | class A
method A (line 10) | A()
function main (line 21) | int main()
FILE: Chapter01/codes/test_std_enable_shared_from_this.cpp
class A (line 5) | class A : public std::enable_shared_from_this<A>
method A (line 8) | A()
method getSelf (line 18) | std::shared_ptr<A> getSelf()
function main (line 25) | int main()
FILE: Chapter01/codes/test_std_enable_shared_from_this_problem.cpp
class A (line 6) | class A : public std::enable_shared_from_this<A>
method A (line 9) | A()
method func (line 26) | void func()
function main (line 37) | int main()
FILE: Chapter01/codes/test_unique_ptr.cpp
function main (line 7) | int main()
FILE: Chapter01/codes/test_unique_ptr_deletor.cpp
class Socket (line 4) | class Socket
method Socket (line 7) | Socket()
method close (line 18) | void close()
function main (line 24) | int main()
FILE: Chapter01/codes/test_unique_ptr_with_array.cpp
function main (line 4) | int main()
FILE: Chapter01/codes/test_weak_ptr.cpp
function main (line 7) | int main()
FILE: Chapter02/codes/main.cpp
function main (line 32) | int main()
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/ae.h
type redisAeEvents (line 38) | typedef struct redisAeEvents {
function redisAeReadEvent (line 45) | static void redisAeReadEvent(aeEventLoop *el, int fd, void *privdata, in...
function redisAeWriteEvent (line 52) | static void redisAeWriteEvent(aeEventLoop *el, int fd, void *privdata, i...
function redisAeAddRead (line 59) | static void redisAeAddRead(void *privdata) {
function redisAeDelRead (line 68) | static void redisAeDelRead(void *privdata) {
function redisAeAddWrite (line 77) | static void redisAeAddWrite(void *privdata) {
function redisAeDelWrite (line 86) | static void redisAeDelWrite(void *privdata) {
function redisAeCleanup (line 95) | static void redisAeCleanup(void *privdata) {
function redisAeAttach (line 102) | static int redisAeAttach(aeEventLoop *loop, redisAsyncContext *ac) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/glib.h
type RedisSource (line 9) | typedef struct
function redis_source_add_read (line 16) | static void
function redis_source_del_read (line 25) | static void
function redis_source_add_write (line 34) | static void
function redis_source_del_write (line 43) | static void
function redis_source_cleanup (line 52) | static void
function gboolean (line 71) | static gboolean
function gboolean (line 80) | static gboolean
function gboolean (line 87) | static gboolean
function redis_source_finalize (line 111) | static void
function GSource (line 122) | static GSource *
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/ivykis.h
type redisIvykisEvents (line 7) | typedef struct redisIvykisEvents {
function redisIvykisReadEvent (line 12) | static void redisIvykisReadEvent(void *arg) {
function redisIvykisWriteEvent (line 17) | static void redisIvykisWriteEvent(void *arg) {
function redisIvykisAddRead (line 22) | static void redisIvykisAddRead(void *privdata) {
function redisIvykisDelRead (line 27) | static void redisIvykisDelRead(void *privdata) {
function redisIvykisAddWrite (line 32) | static void redisIvykisAddWrite(void *privdata) {
function redisIvykisDelWrite (line 37) | static void redisIvykisDelWrite(void *privdata) {
function redisIvykisCleanup (line 42) | static void redisIvykisCleanup(void *privdata) {
function redisIvykisAttach (line 49) | static int redisIvykisAttach(redisAsyncContext *ac) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/libev.h
type redisLibevEvents (line 39) | typedef struct redisLibevEvents {
function redisLibevReadEvent (line 46) | static void redisLibevReadEvent(EV_P_ ev_io *watcher, int revents) {
function redisLibevWriteEvent (line 56) | static void redisLibevWriteEvent(EV_P_ ev_io *watcher, int revents) {
function redisLibevAddRead (line 66) | static void redisLibevAddRead(void *privdata) {
function redisLibevDelRead (line 76) | static void redisLibevDelRead(void *privdata) {
function redisLibevAddWrite (line 86) | static void redisLibevAddWrite(void *privdata) {
function redisLibevDelWrite (line 96) | static void redisLibevDelWrite(void *privdata) {
function redisLibevCleanup (line 106) | static void redisLibevCleanup(void *privdata) {
function redisLibevAttach (line 113) | static int redisLibevAttach(EV_P_ redisAsyncContext *ac) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/libevent.h
type redisLibeventEvents (line 40) | typedef struct redisLibeventEvents {
function redisLibeventDestroy (line 49) | static void redisLibeventDestroy(redisLibeventEvents *e) {
function redisLibeventHandler (line 53) | static void redisLibeventHandler(int fd, short event, void *arg) {
function redisLibeventUpdate (line 82) | static void redisLibeventUpdate(void *privdata, short flag, int isRemove) {
function redisLibeventAddRead (line 106) | static void redisLibeventAddRead(void *privdata) {
function redisLibeventDelRead (line 110) | static void redisLibeventDelRead(void *privdata) {
function redisLibeventAddWrite (line 114) | static void redisLibeventAddWrite(void *privdata) {
function redisLibeventDelWrite (line 118) | static void redisLibeventDelWrite(void *privdata) {
function redisLibeventCleanup (line 122) | static void redisLibeventCleanup(void *privdata) {
function redisLibeventSetTimeout (line 138) | static void redisLibeventSetTimeout(void *privdata, struct timeval tv) {
function redisLibeventAttach (line 146) | static int redisLibeventAttach(redisAsyncContext *ac, struct event_base ...
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/libuv.h
type redisLibuvEvents (line 9) | typedef struct redisLibuvEvents {
function redisLibuvPoll (line 16) | static void redisLibuvPoll(uv_poll_t* handle, int status, int events) {
function redisLibuvAddRead (line 29) | static void redisLibuvAddRead(void *privdata) {
function redisLibuvDelRead (line 38) | static void redisLibuvDelRead(void *privdata) {
function redisLibuvAddWrite (line 51) | static void redisLibuvAddWrite(void *privdata) {
function redisLibuvDelWrite (line 60) | static void redisLibuvDelWrite(void *privdata) {
function on_close (line 73) | static void on_close(uv_handle_t* handle) {
function redisLibuvCleanup (line 80) | static void redisLibuvCleanup(void *privdata) {
function redisLibuvAttach (line 88) | static int redisLibuvAttach(redisAsyncContext* ac, uv_loop_t* loop) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/macosx.h
type RedisRunLoop (line 14) | typedef struct {
function freeRedisRunLoop (line 20) | static int freeRedisRunLoop(RedisRunLoop* redisRunLoop) {
function redisMacOSAddRead (line 35) | static void redisMacOSAddRead(void *privdata) {
function redisMacOSDelRead (line 40) | static void redisMacOSDelRead(void *privdata) {
function redisMacOSAddWrite (line 45) | static void redisMacOSAddWrite(void *privdata) {
function redisMacOSDelWrite (line 50) | static void redisMacOSDelWrite(void *privdata) {
function redisMacOSCleanup (line 55) | static void redisMacOSCleanup(void *privdata) {
function redisMacOSAsyncCallback (line 60) | static void redisMacOSAsyncCallback(CFSocketRef __unused s, CFSocketCall...
function redisMacOSAttach (line 77) | static int redisMacOSAttach(redisAsyncContext *redisAsyncCtx, CFRunLoopR...
FILE: Chapter02/redis-6.0.3/deps/hiredis/adapters/qt.h
function class (line 37) | class RedisQtAdapter : public QObject {
FILE: Chapter02/redis-6.0.3/deps/hiredis/async.c
function callbackHash (line 53) | static unsigned int callbackHash(const void *key) {
function callbackKeyCompare (line 65) | static int callbackKeyCompare(void *privdata, const void *key1, const vo...
function callbackKeyDestructor (line 75) | static void callbackKeyDestructor(void *privdata, void *key) {
function callbackValDestructor (line 80) | static void callbackValDestructor(void *privdata, void *val) {
function redisAsyncContext (line 94) | static redisAsyncContext *redisAsyncInitialize(redisContext *c) {
function __redisAsyncCopyError (line 134) | static void __redisAsyncCopyError(redisAsyncContext *ac) {
function redisAsyncContext (line 143) | redisAsyncContext *redisAsyncConnectWithOptions(const redisOptions *opti...
function redisAsyncContext (line 162) | redisAsyncContext *redisAsyncConnect(const char *ip, int port) {
function redisAsyncContext (line 168) | redisAsyncContext *redisAsyncConnectBind(const char *ip, int port,
function redisAsyncContext (line 176) | redisAsyncContext *redisAsyncConnectBindWithReuse(const char *ip, int port,
function redisAsyncContext (line 185) | redisAsyncContext *redisAsyncConnectUnix(const char *path) {
function redisAsyncSetConnectCallback (line 191) | int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCall...
function redisAsyncSetDisconnectCallback (line 204) | int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconne...
function __redisPushCallback (line 213) | static int __redisPushCallback(redisCallbackList *list, redisCallback *s...
function __redisShiftCallback (line 235) | static int __redisShiftCallback(redisCallbackList *list, redisCallback *...
function __redisRunCallback (line 251) | static void __redisRunCallback(redisAsyncContext *ac, redisCallback *cb,...
function __redisAsyncFree (line 261) | static void __redisAsyncFree(redisAsyncContext *ac) {
function redisAsyncFree (line 309) | void redisAsyncFree(redisAsyncContext *ac) {
function __redisAsyncDisconnect (line 317) | void __redisAsyncDisconnect(redisAsyncContext *ac) {
function redisAsyncDisconnect (line 350) | void redisAsyncDisconnect(redisAsyncContext *ac) {
function __redisGetSubscribeCallback (line 360) | static int __redisGetSubscribeCallback(redisAsyncContext *ac, redisReply...
function redisProcessCallbacks (line 420) | void redisProcessCallbacks(redisAsyncContext *ac) {
function __redisAsyncHandleConnect (line 503) | static int __redisAsyncHandleConnect(redisAsyncContext *ac) {
function redisAsyncRead (line 522) | void redisAsyncRead(redisAsyncContext *ac) {
function redisAsyncHandleRead (line 537) | void redisAsyncHandleRead(redisAsyncContext *ac) {
function redisAsyncWrite (line 552) | void redisAsyncWrite(redisAsyncContext *ac) {
function redisAsyncHandleWrite (line 570) | void redisAsyncHandleWrite(redisAsyncContext *ac) {
function redisAsyncHandleTimeout (line 587) | void redisAsyncHandleTimeout(redisAsyncContext *ac) {
function __redisAsyncCommand (line 634) | static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *f...
function redisvAsyncCommand (line 714) | int redisvAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void ...
function redisAsyncCommand (line 729) | int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *...
function redisAsyncCommandArgv (line 738) | int redisAsyncCommandArgv(redisAsyncContext *ac, redisCallbackFn *fn, vo...
function redisAsyncFormattedCommand (line 750) | int redisAsyncFormattedCommand(redisAsyncContext *ac, redisCallbackFn *f...
function redisAsyncSetTimeout (line 755) | void redisAsyncSetTimeout(redisAsyncContext *ac, struct timeval tv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/async.h
type redisAsyncContext (line 40) | struct redisAsyncContext
type dict (line 41) | struct dict
type redisAsyncContext (line 44) | struct redisAsyncContext
type redisCallback (line 45) | typedef struct redisCallback {
type redisCallbackList (line 53) | typedef struct redisCallbackList {
type redisAsyncContext (line 58) | struct redisAsyncContext
type redisAsyncContext (line 59) | struct redisAsyncContext
type redisAsyncContext (line 63) | typedef struct redisAsyncContext {
type timeval (line 120) | struct timeval
FILE: Chapter02/redis-6.0.3/deps/hiredis/async_private.h
function refreshTimeout (line 56) | static inline void refreshTimeout(redisAsyncContext *ctx) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/dict.c
function dictGenHashFunction (line 53) | static unsigned int dictGenHashFunction(const unsigned char *buf, int le...
function _dictReset (line 65) | static void _dictReset(dict *ht) {
function dict (line 73) | static dict *dictCreate(dictType *type, void *privDataPtr) {
function _dictInit (line 80) | static int _dictInit(dict *ht, dictType *type, void *privDataPtr) {
function dictExpand (line 88) | static int dictExpand(dict *ht, unsigned long size) {
function dictAdd (line 135) | static int dictAdd(dict *ht, void *key, void *val) {
function dictReplace (line 160) | static int dictReplace(dict *ht, void *key, void *val) {
function dictDelete (line 182) | static int dictDelete(dict *ht, const void *key) {
function _dictClear (line 213) | static int _dictClear(dict *ht) {
function dictRelease (line 238) | static void dictRelease(dict *ht) {
function dictEntry (line 243) | static dictEntry *dictFind(dict *ht, const void *key) {
function dictIterator (line 258) | static dictIterator *dictGetIterator(dict *ht) {
function dictEntry (line 268) | static dictEntry *dictNext(dictIterator *iter) {
function dictReleaseIterator (line 288) | static void dictReleaseIterator(dictIterator *iter) {
function _dictExpandIfNeeded (line 295) | static int _dictExpandIfNeeded(dict *ht) {
function _dictNextPower (line 306) | static unsigned long _dictNextPower(unsigned long size) {
function _dictKeyIndex (line 320) | static int _dictKeyIndex(dict *ht, const void *key) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/dict.h
type dictEntry (line 45) | typedef struct dictEntry {
type dictType (line 51) | typedef struct dictType {
type dict (line 60) | typedef struct dict {
type dictIterator (line 69) | typedef struct dictIterator {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-ae.c
function getCallback (line 13) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 22) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 32) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 43) | int main (int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-glib.c
function connect_cb (line 9) | static void
function disconnect_cb (line 21) | static void
function command_cb (line 33) | static void
function gint (line 47) | gint
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-ivykis.c
function getCallback (line 10) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 19) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 27) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 35) | int main (int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-libev.c
function getCallback (line 10) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 19) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 27) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 35) | int main (int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-libevent-ssl.c
function getCallback (line 11) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 20) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 28) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 36) | int main (int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-libevent.c
function getCallback (line 10) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 24) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 32) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 40) | int main (int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-libuv.c
function getCallback (line 10) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 19) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 27) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 35) | int main (int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-macosx.c
function getCallback (line 12) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 21) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 29) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 38) | int main (int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-qt.cpp
function getCallback (line 9) | void getCallback(redisAsyncContext *, void * r, void * privdata) {
function main (line 36) | int main (int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-qt.h
function class (line 6) | class ExampleQt : public QObject {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example-ssl.c
function main (line 8) | int main(int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/examples/example.c
function main (line 7) | int main(int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/hiredis.c
function redisReply (line 76) | static redisReply *createReplyObject(int type) {
function freeReplyObject (line 87) | void freeReplyObject(void *reply) {
function countDigits (line 279) | static uint32_t countDigits(uint64_t v) {
function bulklen (line 292) | static size_t bulklen(size_t len) {
function redisvFormatCommand (line 296) | int redisvFormatCommand(char **target, const char *format, va_list ap) {
function redisFormatCommand (line 538) | int redisFormatCommand(char **target, const char *format, ...) {
function redisFormatSdsCommandArgv (line 559) | int redisFormatSdsCommandArgv(sds *target, int argc, const char **argv,
function redisFreeSdsCommand (line 603) | void redisFreeSdsCommand(sds cmd) {
function redisFormatCommandArgv (line 612) | int redisFormatCommandArgv(char **target, int argc, const char **argv, c...
function redisFreeCommand (line 650) | void redisFreeCommand(char *cmd) {
function __redisSetError (line 654) | void __redisSetError(redisContext *c, int type, const char *str) {
function redisReader (line 670) | redisReader *redisReaderCreate(void) {
function redisContext (line 674) | static redisContext *redisContextInit(const redisOptions *options) {
function redisFree (line 694) | void redisFree(redisContext *c) {
function redisFD (line 713) | redisFD redisFreeKeepFd(redisContext *c) {
function redisReconnect (line 720) | int redisReconnect(redisContext *c) {
function redisContext (line 751) | redisContext *redisConnectWithOptions(const redisOptions *options) {
function redisContext (line 789) | redisContext *redisConnect(const char *ip, int port) {
function redisContext (line 795) | redisContext *redisConnectWithTimeout(const char *ip, int port, const st...
function redisContext (line 802) | redisContext *redisConnectNonBlock(const char *ip, int port) {
function redisContext (line 809) | redisContext *redisConnectBindNonBlock(const char *ip, int port,
function redisContext (line 818) | redisContext *redisConnectBindNonBlockWithReuse(const char *ip, int port,
function redisContext (line 827) | redisContext *redisConnectUnix(const char *path) {
function redisContext (line 833) | redisContext *redisConnectUnixWithTimeout(const char *path, const struct...
function redisContext (line 840) | redisContext *redisConnectUnixNonBlock(const char *path) {
function redisContext (line 847) | redisContext *redisConnectFd(redisFD fd) {
function redisSetTimeout (line 855) | int redisSetTimeout(redisContext *c, const struct timeval tv) {
function redisEnableKeepAlive (line 862) | int redisEnableKeepAlive(redisContext *c) {
function redisBufferRead (line 873) | int redisBufferRead(redisContext *c) {
function redisBufferWrite (line 903) | int redisBufferWrite(redisContext *c, int *done) {
function redisGetReplyFromReader (line 928) | int redisGetReplyFromReader(redisContext *c, void **reply) {
function redisGetReply (line 936) | int redisGetReply(redisContext *c, void **reply) {
function __redisAppendCommand (line 973) | int __redisAppendCommand(redisContext *c, const char *cmd, size_t len) {
function redisAppendFormattedCommand (line 986) | int redisAppendFormattedCommand(redisContext *c, const char *cmd, size_t...
function redisvAppendCommand (line 995) | int redisvAppendCommand(redisContext *c, const char *format, va_list ap) {
function redisAppendCommand (line 1017) | int redisAppendCommand(redisContext *c, const char *format, ...) {
function redisAppendCommandArgv (line 1027) | int redisAppendCommandArgv(redisContext *c, int argc, const char **argv,...
FILE: Chapter02/redis-6.0.3/deps/hiredis/hiredis.h
type timeval (line 41) | struct timeval
type redisReply (line 98) | typedef struct redisReply {
type redisConnectionType (line 124) | enum redisConnectionType {
type redisSsl (line 130) | struct redisSsl
type redisFD (line 146) | typedef int redisFD;
type redisFD (line 150) | typedef unsigned long long redisFD;
type redisFD (line 152) | typedef unsigned long redisFD;
type redisOptions (line 157) | typedef struct {
type redisAsyncContext (line 195) | struct redisAsyncContext
type redisContext (line 196) | struct redisContext
type redisContextFuncs (line 198) | typedef struct redisContextFuncs {
type redisContext (line 207) | typedef struct redisContext {
type timeval (line 240) | struct timeval
type timeval (line 247) | struct timeval
type timeval (line 262) | struct timeval
FILE: Chapter02/redis-6.0.3/deps/hiredis/hiredis_ssl.h
type ssl_st (line 38) | struct ssl_st
type ssl_st (line 51) | struct ssl_st
FILE: Chapter02/redis-6.0.3/deps/hiredis/net.c
function redisNetClose (line 53) | void redisNetClose(redisContext *c) {
function redisNetRead (line 60) | int redisNetRead(redisContext *c, char *buf, size_t bufcap) {
function redisNetWrite (line 82) | int redisNetWrite(redisContext *c) {
function __redisSetErrorFromErrno (line 95) | static void __redisSetErrorFromErrno(redisContext *c, int type, const ch...
function redisSetReuseAddr (line 106) | static int redisSetReuseAddr(redisContext *c) {
function redisCreateSocket (line 116) | static int redisCreateSocket(redisContext *c, int type) {
function redisSetBlocking (line 131) | static int redisSetBlocking(redisContext *c, int blocking) {
function redisKeepAlive (line 165) | int redisKeepAlive(redisContext *c, int interval) {
function redisSetTcpNoDelay (line 206) | static int redisSetTcpNoDelay(redisContext *c) {
function redisContextTimeoutMsec (line 218) | static int redisContextTimeoutMsec(redisContext *c, long *result)
function redisContextWaitReady (line 241) | static int redisContextWaitReady(redisContext *c, long msec) {
function redisCheckConnectDone (line 274) | int redisCheckConnectDone(redisContext *c, int *completed) {
function redisCheckSocketError (line 294) | int redisCheckSocketError(redisContext *c) {
function redisContextSetTimeout (line 316) | int redisContextSetTimeout(redisContext *c, const struct timeval tv) {
function _redisContextConnectTcp (line 335) | static int _redisContextConnectTcp(redisContext *c, const char *addr, in...
function redisContextConnectTcp (line 505) | int redisContextConnectTcp(redisContext *c, const char *addr, int port,
function redisContextConnectBindTcp (line 510) | int redisContextConnectBindTcp(redisContext *c, const char *addr, int port,
function redisContextConnectUnix (line 516) | int redisContextConnectUnix(redisContext *c, const char *path, const str...
FILE: Chapter02/redis-6.0.3/deps/hiredis/net.h
type timeval (line 45) | struct timeval
type timeval (line 46) | struct timeval
type timeval (line 48) | struct timeval
type timeval (line 50) | struct timeval
FILE: Chapter02/redis-6.0.3/deps/hiredis/read.c
function __redisReaderSetError (line 49) | static void __redisReaderSetError(redisReader *r, int type, const char *...
function chrtos (line 73) | static size_t chrtos(char *buf, size_t size, char byte) {
function __redisReaderSetErrorProtocolByte (line 97) | static void __redisReaderSetErrorProtocolByte(redisReader *r, char byte) {
function __redisReaderSetErrorOOM (line 106) | static void __redisReaderSetErrorOOM(redisReader *r) {
function string2ll (line 159) | static int string2ll(const char *s, size_t slen, long long *value) {
function moveToNextTask (line 237) | static void moveToNextTask(redisReader *r) {
function processLineItem (line 264) | static int processLineItem(redisReader *r) {
function processBulkItem (line 346) | static int processBulkItem(redisReader *r) {
function processAggregateItem (line 419) | static int processAggregateItem(redisReader *r) {
function processItem (line 497) | static int processItem(redisReader *r) {
function redisReader (line 570) | redisReader *redisReaderCreateWithFunctions(redisReplyObjectFunctions *f...
function redisReaderFree (line 589) | void redisReaderFree(redisReader *r) {
function redisReaderFeed (line 598) | int redisReaderFeed(redisReader *r, const char *buf, size_t len) {
function redisReaderGetReply (line 630) | int redisReaderGetReply(redisReader *r, void **reply) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/read.h
type redisReadTask (line 72) | typedef struct redisReadTask {
type redisReplyObjectFunctions (line 81) | typedef struct redisReplyObjectFunctions {
type redisReader (line 91) | typedef struct redisReader {
FILE: Chapter02/redis-6.0.3/deps/hiredis/sds.c
function sdsHdrSize (line 41) | static inline int sdsHdrSize(char type) {
function sdsReqType (line 57) | static inline char sdsReqType(size_t string_size) {
function sds (line 81) | sds sdsnewlen(const void *init, size_t initlen) {
function sds (line 139) | sds sdsempty(void) {
function sds (line 144) | sds sdsnew(const char *init) {
function sds (line 150) | sds sdsdup(const sds s) {
function sdsfree (line 155) | void sdsfree(sds s) {
function sdsupdatelen (line 174) | void sdsupdatelen(sds s) {
function sdsclear (line 183) | void sdsclear(sds s) {
function sds (line 194) | sds sdsMakeRoomFor(sds s, size_t addlen) {
function sds (line 248) | sds sdsRemoveFreeSpace(sds s) {
function sdsAllocSize (line 281) | size_t sdsAllocSize(sds s) {
function sdsIncrLen (line 315) | void sdsIncrLen(sds s, int incr) {
function sds (line 361) | sds sdsgrowzero(sds s, size_t len) {
function sds (line 379) | sds sdscatlen(sds s, const void *t, size_t len) {
function sds (line 394) | sds sdscat(sds s, const char *t) {
function sds (line 402) | sds sdscatsds(sds s, const sds t) {
function sds (line 408) | sds sdscpylen(sds s, const char *t, size_t len) {
function sds (line 421) | sds sdscpy(sds s, const char *t) {
function sdsll2str (line 432) | int sdsll2str(char *s, long long value) {
function sdsull2str (line 464) | int sdsull2str(char *s, unsigned long long v) {
function sds (line 496) | sds sdsfromlonglong(long long value) {
function sds (line 504) | sds sdscatvprintf(sds s, const char *fmt, va_list ap) {
function sds (line 557) | sds sdscatprintf(sds s, const char *fmt, ...) {
function sds (line 582) | sds sdscatfmt(sds s, char const *fmt, ...) {
function sds (line 692) | sds sdstrim(sds s, const char *cset) {
function sdsrange (line 723) | void sdsrange(sds s, int start, int end) {
function sdstolower (line 752) | void sdstolower(sds s) {
function sdstoupper (line 759) | void sdstoupper(sds s) {
function sdscmp (line 776) | int sdscmp(const sds s1, const sds s2) {
function sds (line 804) | sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, in...
function sdsfreesplitres (line 854) | void sdsfreesplitres(sds *tokens, int count) {
function sds (line 867) | sds sdscatrepr(sds s, const char *p, size_t len) {
function is_hex_digit (line 894) | int is_hex_digit(char c) {
function hex_digit_to_int (line 901) | int hex_digit_to_int(char c) {
function sds (line 942) | sds *sdssplitargs(const char *line, int *argc) {
function sds (line 1069) | sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen) {
function sds (line 1085) | sds sdsjoin(char **argv, int argc, char *sep) {
function sds (line 1097) | sds sdsjoinsds(sds *argv, int argc, const char *sep, size_t seplen) {
function sds_free (line 1115) | void sds_free(void *ptr) { s_free(ptr); }
function sdsTest (line 1123) | int sdsTest(void) {
function main (line 1288) | int main(void) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/sds.h
type sdshdr5 (line 49) | struct __attribute__ ((__packed__)) sdshdr5 {
type sdshdr8 (line 53) | struct __attribute__ ((__packed__)) sdshdr8 {
type sdshdr16 (line 59) | struct __attribute__ ((__packed__)) sdshdr16 {
type sdshdr32 (line 65) | struct __attribute__ ((__packed__)) sdshdr32 {
type sdshdr64 (line 71) | struct __attribute__ ((__packed__)) sdshdr64 {
function sdslen (line 89) | static inline size_t sdslen(const sds s) {
function sdsavail (line 106) | static inline size_t sdsavail(const sds s) {
function sdssetlen (line 132) | static inline void sdssetlen(sds s, size_t newlen) {
function sdsinclen (line 156) | static inline void sdsinclen(sds s, size_t inc) {
function sdsalloc (line 182) | static inline size_t sdsalloc(const sds s) {
function sdssetalloc (line 199) | static inline void sdssetalloc(sds s, size_t newlen) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/sockcompat.c
function _wsaErrorToErrno (line 35) | static int _wsaErrorToErrno(int err) {
function _updateErrno (line 97) | static void _updateErrno(int success) {
function _initWinsock (line 101) | static int _initWinsock() {
function win32_getaddrinfo (line 115) | int win32_getaddrinfo(const char *node, const char *service, const struc...
function win32_freeaddrinfo (line 149) | void win32_freeaddrinfo(struct addrinfo *res) {
function SOCKET (line 153) | SOCKET win32_socket(int domain, int type, int protocol) {
function win32_ioctl (line 165) | int win32_ioctl(SOCKET fd, unsigned long request, unsigned long *argp) {
function win32_bind (line 171) | int win32_bind(SOCKET sockfd, const struct sockaddr *addr, socklen_t add...
function win32_connect (line 177) | int win32_connect(SOCKET sockfd, const struct sockaddr *addr, socklen_t ...
function win32_getsockopt (line 191) | int win32_getsockopt(SOCKET sockfd, int level, int optname, void *optval...
function win32_setsockopt (line 212) | int win32_setsockopt(SOCKET sockfd, int level, int optname, const void *...
function win32_close (line 225) | int win32_close(SOCKET fd) {
function win32_recv (line 231) | ssize_t win32_recv(SOCKET sockfd, void *buf, size_t len, int flags) {
function win32_send (line 237) | ssize_t win32_send(SOCKET sockfd, const void *buf, size_t len, int flags) {
function win32_poll (line 243) | int win32_poll(struct pollfd *fds, nfds_t nfds, int timeout) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/sockcompat.h
type addrinfo (line 58) | struct addrinfo
type addrinfo (line 58) | struct addrinfo
type addrinfo (line 60) | struct addrinfo
type sockaddr (line 63) | struct sockaddr
type sockaddr (line 64) | struct sockaddr
type ULONG (line 70) | typedef ULONG nfds_t;
type pollfd (line 71) | struct pollfd
FILE: Chapter02/redis-6.0.3/deps/hiredis/ssl.c
type redisSSLContext (line 49) | typedef struct redisSSLContext {
function sslLogCallback (line 84) | static void sslLogCallback(const SSL *ssl, int where, int ret) {
type pthread_mutex_t (line 122) | typedef pthread_mutex_t sslLockType;
function sslLockInit (line 123) | static void sslLockInit(sslLockType *l) {
function sslLockAcquire (line 126) | static void sslLockAcquire(sslLockType *l) {
function sslLockRelease (line 129) | static void sslLockRelease(sslLockType *l) {
function opensslDoLock (line 134) | static void opensslDoLock(int mode, int lkid, const char *f, int line) {
function initOpensslLocks (line 147) | static void initOpensslLocks(void) {
function redisSSLConnect (line 166) | static int redisSSLConnect(redisContext *c, SSL_CTX *ssl_ctx, SSL *ssl) {
function redisInitiateSSL (line 209) | int redisInitiateSSL(redisContext *c, SSL *ssl) {
function redisSecureConnection (line 213) | int redisSecureConnection(redisContext *c, const char *capath,
function maybeCheckWant (line 282) | static int maybeCheckWant(redisSSLContext *rssl, int rv) {
function redisSSLFreeContext (line 302) | static void redisSSLFreeContext(void *privdata){
function redisSSLRead (line 317) | static int redisSSLRead(redisContext *c, char *buf, size_t bufcap) {
function redisSSLWrite (line 359) | static int redisSSLWrite(redisContext *c) {
function redisSSLAsyncRead (line 381) | static void redisSSLAsyncRead(redisAsyncContext *ac) {
function redisSSLAsyncWrite (line 411) | static void redisSSLAsyncWrite(redisAsyncContext *ac) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/test.c
type connection_type (line 21) | enum connection_type {
type config (line 28) | struct config {
function usec (line 55) | static long long usec(void) {
function redisContext (line 68) | static redisContext *select_database(redisContext *c) {
function disconnect (line 90) | static int disconnect(redisContext *c, int keep_fd) {
function do_ssl_handshake (line 108) | static void do_ssl_handshake(redisContext *c, struct config config) {
function redisContext (line 122) | static redisContext *do_connect(struct config config) {
function do_reconnect (line 159) | static void do_reconnect(redisContext *c, struct config config) {
function test_format_commands (line 167) | static void test_format_commands(void) {
function test_append_formatted_commands (line 287) | static void test_append_formatted_commands(struct config config) {
function test_reply_reader (line 309) | static void test_reply_reader(void) {
function test_free_null (line 464) | static void test_free_null(void) {
function test_blocking_connection_errors (line 478) | static void test_blocking_connection_errors(void) {
function test_blocking_connection (line 519) | static void test_blocking_connection(struct config config) {
function test_blocking_connection_timeouts (line 597) | static void test_blocking_connection_timeouts(struct config config) {
function test_blocking_io_errors (line 644) | static void test_blocking_io_errors(struct config config) {
function test_invalid_timeout_errors (line 695) | static void test_invalid_timeout_errors(struct config config) {
function test_throughput (line 719) | static void test_throughput(struct config config) {
function main (line 907) | int main(int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/hiredis/win32.h
function c99_vsnprintf (line 26) | __inline int c99_vsnprintf(char* str, size_t size, const char* format, v...
function c99_snprintf (line 38) | __inline int c99_snprintf(char* str, size_t size, const char* format, ...)
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_inlines_a.h
function arena_ind_get (line 4) | static inline unsigned
function arena_internal_add (line 9) | static inline void
function arena_internal_sub (line 14) | static inline void
function arena_internal_get (line 19) | static inline size_t
function arena_prof_accum (line 24) | static inline bool
function percpu_arena_update (line 35) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_inlines_b.h
function JEMALLOC_ALWAYS_INLINE (line 11) | JEMALLOC_ALWAYS_INLINE prof_tctx_t *
function JEMALLOC_ALWAYS_INLINE (line 30) | JEMALLOC_ALWAYS_INLINE void
function arena_prof_tctx_reset (line 49) | static inline void
function JEMALLOC_ALWAYS_INLINE (line 60) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 78) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 86) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 108) | JEMALLOC_ALWAYS_INLINE arena_t *
function JEMALLOC_ALWAYS_INLINE (line 113) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 127) | JEMALLOC_ALWAYS_INLINE size_t
function arena_dalloc_no_tcache (line 160) | static inline void
function JEMALLOC_ALWAYS_INLINE (line 189) | JEMALLOC_ALWAYS_INLINE void
function arena_sdalloc_no_tcache (line 242) | static inline void
function JEMALLOC_ALWAYS_INLINE (line 286) | JEMALLOC_ALWAYS_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_stats.h
type atomic_u64_t (line 15) | typedef atomic_u64_t arena_stats_u64_t;
type arena_stats_u64_t (line 18) | typedef uint64_t arena_stats_u64_t;
type arena_stats_large_t (line 21) | typedef struct arena_stats_large_s arena_stats_large_t;
type arena_stats_large_s (line 22) | struct arena_stats_large_s {
type arena_stats_decay_t (line 41) | typedef struct arena_stats_decay_s arena_stats_decay_t;
type arena_stats_decay_s (line 42) | struct arena_stats_decay_s {
type arena_stats_t (line 56) | typedef struct arena_stats_s arena_stats_t;
type arena_stats_s (line 57) | struct arena_stats_s {
function arena_stats_init (line 97) | static inline bool
function arena_stats_lock (line 114) | static inline void
function arena_stats_unlock (line 121) | static inline void
function arena_stats_read_u64 (line 128) | static inline uint64_t
function arena_stats_add_u64 (line 139) | static inline void
function UNUSED (line 150) | UNUSED static inline void
function arena_stats_accum_u64 (line 168) | static inline void
function arena_stats_read_zu (line 178) | static inline size_t
function arena_stats_add_zu (line 188) | static inline void
function arena_stats_sub_zu (line 200) | static inline void
function arena_stats_accum_zu (line 214) | static inline void
function arena_stats_large_nrequests_add (line 220) | static inline void
function arena_stats_mapped_add (line 229) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_structs_a.h
type arena_slab_data_s (line 6) | struct arena_slab_data_s {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_structs_b.h
type arena_decay_s (line 17) | struct arena_decay_s {
type arena_s (line 77) | struct arena_s {
type arena_tdata_s (line 219) | struct arena_tdata_s {
type alloc_ctx_s (line 224) | struct alloc_ctx_s {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_types.h
type arena_slab_data_t (line 14) | typedef struct arena_slab_data_s arena_slab_data_t;
type arena_decay_t (line 15) | typedef struct arena_decay_s arena_decay_t;
type arena_t (line 16) | typedef struct arena_s arena_t;
type arena_tdata_t (line 17) | typedef struct arena_tdata_s arena_tdata_t;
type alloc_ctx_t (line 18) | typedef struct alloc_ctx_s alloc_ctx_t;
type percpu_arena_mode_t (line 20) | typedef enum {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/atomic_gcc_atomic.h
type atomic_memory_order_t (line 8) | typedef enum {
function ATOMIC_INLINE (line 16) | ATOMIC_INLINE int
function ATOMIC_INLINE (line 34) | ATOMIC_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/atomic_gcc_sync.h
type atomic_memory_order_t (line 6) | typedef enum {
function ATOMIC_INLINE (line 14) | ATOMIC_INLINE void
function ATOMIC_INLINE (line 63) | ATOMIC_INLINE void
function ATOMIC_INLINE (line 73) | ATOMIC_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/atomic_msvc.h
type atomic_memory_order_t (line 6) | typedef enum {
type atomic_repr_0_t (line 14) | typedef char atomic_repr_0_t;
type atomic_repr_1_t (line 15) | typedef short atomic_repr_1_t;
type atomic_repr_2_t (line 16) | typedef long atomic_repr_2_t;
type __int64 (line 17) | typedef __int64 atomic_repr_3_t;
function ATOMIC_INLINE (line 19) | ATOMIC_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/background_thread_inlines.h
function JEMALLOC_ALWAYS_INLINE (line 4) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 9) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 15) | JEMALLOC_ALWAYS_INLINE background_thread_info_t *
function JEMALLOC_ALWAYS_INLINE (line 21) | JEMALLOC_ALWAYS_INLINE uint64_t
function JEMALLOC_ALWAYS_INLINE (line 29) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 38) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 43) | JEMALLOC_ALWAYS_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/background_thread_structs.h
type background_thread_state_t (line 13) | typedef enum {
type background_thread_info_s (line 20) | struct background_thread_info_s {
type background_thread_info_t (line 44) | typedef struct background_thread_info_s background_thread_info_t;
type background_thread_stats_s (line 46) | struct background_thread_stats_s {
type background_thread_stats_t (line 51) | typedef struct background_thread_stats_s background_thread_stats_t;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/base_inlines.h
function base_ind_get (line 4) | static inline unsigned
function metadata_thp_enabled (line 9) | static inline bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/base_structs.h
type base_block_s (line 9) | struct base_block_s {
type base_s (line 20) | struct base_s {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/base_types.h
type base_block_t (line 4) | typedef struct base_block_s base_block_t;
type base_t (line 5) | typedef struct base_s base_t;
type metadata_thp_mode_t (line 18) | typedef enum {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/bin.h
type bin_info_t (line 33) | typedef struct bin_info_s bin_info_t;
type bin_info_s (line 34) | struct bin_info_s {
type bin_t (line 54) | typedef struct bin_s bin_t;
type bin_s (line 55) | struct bin_s {
function bin_stats_merge (line 90) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/bin_stats.h
type bin_stats_t (line 6) | typedef struct bin_stats_s bin_stats_t;
type bin_stats_s (line 7) | struct bin_stats_s {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/bit_util.h
function ffs_llu (line 15) | BIT_UTIL_INLINE unsigned
function ffs_lu (line 20) | BIT_UTIL_INLINE unsigned
function ffs_u (line 25) | BIT_UTIL_INLINE unsigned
function ffs_zu (line 30) | BIT_UTIL_INLINE unsigned
function ffs_u64 (line 43) | BIT_UTIL_INLINE unsigned
function ffs_u32 (line 54) | BIT_UTIL_INLINE unsigned
function BIT_UTIL_INLINE (line 64) | BIT_UTIL_INLINE uint64_t
function BIT_UTIL_INLINE (line 77) | BIT_UTIL_INLINE uint32_t
function BIT_UTIL_INLINE (line 90) | BIT_UTIL_INLINE size_t
function lg_floor (line 100) | BIT_UTIL_INLINE unsigned
function lg_floor (line 113) | BIT_UTIL_INLINE unsigned
function lg_floor (line 130) | BIT_UTIL_INLINE unsigned
function lg_floor (line 143) | BIT_UTIL_INLINE unsigned
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/bitmap.h
type bitmap_t (line 8) | typedef unsigned long bitmap_t;
type bitmap_info_t (line 152) | typedef struct bitmap_info_s {
function bitmap_full (line 175) | static inline bool
function bitmap_get (line 194) | static inline bool
function bitmap_set (line 205) | static inline void
function bitmap_ffu (line 241) | static inline size_t
function bitmap_sfu (line 300) | static inline size_t
function bitmap_unset (line 330) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/cache_bin.h
type cache_bin_sz_t (line 22) | typedef int32_t cache_bin_sz_t;
type cache_bin_stats_t (line 24) | typedef struct cache_bin_stats_s cache_bin_stats_t;
type cache_bin_stats_s (line 25) | struct cache_bin_stats_s {
type cache_bin_info_t (line 37) | typedef struct cache_bin_info_s cache_bin_info_t;
type cache_bin_info_s (line 38) | struct cache_bin_info_s {
type cache_bin_t (line 43) | typedef struct cache_bin_s cache_bin_t;
type cache_bin_s (line 44) | struct cache_bin_s {
type cache_bin_array_descriptor_t (line 67) | typedef struct cache_bin_array_descriptor_s cache_bin_array_descriptor_t;
type cache_bin_array_descriptor_s (line 68) | struct cache_bin_array_descriptor_s {
function cache_bin_array_descriptor_init (line 79) | static inline void
function JEMALLOC_ALWAYS_INLINE (line 87) | JEMALLOC_ALWAYS_INLINE void *
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/ckh.h
type ckhc_t (line 28) | typedef struct {
type ckh_t (line 34) | typedef struct {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/ctl.h
type ctl_node_t (line 14) | typedef struct ctl_node_s {
type ctl_named_node_t (line 18) | typedef struct ctl_named_node_s {
type ctl_indexed_node_t (line 28) | typedef struct ctl_indexed_node_s {
type ctl_arena_stats_t (line 34) | typedef struct ctl_arena_stats_s {
type ctl_stats_t (line 47) | typedef struct ctl_stats_s {
type ctl_arena_t (line 60) | typedef struct ctl_arena_s ctl_arena_t;
type ctl_arena_s (line 61) | struct ctl_arena_s {
type ctl_arenas_t (line 79) | typedef struct ctl_arenas_s {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/div.h
type div_info_t (line 15) | typedef struct div_info_s div_info_t;
type div_info_s (line 16) | struct div_info_s {
function div_compute (line 25) | static inline size_t
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/emitter.h
type emitter_output_t (line 6) | typedef enum emitter_output_e emitter_output_t;
type emitter_output_e (line 7) | enum emitter_output_e {
type emitter_justify_t (line 12) | typedef enum emitter_justify_e emitter_justify_t;
type emitter_justify_e (line 13) | enum emitter_justify_e {
type emitter_type_t (line 20) | typedef enum emitter_type_e emitter_type_t;
type emitter_type_e (line 21) | enum emitter_type_e {
type emitter_col_t (line 37) | typedef struct emitter_col_s emitter_col_t;
type emitter_col_s (line 38) | struct emitter_col_s {
type emitter_row_t (line 58) | typedef struct emitter_row_s emitter_row_t;
type emitter_row_s (line 59) | struct emitter_row_s {
function emitter_row_init (line 63) | static inline void
function emitter_col_init (line 68) | static inline void
type emitter_t (line 74) | typedef struct emitter_s emitter_t;
type emitter_s (line 75) | struct emitter_s {
function emitter_init (line 85) | static inline void
function emitter_printf (line 97) | static inline void
function emitter_table_printf (line 108) | static inline void
function emitter_gen_fmt (line 118) | static inline void
function emitter_print_value (line 143) | static inline void
function emitter_nest_inc (line 209) | static inline void
function emitter_nest_dec (line 215) | static inline void
function emitter_indent (line 221) | static inline void
function emitter_json_key_prefix (line 236) | static inline void
function emitter_begin (line 242) | static inline void
function emitter_end (line 254) | static inline void
function emitter_kv_note (line 267) | static inline void
function emitter_kv (line 294) | static inline void
function emitter_json_kv (line 301) | static inline void
function emitter_table_kv (line 309) | static inline void
function emitter_dict_begin (line 317) | static inline void
function emitter_dict_end (line 331) | static inline void
function emitter_json_dict_begin (line 344) | static inline void
function emitter_json_dict_end (line 351) | static inline void
function emitter_table_dict_begin (line 358) | static inline void
function emitter_table_dict_end (line 365) | static inline void
function emitter_json_arr_begin (line 372) | static inline void
function emitter_json_arr_end (line 381) | static inline void
function emitter_json_arr_obj_begin (line 392) | static inline void
function emitter_json_arr_obj_end (line 401) | static inline void
function emitter_json_arr_value (line 412) | static inline void
function emitter_table_row (line 422) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_dss.h
type dss_prec_t (line 4) | typedef enum {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_inlines.h
function extent_lock (line 11) | static inline void
function extent_unlock (line 17) | static inline void
function extent_lock2 (line 23) | static inline void
function extent_unlock2 (line 30) | static inline void
function arena_t (line 37) | static inline arena_t *
function szind_t (line 52) | static inline szind_t
function szind_t (line 60) | static inline szind_t
function extent_usize_get (line 67) | static inline size_t
function extent_sn_get (line 72) | static inline size_t
function extent_state_t (line 78) | static inline extent_state_t
function extent_zeroed_get (line 84) | static inline bool
function extent_committed_get (line 90) | static inline bool
function extent_dumpable_get (line 96) | static inline bool
function extent_slab_get (line 102) | static inline bool
function extent_nfree_get (line 108) | static inline unsigned
function extent_size_get (line 129) | static inline size_t
function extent_esn_get (line 134) | static inline size_t
function extent_bsize_get (line 139) | static inline size_t
function arena_slab_data_t (line 161) | static inline arena_slab_data_t *
function arena_slab_data_t (line 167) | static inline const arena_slab_data_t *
function prof_tctx_t (line 173) | static inline prof_tctx_t *
function extent_arena_set (line 179) | static inline void
function extent_addr_set (line 187) | static inline void
function extent_addr_randomize (line 192) | static inline void
function extent_size_set (line 218) | static inline void
function extent_esn_set (line 224) | static inline void
function extent_bsize_set (line 230) | static inline void
function extent_szind_set (line 235) | static inline void
function extent_nfree_set (line 242) | static inline void
function extent_nfree_inc (line 249) | static inline void
function extent_nfree_dec (line 255) | static inline void
function extent_sn_set (line 261) | static inline void
function extent_state_set (line 267) | static inline void
function extent_zeroed_set (line 273) | static inline void
function extent_committed_set (line 279) | static inline void
function extent_dumpable_set (line 285) | static inline void
function extent_slab_set (line 291) | static inline void
function extent_prof_tctx_set (line 297) | static inline void
function extent_init (line 302) | static inline void
function extent_binit (line 324) | static inline void
function extent_list_init (line 338) | static inline void
function extent_t (line 343) | static inline extent_t *
function extent_t (line 348) | static inline extent_t *
function extent_list_append (line 353) | static inline void
function extent_list_prepend (line 358) | static inline void
function extent_list_replace (line 363) | static inline void
function extent_list_remove (line 370) | static inline void
function extent_sn_comp (line 375) | static inline int
function extent_esn_comp (line 383) | static inline int
function extent_ad_comp (line 391) | static inline int
function extent_ead_comp (line 399) | static inline int
function extent_snad_comp (line 407) | static inline int
function extent_esnead_comp (line 420) | static inline int
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_structs.h
type extent_state_t (line 11) | typedef enum {
type extent_s (line 19) | struct extent_s {
type extent_list_t (line 170) | typedef ql_head(extent_t) extent_list_t;
type extent_tree_t (line 171) | typedef ph(extent_t) extent_tree_t;
type extent_heap_t (line 172) | typedef ph(extent_t) extent_heap_t;
type extents_s (line 175) | struct extents_s {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_types.h
type extent_t (line 4) | typedef struct extent_s extent_t;
type extents_t (line 5) | typedef struct extents_s extents_t;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/hash.h
function hash_rotl_32 (line 14) | static inline uint32_t
function hash_rotl_64 (line 19) | static inline uint64_t
function hash_get_block_32 (line 24) | static inline uint32_t
function hash_get_block_64 (line 37) | static inline uint64_t
function hash_fmix_32 (line 50) | static inline uint32_t
function hash_fmix_64 (line 61) | static inline uint64_t
function hash_x86_32 (line 72) | static inline uint32_t
function UNUSED (line 122) | UNUSED static inline void
function UNUSED (line 223) | UNUSED static inline void
function hash (line 302) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h
function isblank (line 81) | static int
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h
function malloc_getcpu (line 11) | malloc_getcpu(void) {
function percpu_arena_choose (line 22) | JEMALLOC_ALWAYS_INLINE unsigned
function percpu_arena_ind_limit (line 43) | JEMALLOC_ALWAYS_INLINE unsigned
function arena_tdata_t (line 57) | static inline arena_tdata_t *
function arena_t (line 82) | static inline arena_t *
function ticker_t (line 98) | static inline ticker_t *
function JEMALLOC_ALWAYS_INLINE (line 109) | JEMALLOC_ALWAYS_INLINE cache_bin_t *
function JEMALLOC_ALWAYS_INLINE (line 115) | JEMALLOC_ALWAYS_INLINE cache_bin_t *
function JEMALLOC_ALWAYS_INLINE (line 121) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 139) | JEMALLOC_ALWAYS_INLINE tcache_t *
function pre_reentrancy (line 148) | static inline void
function post_reentrancy (line 163) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_b.h
function arena_t (line 7) | static inline arena_t *
function arena_t (line 61) | static inline arena_t *
function arena_t (line 66) | static inline arena_t *
function arena_is_auto (line 71) | static inline bool
function JEMALLOC_ALWAYS_INLINE (line 77) | JEMALLOC_ALWAYS_INLINE extent_t *
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h
function JEMALLOC_ALWAYS_INLINE (line 26) | JEMALLOC_ALWAYS_INLINE arena_t *
function JEMALLOC_ALWAYS_INLINE (line 33) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 40) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 60) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 66) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 86) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 92) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 98) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 103) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 121) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 126) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 134) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 172) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 194) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 201) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 218) | JEMALLOC_ALWAYS_INLINE int
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h
type pszind_t (line 5) | typedef unsigned pszind_t;
type szind_t (line 8) | typedef unsigned szind_t;
type malloc_cpuid_t (line 11) | typedef int malloc_cpuid_t;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/log.h
type log_var_t (line 41) | typedef struct log_var_s log_var_t;
type log_var_s (line 42) | struct log_var_s {
function log_impl_varargs (line 88) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/malloc_io.h
function malloc_write_fd (line 66) | static inline ssize_t
function malloc_read_fd (line 88) | static inline ssize_t
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/mutex.h
type malloc_mutex_lock_order_t (line 9) | typedef enum {
type malloc_mutex_t (line 19) | typedef struct malloc_mutex_s malloc_mutex_t;
type malloc_mutex_s (line 20) | struct malloc_mutex_s {
function malloc_mutex_lock_final (line 139) | static inline void
function malloc_mutex_trylock_final (line 144) | static inline bool
function mutex_owner_stats_update (line 149) | static inline void
function malloc_mutex_trylock (line 162) | static inline bool
function malloc_mutex_prof_merge (line 177) | static inline void
function malloc_mutex_lock (line 200) | static inline void
function malloc_mutex_unlock (line 212) | static inline void
function malloc_mutex_assert_owner (line 220) | static inline void
function malloc_mutex_assert_not_owner (line 225) | static inline void
function malloc_mutex_prof_read (line 231) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/mutex_pool.h
type mutex_pool_t (line 11) | typedef struct mutex_pool_s mutex_pool_t;
type mutex_pool_s (line 12) | struct mutex_pool_s {
function malloc_mutex_t (line 19) | static inline malloc_mutex_t *
function mutex_pool_assert_not_held (line 26) | static inline void
function mutex_pool_lock (line 40) | static inline void
function mutex_pool_unlock (line 48) | static inline void
function mutex_pool_lock2 (line 56) | static inline void
function mutex_pool_unlock2 (line 74) | static inline void
function mutex_pool_assert_owner (line 89) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/mutex_prof.h
type mutex_prof_global_ind_t (line 13) | typedef enum {
type mutex_prof_arena_ind_t (line 31) | typedef enum {
type mutex_prof_data_t (line 67) | typedef struct {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/nstime.h
type nstime_t (line 8) | typedef struct {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/pages.h
type thp_mode_t (line 61) | typedef enum {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prng.h
function JEMALLOC_ALWAYS_INLINE (line 35) | JEMALLOC_ALWAYS_INLINE uint32_t
function JEMALLOC_ALWAYS_INLINE (line 40) | JEMALLOC_ALWAYS_INLINE uint64_t
function JEMALLOC_ALWAYS_INLINE (line 45) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 66) | JEMALLOC_ALWAYS_INLINE uint32_t
function JEMALLOC_ALWAYS_INLINE (line 89) | JEMALLOC_ALWAYS_INLINE uint64_t
function JEMALLOC_ALWAYS_INLINE (line 103) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 131) | JEMALLOC_ALWAYS_INLINE uint32_t
function JEMALLOC_ALWAYS_INLINE (line 149) | JEMALLOC_ALWAYS_INLINE uint64_t
function JEMALLOC_ALWAYS_INLINE (line 167) | JEMALLOC_ALWAYS_INLINE size_t
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prof_inlines_a.h
function prof_accum_add (line 6) | static inline bool
function prof_accum_cancel (line 44) | static inline void
function JEMALLOC_ALWAYS_INLINE (line 72) | JEMALLOC_ALWAYS_INLINE bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prof_inlines_b.h
function JEMALLOC_ALWAYS_INLINE (line 6) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 16) | JEMALLOC_ALWAYS_INLINE prof_tdata_t *
function JEMALLOC_ALWAYS_INLINE (line 39) | JEMALLOC_ALWAYS_INLINE prof_tctx_t *
function JEMALLOC_ALWAYS_INLINE (line 47) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 56) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 64) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 101) | JEMALLOC_ALWAYS_INLINE prof_tctx_t *
function JEMALLOC_ALWAYS_INLINE (line 121) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 136) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 194) | JEMALLOC_ALWAYS_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prof_structs.h
type prof_bt_s (line 9) | struct prof_bt_s {
type prof_unwind_data_t (line 17) | typedef struct {
type prof_accum_s (line 23) | struct prof_accum_s {
type prof_cnt_s (line 32) | struct prof_cnt_s {
type prof_tctx_state_t (line 40) | typedef enum {
type prof_tctx_s (line 47) | struct prof_tctx_s {
type prof_tctx_tree_t (line 97) | typedef rb_tree(prof_tctx_t) prof_tctx_tree_t;
type prof_gctx_s (line 99) | struct prof_gctx_s {
type prof_gctx_tree_t (line 133) | typedef rb_tree(prof_gctx_t) prof_gctx_tree_t;
type prof_tdata_s (line 135) | struct prof_tdata_s {
type prof_tdata_tree_t (line 199) | typedef rb_tree(prof_tdata_t) prof_tdata_tree_t;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prof_types.h
type prof_bt_t (line 4) | typedef struct prof_bt_s prof_bt_t;
type prof_accum_t (line 5) | typedef struct prof_accum_s prof_accum_t;
type prof_cnt_t (line 6) | typedef struct prof_cnt_s prof_cnt_t;
type prof_tctx_t (line 7) | typedef struct prof_tctx_s prof_tctx_t;
type prof_gctx_t (line 8) | typedef struct prof_gctx_s prof_gctx_t;
type prof_tdata_t (line 9) | typedef struct prof_tdata_s prof_tdata_t;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/rtree.h
type rtree_node_elm_t (line 41) | typedef struct rtree_node_elm_s rtree_node_elm_t;
type rtree_node_elm_s (line 42) | struct rtree_node_elm_s {
type rtree_leaf_elm_s (line 46) | struct rtree_leaf_elm_s {
type rtree_level_t (line 68) | typedef struct rtree_level_s rtree_level_t;
type rtree_level_s (line 69) | struct rtree_level_s {
type rtree_t (line 79) | typedef struct rtree_s rtree_t;
type rtree_s (line 80) | struct rtree_s {
type rtree_node_elm_t (line 114) | typedef rtree_node_elm_t *(rtree_node_alloc_t)(tsdn_t *, rtree_t *, size...
type rtree_leaf_elm_t (line 117) | typedef rtree_leaf_elm_t *(rtree_leaf_alloc_t)(tsdn_t *, rtree_t *, size...
function JEMALLOC_ALWAYS_INLINE (line 131) | JEMALLOC_ALWAYS_INLINE uintptr_t
function JEMALLOC_ALWAYS_INLINE (line 141) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 150) | JEMALLOC_ALWAYS_INLINE uintptr_t
function JEMALLOC_ALWAYS_INLINE (line 172) | JEMALLOC_ALWAYS_INLINE uintptr_t
function JEMALLOC_ALWAYS_INLINE (line 179) | JEMALLOC_ALWAYS_INLINE extent_t *
function JEMALLOC_ALWAYS_INLINE (line 198) | JEMALLOC_ALWAYS_INLINE szind_t
function JEMALLOC_ALWAYS_INLINE (line 203) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 210) | JEMALLOC_ALWAYS_INLINE extent_t *
function JEMALLOC_ALWAYS_INLINE (line 223) | JEMALLOC_ALWAYS_INLINE szind_t
function JEMALLOC_ALWAYS_INLINE (line 235) | JEMALLOC_ALWAYS_INLINE bool
function rtree_leaf_elm_extent_write (line 247) | static inline void
function rtree_leaf_elm_szind_write (line 261) | static inline void
function rtree_leaf_elm_slab_write (line 279) | static inline void
function rtree_leaf_elm_write (line 294) | static inline void
function rtree_leaf_elm_szind_slab_update (line 313) | static inline void
function JEMALLOC_ALWAYS_INLINE (line 326) | JEMALLOC_ALWAYS_INLINE rtree_leaf_elm_t *
function rtree_write (line 385) | static inline bool
function JEMALLOC_ALWAYS_INLINE (line 403) | JEMALLOC_ALWAYS_INLINE rtree_leaf_elm_t *
function JEMALLOC_ALWAYS_INLINE (line 415) | JEMALLOC_ALWAYS_INLINE extent_t *
function JEMALLOC_ALWAYS_INLINE (line 426) | JEMALLOC_ALWAYS_INLINE szind_t
function JEMALLOC_ALWAYS_INLINE (line 442) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 455) | JEMALLOC_ALWAYS_INLINE bool
function rtree_szind_slab_update (line 474) | static inline void
function rtree_clear (line 483) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/rtree_tsd.h
type rtree_leaf_elm_t (line 32) | typedef struct rtree_leaf_elm_s rtree_leaf_elm_t;
type rtree_ctx_cache_elm_t (line 34) | typedef struct rtree_ctx_cache_elm_s rtree_ctx_cache_elm_t;
type rtree_ctx_cache_elm_s (line 35) | struct rtree_ctx_cache_elm_s {
type rtree_ctx_t (line 40) | typedef struct rtree_ctx_s rtree_ctx_t;
type rtree_ctx_s (line 41) | struct rtree_ctx_s {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/spin.h
type spin_t (line 6) | typedef struct {
function spin_cpu_spinwait (line 10) | static inline void
function spin_adaptive (line 20) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/sz.h
function JEMALLOC_ALWAYS_INLINE (line 50) | JEMALLOC_ALWAYS_INLINE pszind_t
function sz_pind2sz_compute (line 73) | static inline size_t
function sz_pind2sz_lookup (line 95) | static inline size_t
function sz_pind2sz (line 102) | static inline size_t
function sz_psz2u (line 108) | static inline size_t
function szind_t (line 124) | static inline szind_t
function JEMALLOC_ALWAYS_INLINE (line 154) | JEMALLOC_ALWAYS_INLINE szind_t
function JEMALLOC_ALWAYS_INLINE (line 164) | JEMALLOC_ALWAYS_INLINE szind_t
function sz_index2size_compute (line 173) | static inline size_t
function JEMALLOC_ALWAYS_INLINE (line 199) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 206) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 212) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 236) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 248) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 261) | JEMALLOC_ALWAYS_INLINE size_t
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tcache_inlines.h
function tcache_enabled_get (line 11) | static inline bool
function tcache_enabled_set (line 16) | static inline void
function JEMALLOC_ALWAYS_INLINE (line 30) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 41) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 103) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 163) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 188) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 214) | JEMALLOC_ALWAYS_INLINE tcache_t *
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tcache_structs.h
type tcache_s (line 9) | struct tcache_s {
type tcaches_s (line 54) | struct tcaches_s {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tcache_types.h
type tcache_t (line 6) | typedef struct tcache_s tcache_t;
type tcaches_t (line 7) | typedef struct tcaches_s tcaches_t;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/ticker.h
type ticker_t (line 14) | typedef struct {
function ticker_init (line 19) | static inline void
function ticker_copy (line 25) | static inline void
function ticker_read (line 30) | static inline int32_t
function ticker_fixup (line 58) | static bool
function ticker_ticks (line 64) | static inline bool
function ticker_tick (line 73) | static inline bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tsd.h
type tsd_state_t (line 111) | typedef uint8_t tsd_state_t;
type tsd_s (line 114) | struct tsd_s {
type tsdn_s (line 132) | struct tsdn_s {
function JEMALLOC_ALWAYS_INLINE (line 136) | JEMALLOC_ALWAYS_INLINE tsdn_t *
function JEMALLOC_ALWAYS_INLINE (line 141) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 146) | JEMALLOC_ALWAYS_INLINE tsd_t *
function JEMALLOC_ALWAYS_INLINE (line 239) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 245) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 255) | JEMALLOC_ALWAYS_INLINE tsd_t *
function JEMALLOC_ALWAYS_INLINE (line 274) | JEMALLOC_ALWAYS_INLINE tsd_t *
function JEMALLOC_ALWAYS_INLINE (line 280) | JEMALLOC_ALWAYS_INLINE tsd_t *
function JEMALLOC_ALWAYS_INLINE (line 289) | JEMALLOC_ALWAYS_INLINE tsd_t *
function tsd_nominal (line 294) | static inline bool
function JEMALLOC_ALWAYS_INLINE (line 299) | JEMALLOC_ALWAYS_INLINE tsdn_t *
function JEMALLOC_ALWAYS_INLINE (line 308) | JEMALLOC_ALWAYS_INLINE rtree_ctx_t *
function JEMALLOC_ALWAYS_INLINE (line 313) | JEMALLOC_ALWAYS_INLINE rtree_ctx_t *
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tsd_generic.h
type tsd_init_block_t (line 6) | typedef struct tsd_init_block_s tsd_init_block_t;
type tsd_init_block_s (line 7) | struct tsd_init_block_s {
type tsd_init_head_t (line 14) | typedef struct tsd_init_head_s tsd_init_head_t;
type tsd_wrapper_t (line 16) | typedef struct {
function JEMALLOC_ALWAYS_INLINE (line 31) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 53) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 61) | JEMALLOC_ALWAYS_INLINE tsd_wrapper_t *
function JEMALLOC_ALWAYS_INLINE (line 89) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 99) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 115) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 124) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 129) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 135) | JEMALLOC_ALWAYS_INLINE tsd_t *
function JEMALLOC_ALWAYS_INLINE (line 147) | JEMALLOC_ALWAYS_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tsd_malloc_thread_cleanup.h
function JEMALLOC_ALWAYS_INLINE (line 11) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 20) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 27) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 32) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 37) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 42) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 48) | JEMALLOC_ALWAYS_INLINE tsd_t *
function JEMALLOC_ALWAYS_INLINE (line 53) | JEMALLOC_ALWAYS_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tsd_tls.h
function JEMALLOC_ALWAYS_INLINE (line 11) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 20) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 25) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 30) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 35) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 41) | JEMALLOC_ALWAYS_INLINE tsd_t *
function JEMALLOC_ALWAYS_INLINE (line 47) | JEMALLOC_ALWAYS_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tsd_types.h
type tsd_t (line 6) | typedef struct tsd_s tsd_t;
type tsdn_t (line 7) | typedef struct tsdn_s tsdn_t;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tsd_win.h
type tsd_wrapper_t (line 6) | typedef struct {
function JEMALLOC_ALWAYS_INLINE (line 16) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 38) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 46) | JEMALLOC_ALWAYS_INLINE tsd_wrapper_t *
function JEMALLOC_ALWAYS_INLINE (line 69) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 81) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 97) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 106) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 111) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 117) | JEMALLOC_ALWAYS_INLINE tsd_t *
function JEMALLOC_ALWAYS_INLINE (line 129) | JEMALLOC_ALWAYS_INLINE void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/util.h
function UTIL_INLINE (line 46) | UTIL_INLINE void
function UTIL_INLINE (line 56) | UTIL_INLINE int
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/witness.h
type witness_t (line 73) | typedef struct witness_s witness_t;
type witness_rank_t (line 74) | typedef unsigned witness_rank_t;
type witness_list_t (line 75) | typedef ql_head(witness_t) witness_list_t;
type witness_s (line 79) | struct witness_s {
type witness_tsd_t (line 106) | typedef struct witness_tsd_s witness_tsd_t;
type witness_tsd_s (line 107) | struct witness_tsd_s {
type witness_tsdn_t (line 118) | typedef struct witness_tsdn_s witness_tsdn_t;
type witness_tsdn_s (line 119) | struct witness_tsdn_s {
function JEMALLOC_ALWAYS_INLINE (line 123) | JEMALLOC_ALWAYS_INLINE witness_tsdn_t *
function JEMALLOC_ALWAYS_INLINE (line 128) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 133) | JEMALLOC_ALWAYS_INLINE witness_tsd_t *
function witness_owner (line 164) | static inline bool
function witness_assert_owner (line 181) | static inline void
function witness_assert_not_owner (line 203) | static inline void
function witness_assert_depth_to_rank (line 230) | static inline void
function witness_assert_depth (line 263) | static inline void
function witness_assert_lockless (line 268) | static inline void
function witness_lock (line 273) | static inline void
function witness_unlock (line 316) | static inline void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/msvc_compat/C99/stdbool.h
type BOOL (line 11) | typedef BOOL _Bool;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/msvc_compat/C99/stdint.h
type int_least8_t (line 94) | typedef int8_t int_least8_t;
type int_least16_t (line 95) | typedef int16_t int_least16_t;
type int_least32_t (line 96) | typedef int32_t int_least32_t;
type int_least64_t (line 97) | typedef int64_t int_least64_t;
type uint_least8_t (line 98) | typedef uint8_t uint_least8_t;
type uint_least16_t (line 99) | typedef uint16_t uint_least16_t;
type uint_least32_t (line 100) | typedef uint32_t uint_least32_t;
type uint_least64_t (line 101) | typedef uint64_t uint_least64_t;
type int_fast8_t (line 104) | typedef int8_t int_fast8_t;
type int_fast16_t (line 105) | typedef int16_t int_fast16_t;
type int_fast32_t (line 106) | typedef int32_t int_fast32_t;
type int_fast64_t (line 107) | typedef int64_t int_fast64_t;
type uint_fast8_t (line 108) | typedef uint8_t uint_fast8_t;
type uint_fast16_t (line 109) | typedef uint16_t uint_fast16_t;
type uint_fast32_t (line 110) | typedef uint32_t uint_fast32_t;
type uint_fast64_t (line 111) | typedef uint64_t uint_fast64_t;
type intmax_t (line 123) | typedef int64_t intmax_t;
type uintmax_t (line 124) | typedef uint64_t uintmax_t;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/include/msvc_compat/strings.h
function ffsl (line 9) | static __forceinline int ffsl(long x) {
function ffs (line 18) | static __forceinline int ffs(int x) {
function ffsll (line 26) | static __forceinline int ffsll(unsigned __int64 x) {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/msvc/test_threads/test_threads.cpp
function test_threads (line 19) | int test_threads() {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/msvc/test_threads/test_threads_main.cpp
function main (line 8) | int main(int argc, char** argv) {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/scripts/gen_run_tests.py
function powerset (line 16) | def powerset(items):
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/arena.c
function arena_basic_stats_merge (line 63) | void
function arena_stats_merge (line 76) | void
function arena_extents_dirty_dalloc (line 208) | void
function arena_slab_regind (line 240) | static
function arena_slab_reg_dalloc (line 263) | static void
function arena_nactive_add (line 277) | static void
function arena_nactive_sub (line 282) | static void
function arena_large_malloc_stats_update (line 288) | static void
function arena_large_dalloc_stats_update (line 304) | static void
function arena_large_ralloc_stats_update (line 320) | static void
function extent_t (line 327) | extent_t *
function arena_extent_dalloc_large_prep (line 379) | void
function arena_extent_ralloc_large_shrink (line 390) | void
function arena_extent_ralloc_large_expand (line 404) | void
function arena_decay_ms_read (line 418) | static ssize_t
function arena_decay_ms_write (line 423) | static void
function arena_decay_deadline_init (line 428) | static void
function arena_decay_deadline_reached (line 445) | static bool
function arena_decay_backlog_npages_limit (line 450) | static size_t
function arena_decay_backlog_update_last (line 470) | static void
function arena_decay_backlog_update (line 488) | static void
function arena_decay_try_purge (line 510) | static void
function arena_decay_epoch_advance_helper (line 521) | static void
function arena_decay_epoch_advance (line 545) | static void
function arena_decay_reinit (line 562) | static void
function arena_decay_init (line 579) | static bool
function arena_decay_ms_valid (line 601) | static bool
function arena_maybe_decay (line 613) | static bool
function arena_decay_ms_get (line 671) | static ssize_t
function arena_dirty_decay_ms_get (line 676) | ssize_t
function arena_muzzy_decay_ms_get (line 681) | ssize_t
function arena_decay_ms_set (line 686) | static bool
function arena_dirty_decay_ms_set (line 709) | bool
function arena_muzzy_decay_ms_set (line 716) | bool
function arena_stash_decayed (line 723) | static size_t
function arena_decay_stashed (line 742) | static size_t
function arena_decay_to_limit (line 815) | static void
function arena_decay_impl (line 847) | static bool
function arena_decay_dirty (line 882) | static bool
function arena_decay_muzzy (line 889) | static bool
function arena_decay (line 896) | void
function arena_slab_dalloc (line 904) | static void
function arena_bin_slabs_nonfull_insert (line 912) | static void
function arena_bin_slabs_nonfull_remove (line 918) | static void
function extent_t (line 923) | static extent_t *
function arena_bin_slabs_full_insert (line 935) | static void
function arena_bin_slabs_full_remove (line 949) | static void
function arena_reset (line 957) | void
function arena_destroy_retained (line 1036) | static void
function arena_destroy (line 1055) | void
function extent_t (line 1091) | static extent_t *
function extent_t (line 1114) | static extent_t *
function extent_t (line 1151) | static extent_t *
function arena_tcache_fill_small (line 1249) | void
function arena_alloc_junk_small (line 1302) | void
function arena_dalloc_junk_small_impl (line 1309) | static void
function arena_prof_promote (line 1408) | void
function arena_prof_demote (line 1432) | static size_t
function arena_dalloc_promoted (line 1448) | void
function arena_dissociate_bin_slab (line 1464) | static void
function arena_dalloc_bin_slab (line 1486) | static void
function arena_bin_lower_slab (line 1501) | static void
function arena_dalloc_bin_locked_impl (line 1528) | static void
function arena_dalloc_bin_junked_locked (line 1556) | void
function arena_dalloc_bin (line 1562) | static void
function arena_dalloc_small (line 1572) | void
function arena_ralloc_no_move (line 1581) | bool
function dss_prec_t (line 1672) | dss_prec_t
function arena_dss_prec_set (line 1677) | bool
function arena_dirty_decay_ms_default_get (line 1686) | ssize_t
function arena_dirty_decay_ms_default_set (line 1691) | bool
function arena_muzzy_decay_ms_default_get (line 1700) | ssize_t
function arena_muzzy_decay_ms_default_set (line 1705) | bool
function arena_retain_grow_limit_get_set (line 1714) | bool
function arena_nthreads_get (line 1741) | unsigned
function arena_nthreads_inc (line 1746) | void
function arena_nthreads_dec (line 1751) | void
function arena_extent_sn_next (line 1756) | size_t
function arena_t (line 1761) | arena_t *
function arena_boot (line 1917) | void
function arena_prefork0 (line 1933) | void
function arena_prefork1 (line 1939) | void
function arena_prefork2 (line 1946) | void
function arena_prefork3 (line 1951) | void
function arena_prefork4 (line 1958) | void
function arena_prefork5 (line 1963) | void
function arena_prefork6 (line 1968) | void
function arena_prefork7 (line 1973) | void
function arena_postfork_parent (line 1980) | void
function arena_postfork_child (line 2001) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/background_thread.c
function pthread_create_wrapper_init (line 36) | static void
function pthread_create_wrapper (line 45) | int
function background_thread_info_init (line 73) | static void
function set_current_thread_affinity (line 83) | static inline bool
function decay_npurge_after_interval (line 103) | static inline size_t
function arena_decay_compute_purge_interval_impl (line 117) | static uint64_t
function arena_decay_compute_purge_interval (line 203) | static uint64_t
function background_thread_sleep (line 217) | static void
function background_thread_pause_check (line 273) | static bool
function background_work_sleep_once (line 287) | static inline void
function background_threads_disable_single (line 312) | static bool
function background_thread_create_signals_masked (line 353) | static int
function check_background_thread_creation (line 385) | static bool
function background_thread0_work (line 435) | static void
function background_work (line 484) | static void
function background_thread_init (line 529) | static void
function background_thread_create (line 538) | bool
function background_threads_enable (line 592) | bool
function background_threads_disable (line 628) | bool
function background_thread_interval_check (line 644) | void
function background_thread_prefork0 (line 727) | void
function background_thread_prefork1 (line 733) | void
function background_thread_postfork_parent (line 740) | void
function background_thread_postfork_child (line 749) | void
function background_thread_stats_read (line 776) | bool
function pthread_create_fptr_init (line 816) | static bool
function background_thread_ctl_init (line 842) | void
function background_thread_boot0 (line 853) | bool
function background_thread_boot1 (line 869) | bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/base.c
function metadata_thp_madvise (line 25) | static inline bool
function base_unmap (line 54) | static void
function base_extent_init (line 118) | static void
function base_get_num_blocks (line 129) | static size_t
function base_auto_thp_switch (line 143) | static void
function base_extent_bump_alloc_post (line 197) | static void
function base_block_t (line 247) | static base_block_t *
function extent_t (line 307) | static extent_t *
function base_t (line 344) | base_t *
function base_t (line 349) | base_t *
function base_delete (line 395) | void
function extent_hooks_t (line 407) | extent_hooks_t *
function extent_hooks_t (line 413) | extent_hooks_t *
function extent_t (line 468) | extent_t *
function base_stats_get (line 480) | void
function base_prefork (line 495) | void
function base_postfork_parent (line 500) | void
function base_postfork_child (line 505) | void
function base_boot (line 510) | bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/bin.c
function bin_init (line 22) | bool
function bin_prefork (line 37) | void
function bin_postfork_parent (line 42) | void
function bin_postfork_child (line 47) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/bitmap.c
function bitmap_info_init (line 11) | void
function bitmap_info_ngroups (line 39) | static size_t
function bitmap_init (line 44) | void
function bitmap_info_init (line 85) | void
function bitmap_info_ngroups (line 94) | static size_t
function bitmap_init (line 99) | void
function bitmap_size (line 118) | size_t
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/ckh.c
function ckh_bucket_search (line 62) | static size_t
function ckh_isearch (line 80) | static size_t
function ckh_try_bucket_insert (line 101) | static bool
function ckh_evict_reloc_insert (line 133) | static bool
function ckh_try_insert (line 204) | static bool
function ckh_rebuild (line 234) | static bool
function ckh_grow (line 256) | static bool
function ckh_shrink (line 310) | static void
function ckh_new (line 358) | bool
function ckh_delete (line 415) | void
function ckh_count (line 437) | size_t
function ckh_iter (line 444) | bool
function ckh_insert (line 465) | bool
function ckh_remove (line 488) | bool
function ckh_search (line 521) | bool
function ckh_string_hash (line 541) | void
function ckh_string_keycomp (line 546) | bool
function ckh_pointer_hash (line 554) | void
function ckh_pointer_keycomp (line 566) | bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/ctl.c
function ctl_named_node_t (line 29) | static const ctl_named_node_t *
function ctl_named_node_t (line 34) | static const ctl_named_node_t *
function ctl_indexed_node_t (line 41) | static const ctl_indexed_node_t *
function MUTEX_PROF_GLOBAL_MUTEXES (line 519) | MUTEX_PROF_GLOBAL_MUTEXES
function thread_prof_name_ctl (line 1798) | static int
function thread_prof_active_ctl (line 1829) | static int
function tcache_create_ctl (line 1859) | static int
function tcache_flush_ctl (line 1877) | static int
function tcache_destroy_ctl (line 1897) | static int
function arena_i_initialized_ctl (line 1919) | static int
function arena_i_decay (line 1941) | static void
function arena_i_decay_ctl (line 1988) | static int
function arena_i_purge_ctl (line 2004) | static int
function arena_i_reset_destroy_helper (line 2020) | static int
function arena_reset_prepare_background_thread (line 2041) | static void
function arena_reset_finish_background_thread (line 2058) | static void
function arena_i_reset_ctl (line 2074) | static int
function arena_i_destroy_ctl (line 2094) | static int
function arena_i_dss_ctl (line 2135) | static int
function arena_i_decay_ms_ctl_impl (line 2196) | static int
function arena_i_dirty_decay_ms_ctl (line 2233) | static int
function arena_i_muzzy_decay_ms_ctl (line 2240) | static int
function arena_i_extent_hooks_ctl (line 2247) | static int
function arena_i_retain_grow_limit_ctl (line 2302) | static int
function ctl_named_node_t (line 2338) | static const ctl_named_node_t *
function arenas_narenas_ctl (line 2363) | static int
function arenas_decay_ms_ctl_impl (line 2384) | static int
function arenas_dirty_decay_ms_ctl (line 2411) | static int
function arenas_muzzy_decay_ms_ctl (line 2418) | static int
function ctl_named_node_t (line 2433) | static const ctl_named_node_t *
function ctl_named_node_t (line 2444) | static const ctl_named_node_t *
function arenas_create_ctl (line 2453) | static int
function arenas_lookup_ctl (line 2476) | static int
function prof_thread_active_init_ctl (line 2508) | static int
function prof_active_ctl (line 2535) | static int
function prof_dump_ctl (line 2561) | static int
function prof_gdump_ctl (line 2584) | static int
function prof_reset_ctl (line 2610) | static int
function stats_mutexes_reset_ctl (line 2767) | static int
function ctl_named_node_t (line 2837) | static const ctl_named_node_t *
function ctl_named_node_t (line 2858) | static const ctl_named_node_t *
function ctl_named_node_t (line 2867) | static const ctl_named_node_t *
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/div.c
function div_init (line 29) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/extent.c
type lock_result_t (line 125) | typedef enum {
function lock_result_t (line 131) | static lock_result_t
function extent_t (line 161) | static extent_t *
function extent_t (line 176) | extent_t *
function extent_dalloc (line 189) | void
function extent_hooks_t (line 196) | extent_hooks_t *
function extent_hooks_t (line 201) | extent_hooks_t *
function extent_hooks_assure_initialized (line 216) | static void
function extent_size_quantize_floor (line 227) | size_t
function extent_size_quantize_ceil (line 251) | static
function extents_init (line 280) | bool
function extent_state_t (line 298) | extent_state_t
function extents_npages_get (line 303) | size_t
function extents_insert_locked (line 308) | static void
function extents_remove_locked (line 334) | static void
function extent_t (line 364) | static extent_t *
function extent_t (line 398) | static extent_t *
function extent_t (line 425) | static extent_t *
function extent_t (line 456) | static extent_t *
function extent_try_delayed_coalesce (line 484) | static bool
function extent_t (line 501) | extent_t *
function extents_dalloc (line 516) | void
function extent_t (line 531) | extent_t *
function extents_leak (line 595) | static void
function extents_prefork (line 613) | void
function extents_postfork_parent (line 618) | void
function extents_postfork_child (line 623) | void
function extent_deactivate_locked (line 628) | static void
function extent_deactivate (line 638) | static void
function extent_activate_locked (line 646) | static void
function extent_rtree_leaf_elms_lookup (line 656) | static bool
function extent_rtree_write_acquired (line 677) | static void
function extent_interior_register (line 687) | static void
function extent_gdump_add (line 700) | static void
function extent_gdump_sub (line 726) | static void
function extent_register_impl (line 737) | static bool
function extent_register (line 770) | static bool
function extent_register_no_gdump_add (line 775) | static bool
function extent_reregister (line 780) | static void
function extent_interior_deregister (line 793) | static void
function extent_deregister_impl (line 810) | static void
function extent_deregister (line 833) | static void
function extent_deregister_no_gdump_sub (line 838) | static void
function extent_t (line 847) | static extent_t *
type extent_split_interior_result_t (line 915) | typedef enum {
function extent_split_interior_result_t (line 934) | static extent_split_interior_result_t
function extent_t (line 1011) | static extent_t *
function extent_t (line 1060) | static extent_t *
function extent_hook_pre_reentrancy (line 1197) | static void
function extent_hook_post_reentrancy (line 1214) | static void
function extent_t (line 1225) | static extent_t *
function extent_t (line 1389) | static extent_t *
function extent_t (line 1418) | static extent_t *
function extent_t (line 1457) | extent_t *
function extent_can_coalesce (line 1486) | static bool
function extent_coalesce (line 1506) | static bool
function extent_t (line 1526) | static extent_t *
function extent_record (line 1596) | static void
function extent_dalloc_gap (line 1639) | void
function extent_dalloc_default_impl (line 1654) | static bool
function extent_dalloc_default (line 1662) | static bool
function extent_dalloc_wrapper_try (line 1668) | static bool
function extent_dalloc_wrapper (line 1702) | void
function extent_destroy_default_impl (line 1756) | static void
function extent_destroy_default (line 1763) | static void
function extent_destroy_wrapper (line 1769) | void
function extent_commit_default (line 1799) | static bool
function extent_commit_impl (line 1806) | static bool
function extent_commit_wrapper (line 1827) | bool
function extent_decommit_default (line 1835) | static bool
function extent_decommit_wrapper (line 1842) | bool
function extent_purge_lazy_default (line 1866) | static bool
function extent_purge_lazy_impl (line 1879) | static bool
function extent_purge_lazy_wrapper (line 1904) | bool
function extent_purge_forced_default (line 1913) | static bool
function extent_purge_forced_impl (line 1926) | static bool
function extent_purge_forced_wrapper (line 1950) | bool
function extent_split_default (line 1959) | static bool
function extent_t (line 1973) | static extent_t *
function extent_t (line 2055) | extent_t *
function extent_merge_default_impl (line 2063) | static bool
function extent_merge_default (line 2076) | static bool
function extent_merge_impl (line 2083) | static bool
function extent_merge_wrapper (line 2155) | bool
function extent_boot (line 2161) | bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/extent_dss.c
function dss_prec_t (line 51) | dss_prec_t
function extent_dss_prec_set (line 62) | bool
function extent_dss_extending_start (line 71) | static void
function extent_dss_extending_finish (line 84) | static void
function extent_in_dss_helper (line 230) | static bool
function extent_in_dss (line 236) | bool
function extent_dss_mergeable (line 244) | bool
function extent_dss_boot (line 260) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/extent_mmap.c
function extent_dalloc_mmap (line 36) | bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/jemalloc.c
type malloc_init_t (line 91) | typedef enum {
function WINAPI (line 134) | WINAPI
type malloc_utrace_t (line 163) | typedef struct {
function malloc_initialized (line 202) | bool
function JEMALLOC_ALWAYS_INLINE (line 207) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 215) | JEMALLOC_ALWAYS_INLINE bool
function a0idalloc (line 238) | static void
function a0dalloc (line 248) | void
function bootstrap_free (line 281) | void
function arena_set (line 290) | void
function narenas_total_set (line 295) | static void
function narenas_total_inc (line 300) | static void
function narenas_total_get (line 305) | unsigned
function arena_t (line 311) | static arena_t *
function arena_new_create_background_thread (line 339) | static void
function arena_t (line 357) | arena_t *
function arena_bind (line 370) | static void
function arena_migrate (line 382) | void
function arena_unbind (line 393) | static void
function arena_tdata_t (line 407) | arena_tdata_t *
function arena_t (line 484) | arena_t *
function iarena_cleanup (line 598) | void
function arena_cleanup (line 608) | void
function arenas_tdata_cleanup (line 618) | void
function stats_print_atexit (line 632) | static void
function JEMALLOC_ALWAYS_INLINE (line 669) | JEMALLOC_ALWAYS_INLINE void
function malloc_ncpus (line 711) | static unsigned
function init_opt_stats_print_opts (line 739) | static void
function malloc_conf_next (line 764) | static bool
function malloc_abort_invalid_conf (line 839) | static void
function malloc_conf_error (line 847) | static void
function malloc_slow_flag_init (line 856) | static void
function malloc_conf_init (line 871) | static void
function malloc_init_hard_needed (line 1248) | static bool
function malloc_init_hard_a0_locked (line 1274) | static bool
function malloc_init_hard_a0 (line 1334) | static bool
function malloc_init_hard_recursible (line 1345) | static bool
function malloc_narenas_default (line 1372) | static unsigned
function percpu_arena_mode_t (line 1386) | static percpu_arena_mode_t
function malloc_init_narenas (line 1398) | static bool
function malloc_init_percpu (line 1470) | static void
function malloc_init_hard_finish (line 1475) | static bool
function malloc_init_hard_cleanup (line 1487) | static void
function malloc_init_hard (line 1499) | static bool
type static_opts_t (line 1586) | typedef struct static_opts_s static_opts_t;
type static_opts_s (line 1587) | struct static_opts_s {
function JEMALLOC_ALWAYS_INLINE (line 1626) | JEMALLOC_ALWAYS_INLINE void
type dynamic_opts_t (line 1648) | typedef struct dynamic_opts_s dynamic_opts_t;
type dynamic_opts_s (line 1649) | struct dynamic_opts_s {
function JEMALLOC_ALWAYS_INLINE (line 1659) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 1671) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 1713) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 1748) | JEMALLOC_ALWAYS_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 1786) | JEMALLOC_ALWAYS_INLINE int
function JEMALLOC_ALWAYS_INLINE (line 1984) | JEMALLOC_ALWAYS_INLINE int
function JEMALLOC_ALWAYS_INLINE (line 2166) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 2191) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 2230) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_NOTHROW (line 2371) | JEMALLOC_NOTHROW
function JEMALLOC_ALWAYS_INLINE (line 2618) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 2752) | JEMALLOC_ALWAYS_INLINE size_t
function ixallocx_prof_sample (line 2765) | static size_t
function JEMALLOC_ALWAYS_INLINE (line 2779) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_NOTHROW (line 2828) | JEMALLOC_NOTHROW
function JEMALLOC_NOTHROW (line 2919) | JEMALLOC_NOTHROW
function JEMALLOC_ALWAYS_INLINE (line 2964) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_NOTHROW (line 2978) | JEMALLOC_NOTHROW
function JEMALLOC_NOTHROW (line 3026) | JEMALLOC_NOTHROW
function JEMALLOC_NOTHROW (line 3053) | JEMALLOC_NOTHROW
function JEMALLOC_NOTHROW (line 3075) | JEMALLOC_NOTHROW
function JEMALLOC_NOTHROW (line 3095) | JEMALLOC_NOTHROW
function JEMALLOC_NOTHROW (line 3116) | JEMALLOC_NOTHROW
function JEMALLOC_NOTHROW (line 3130) | JEMALLOC_NOTHROW
function jemalloc_constructor (line 3181) | JEMALLOC_ATTR(constructor)
function jemalloc_prefork (line 3189) | void
function jemalloc_postfork_parent (line 3262) | void
function jemalloc_postfork_child (line 3299) | void
function JEMALLOC_NOTHROW (line 3333) | JEMALLOC_NOTHROW
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/jemalloc_cpp.cpp
function JEMALLOC_NOINLINE (line 42) | JEMALLOC_NOINLINE
function JEMALLOC_ALWAYS_INLINE (line 75) | JEMALLOC_ALWAYS_INLINE
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/large.c
function large_dalloc_junk_impl (line 74) | static void
function large_dalloc_maybe_junk_impl (line 80) | static void
function large_ralloc_no_move_shrink (line 95) | static bool
function large_ralloc_no_move_expand (line 130) | static bool
function large_ralloc_no_move (line 218) | bool
function large_dalloc_prep_impl (line 308) | static void
function large_dalloc_finish_impl (line 329) | static void
function large_dalloc_prep_junked_locked (line 335) | void
function large_dalloc_finish (line 340) | void
function large_dalloc (line 345) | void
function large_salloc (line 353) | size_t
function prof_tctx_t (line 358) | prof_tctx_t *
function large_prof_tctx_set (line 363) | void
function large_prof_tctx_reset (line 368) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/log.c
function log_var_matches_segment (line 21) | static bool
function log_var_update_state (line 43) | unsigned
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/malloc_io.c
function wrtmessage (line 71) | static void
function malloc_write (line 82) | void
function buferror (line 95) | int
function uintmax_t (line 113) | uintmax_t
function malloc_vsnprintf (line 326) | size_t
function malloc_cprintf (line 647) | void
function malloc_printf (line 659) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/mutex.c
function JEMALLOC_EXPORT (line 31) | JEMALLOC_EXPORT int
function malloc_mutex_lock_slow (line 46) | void
function mutex_prof_data_init (line 103) | static void
function malloc_mutex_prof_data_reset (line 111) | void
function mutex_addr_comp (line 117) | static int
function malloc_mutex_init (line 133) | bool
function malloc_mutex_prefork (line 185) | void
function malloc_mutex_postfork_parent (line 190) | void
function malloc_mutex_postfork_child (line 195) | void
function malloc_mutex_boot (line 211) | bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/mutex_pool.c
function mutex_pool_init (line 9) | bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/nstime.c
function nstime_init (line 11) | void
function nstime_init2 (line 16) | void
function nstime_ns (line 21) | uint64_t
function nstime_msec (line 26) | uint64_t
function nstime_sec (line 31) | uint64_t
function nstime_nsec (line 36) | uint64_t
function nstime_copy (line 41) | void
function nstime_compare (line 46) | int
function nstime_add (line 51) | void
function nstime_iadd (line 58) | void
function nstime_subtract (line 65) | void
function nstime_isubtract (line 72) | void
function nstime_imultiply (line 79) | void
function nstime_idivide (line 87) | void
function nstime_divide (line 94) | uint64_t
function nstime_get (line 103) | static void
function nstime_get (line 115) | static void
function nstime_get (line 124) | static void
function nstime_get (line 133) | static void
function nstime_get (line 139) | static void
function nstime_monotonic_impl (line 148) | static bool
function nstime_update_impl (line 155) | static bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/pages.c
function pages_unmap (line 211) | void
function pages_commit_impl (line 219) | static bool
function pages_commit (line 252) | bool
function pages_decommit (line 257) | bool
function pages_purge_lazy (line 262) | bool
function pages_purge_forced (line 297) | bool
function pages_huge_impl (line 317) | static bool
function pages_huge (line 330) | bool
function pages_huge_unaligned (line 335) | static bool
function pages_nohuge_impl (line 340) | static bool
function pages_nohuge (line 354) | bool
function pages_nohuge_unaligned (line 359) | static bool
function pages_dontdump (line 364) | bool
function pages_dodump (line 375) | bool
function os_page_detect (line 387) | static size_t
function os_overcommits_sysctl (line 405) | static bool
function os_overcommits_proc (line 435) | static bool
function pages_set_thp_state (line 496) | void
function init_thp_state (line 515) | static void
function pages_boot (line 561) | bool
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/prof.c
function prof_tctx_comp (line 151) | static int
function prof_malloc_sample_object (line 240) | void
function prof_free_sampled_object (line 256) | void
function bt_init (line 271) | void
function prof_enter (line 279) | static void
function prof_leave (line 292) | static void
function prof_backtrace (line 319) | void
function _Unwind_Reason_Code (line 334) | static _Unwind_Reason_Code
function _Unwind_Reason_Code (line 341) | static _Unwind_Reason_Code
function prof_backtrace (line 361) | void
function prof_backtrace (line 370) | void
function prof_backtrace (line 533) | void
function malloc_mutex_t (line 540) | static malloc_mutex_t *
function malloc_mutex_t (line 547) | static malloc_mutex_t *
function prof_gctx_t (line 552) | static prof_gctx_t *
function prof_gctx_try_destroy (line 578) | static void
function prof_tctx_should_destroy (line 613) | static bool
function prof_gctx_should_destroy (line 629) | static bool
function prof_tctx_destroy (line 643) | static void
function prof_lookup_global (line 719) | static bool
function prof_tctx_t (line 784) | prof_tctx_t *
function prof_sample_threshold_update (line 871) | void
function prof_tdata_t (line 913) | static prof_tdata_t *
function prof_tdata_count (line 923) | size_t
function prof_bt_count (line 937) | size_t
function prof_dump_open_impl (line 957) | static int
function prof_dump_flush (line 974) | static bool
function prof_dump_close (line 997) | static bool
function prof_dump_write (line 1009) | static bool
function prof_dump_printf (line 1041) | static bool
function prof_tctx_merge_tdata (line 1055) | static void
function prof_tctx_merge_gctx (line 1086) | static void
function prof_tctx_t (line 1098) | static prof_tctx_t *
type prof_tctx_dump_iter_arg_s (line 1119) | struct prof_tctx_dump_iter_arg_s {
function prof_tctx_t (line 1124) | static prof_tctx_t *
function prof_tctx_t (line 1152) | static prof_tctx_t *
function prof_dump_gctx_prep (line 1178) | static void
type prof_gctx_merge_iter_arg_s (line 1197) | struct prof_gctx_merge_iter_arg_s {
function prof_gctx_t (line 1202) | static prof_gctx_t *
function prof_gctx_finish (line 1218) | static void
type prof_tdata_merge_iter_arg_s (line 1264) | struct prof_tdata_merge_iter_arg_s {
function prof_tdata_t (line 1269) | static prof_tdata_t *
function prof_tdata_t (line 1304) | static prof_tdata_t *
function prof_dump_header_impl (line 1325) | static bool
function prof_dump_gctx (line 1346) | static bool
function prof_open_maps (line 1403) | static int
function prof_getpid (line 1426) | static int
function prof_dump_maps (line 1435) | static bool
function prof_leakcheck (line 1495) | static void
type prof_gctx_dump_iter_arg_s (line 1526) | struct prof_gctx_dump_iter_arg_s {
function prof_gctx_t (line 1531) | static prof_gctx_t *
function prof_dump_prep (line 1551) | static void
function prof_dump_file (line 1593) | static bool
function prof_dump (line 1634) | static bool
function prof_cnt_all (line 1674) | void
function prof_dump_filename (line 1722) | static void
function prof_fdump (line 1740) | static void
function prof_accum_init (line 1761) | bool
function prof_idump (line 1777) | void
function prof_mdump (line 1811) | bool
function prof_gdump (line 1834) | void
function prof_bt_hash (line 1868) | static void
function prof_bt_keycomp (line 1877) | static bool
function prof_thr_uid_alloc (line 1890) | static uint64_t
function prof_tdata_t (line 1902) | static prof_tdata_t *
function prof_tdata_t (line 1948) | prof_tdata_t *
function prof_tdata_should_destroy_unlocked (line 1954) | static bool
function prof_tdata_should_destroy (line 1965) | static bool
function prof_tdata_destroy_locked (line 1973) | static void
function prof_tdata_destroy (line 1990) | static void
function prof_tdata_detach (line 1997) | static void
function prof_tdata_t (line 2022) | prof_tdata_t *
function prof_tdata_expire (line 2035) | static bool
function prof_tdata_t (line 2052) | static prof_tdata_t *
function prof_reset (line 2060) | void
function prof_tdata_cleanup (line 2087) | void
function prof_active_get (line 2101) | bool
function prof_active_set (line 2111) | bool
function prof_thread_name_set (line 2156) | int
function prof_thread_active_get (line 2194) | bool
function prof_thread_active_set (line 2205) | bool
function prof_thread_active_init_get (line 2217) | bool
function prof_thread_active_init_set (line 2227) | bool
function prof_gdump_get (line 2238) | bool
function prof_gdump_set (line 2248) | bool
function prof_boot0 (line 2259) | void
function prof_boot1 (line 2267) | void
function prof_boot2 (line 2291) | bool
function prof_prefork0 (line 2400) | void
function prof_prefork1 (line 2417) | void
function prof_postfork_parent (line 2428) | void
function prof_postfork_child (line 2451) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/rtree.c
function rtree_new (line 12) | bool
function rtree_node_elm_t (line 30) | static rtree_node_elm_t *
function rtree_node_dalloc_impl (line 37) | static void
function rtree_leaf_elm_t (line 45) | static rtree_leaf_elm_t *
function rtree_leaf_dalloc_impl (line 52) | static void
function rtree_delete_subtree (line 62) | static void
function rtree_delete (line 93) | void
function rtree_node_elm_t (line 101) | static rtree_node_elm_t *
function rtree_leaf_elm_t (line 128) | static rtree_leaf_elm_t *
function rtree_node_valid (line 154) | static bool
function rtree_leaf_valid (line 159) | static bool
function rtree_node_elm_t (line 164) | static rtree_node_elm_t *
function rtree_node_elm_t (line 180) | static rtree_node_elm_t *
function rtree_leaf_elm_t (line 193) | static rtree_leaf_elm_t *
function rtree_leaf_elm_t (line 209) | static rtree_leaf_elm_t *
function rtree_leaf_elm_t (line 222) | rtree_leaf_elm_t *
function rtree_ctx_data_init (line 308) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/stats.c
function get_rate_str (line 56) | static bool
function gen_mutex_ctl_str (line 81) | static void
function mutex_stats_init_cols (line 87) | static void
function mutex_stats_read_global (line 121) | static void
function mutex_stats_read_arena (line 144) | static void
function mutex_stats_read_arena_bin (line 169) | static void
function mutex_stats_emit (line 192) | static void
function stats_arena_bins_print (line 218) | static void
function stats_arena_lextents_print (line 410) | static void
function stats_arena_mutexes_print (line 497) | static void
function stats_arena_print (line 522) | static void
function stats_general_print (line 825) | static void
function stats_print_helper (line 1064) | static void
function stats_print (line 1224) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/tcache.c
function tcache_salloc (line 34) | size_t
function tcache_event_hard (line 39) | void
function tcache_bin_flush_small (line 103) | void
function tcache_bin_flush_large (line 188) | void
function tcache_arena_associate (line 286) | void
function tcache_arena_dissociate (line 307) | static void
function tcache_arena_reassociate (line 334) | void
function tsd_tcache_enabled_data_init (line 340) | bool
function tcache_init (line 355) | static void
function tsd_tcache_data_init (line 389) | bool
function tcache_t (line 431) | tcache_t *
function tcache_flush_cache (line 457) | static void
function tcache_flush (line 485) | void
function tcache_destroy (line 491) | static void
function tcache_cleanup (line 509) | void
function tcache_stats_merge (line 528) | void
function tcaches_create_prep (line 552) | static bool
function tcaches_create (line 578) | bool
function tcache_t (line 616) | static tcache_t *
function tcaches_flush (line 628) | void
function tcaches_destroy (line 638) | void
function tcache_boot (line 651) | bool
function tcache_prefork (line 698) | void
function tcache_postfork_parent (line 705) | void
function tcache_postfork_child (line 712) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/tsd.c
type tsd_init_head_s (line 34) | struct tsd_init_head_s {
function tsd_slow_update (line 54) | void
function tsd_data_init (line 66) | static bool
function assert_tsd_data_cleanup_done (line 87) | static void
function tsd_data_init_nocleanup (line 98) | static bool
function tsd_t (line 116) | tsd_t *
function malloc_tsd_dalloc (line 164) | void
function _malloc_thread_cleanup (line 173) | void
function malloc_tsd_cleanup_register (line 196) | void
function tsd_do_data_cleanup (line 203) | static void
function tsd_cleanup (line 213) | void
function tsd_t (line 258) | tsd_t *
function malloc_tsd_boot1 (line 271) | void
function BOOL (line 281) | static BOOL WINAPI
function tsd_init_finish (line 345) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/witness.c
function witness_init (line 8) | void
function witness_lock_error_impl (line 17) | static void
function witness_owner_error_impl (line 31) | static void
function witness_not_owner_error_impl (line 40) | static void
function witness_depth_error_impl (line 49) | static void
function witnesses_cleanup (line 65) | void
function witness_prefork (line 72) | void
function witness_postfork_parent (line 80) | void
function witness_postfork_child (line 88) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/src/zone.c
type malloc_zone_t (line 14) | typedef struct _malloc_zone_t {
type vm_range_t (line 34) | typedef struct {
type malloc_statistics_t (line 39) | typedef struct malloc_statistics_t {
type kern_return_t (line 46) | typedef kern_return_t memory_reader_t(task_t, vm_address_t, vm_size_t, v...
type malloc_introspection_t (line 50) | typedef struct malloc_introspection_t {
type malloc_introspection_t (line 91) | struct malloc_introspection_t
type _malloc_zone_t (line 108) | struct _malloc_zone_t
type _malloc_zone_t (line 110) | struct _malloc_zone_t
type _malloc_zone_t (line 112) | struct _malloc_zone_t
function zone_size (line 132) | static size_t
function zone_free (line 165) | static void
function zone_free_definite_size (line 193) | static void
function zone_destroy (line 207) | static void
function zone_batch_malloc (line 213) | static unsigned
function zone_batch_free (line 227) | static void
function zone_pressure_relief (line 238) | static size_t
function zone_good_size (line 243) | static size_t
function kern_return_t (line 251) | static kern_return_t
function boolean_t (line 258) | static boolean_t
function zone_print (line 263) | static void
function zone_log (line 267) | static void
function zone_force_lock (line 271) | static void
function zone_force_unlock (line 284) | static void
function zone_statistics (line 309) | static void
function boolean_t (line 318) | static boolean_t
function zone_reinit_lock (line 324) | static void
function zone_init (line 331) | static void
function malloc_zone_t (line 369) | static malloc_zone_t *
function zone_promote (line 400) | static void
function zone_register (line 436) | JEMALLOC_ATTR(constructor)
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/include/test/SFMT-alti.h
function vec_recursion (line 64) | unsigned int vec_recursion(vector unsigned int a,
function gen_rand_all (line 98) | static inline void gen_rand_all(sfmt_t *ctx) {
function gen_rand_array (line 125) | static inline void gen_rand_array(sfmt_t *ctx, w128_t *array, int size) {
function swap (line 176) | static inline void swap(w128_t *array, int size) {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/include/test/SFMT-sse2.h
function JEMALLOC_ALWAYS_INLINE (line 63) | JEMALLOC_ALWAYS_INLINE __m128i mm_recursion(__m128i *a, __m128i *b,
function gen_rand_all (line 84) | static inline void gen_rand_all(sfmt_t *ctx) {
function gen_rand_array (line 114) | static inline void gen_rand_array(sfmt_t *ctx, w128_t *array, int size) {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/include/test/SFMT.h
type sfmt_t (line 69) | typedef struct sfmt_s sfmt_t;
function to_real1 (line 86) | static inline double to_real1(uint32_t v) {
function genrand_real1 (line 92) | static inline double genrand_real1(sfmt_t *ctx) {
function to_real2 (line 97) | static inline double to_real2(uint32_t v) {
function genrand_real2 (line 103) | static inline double genrand_real2(sfmt_t *ctx) {
function to_real3 (line 108) | static inline double to_real3(uint32_t v) {
function genrand_real3 (line 114) | static inline double genrand_real3(sfmt_t *ctx) {
function to_res53 (line 120) | static inline double to_res53(uint64_t v) {
function to_res53_mix (line 126) | static inline double to_res53_mix(uint32_t x, uint32_t y) {
function genrand_res53 (line 132) | static inline double genrand_res53(sfmt_t *ctx) {
function genrand_res53_mix (line 139) | static inline double genrand_res53_mix(sfmt_t *ctx) {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/include/test/extent_hooks.h
function extent_dalloc_hook (line 103) | static bool
function extent_destroy_hook (line 124) | static void
function extent_commit_hook (line 142) | static bool
function extent_decommit_hook (line 164) | static bool
function extent_purge_lazy_hook (line 186) | static bool
function extent_purge_forced_hook (line 209) | static bool
function extent_split_hook (line 232) | static bool
function extent_merge_hook (line 256) | static bool
function extent_hooks_prep (line 282) | static void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/include/test/math.h
function ln_gamma (line 9) | static inline double
function i_gamma (line 44) | static inline double
function pt_norm (line 128) | static inline double
function pt_chi2 (line 216) | static inline double
function pt_gamma (line 303) | static inline double
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/include/test/mtx.h
type mtx_t (line 8) | typedef struct {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/include/test/test.h
type test_status_t (line 289) | typedef enum {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/include/test/thd.h
type HANDLE (line 3) | typedef HANDLE thd_t;
type pthread_t (line 5) | typedef pthread_t thd_t;
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/include/test/timer.h
type timedelta_t (line 3) | typedef struct {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/MALLOCX_ARENA.c
function TEST_BEGIN (line 47) | TEST_BEGIN(test_MALLOCX_ARENA) {
function TEST_END (line 60) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/aligned_alloc.c
function purge (line 10) | static void
function TEST_BEGIN (line 16) | TEST_BEGIN(test_alignment_errors) {
function TEST_END (line 35) | TEST_END
function TEST_END (line 79) | TEST_END
function TEST_END (line 125) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/allocated.c
function TEST_BEGIN (line 102) | TEST_BEGIN(test_main_thread) {
function TEST_END (line 105) | TEST_END
function TEST_END (line 113) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/extent.c
function check_background_thread_enabled (line 5) | static bool
function test_extent_body (line 17) | static void
function test_manual_hook_auto_arena (line 101) | static void
function test_manual_hook_body (line 138) | static void
function TEST_BEGIN (line 208) | TEST_BEGIN(test_extent_manual_hook) {
function TEST_END (line 223) | TEST_END
function TEST_END (line 241) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/mallocx.c
function get_nsizes_impl (line 3) | static unsigned
function get_nlarge (line 15) | static unsigned
function get_size_impl (line 20) | static size_t
function get_large_size (line 38) | static size_t
function purge (line 48) | static void
function TEST_BEGIN (line 54) | TEST_BEGIN(test_overflow) {
function TEST_END (line 72) | TEST_END
function TEST_END (line 114) | TEST_END
function TEST_END (line 151) | TEST_END
function TEST_END (line 219) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/overflow.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_overflow) {
function TEST_END (line 40) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/posix_memalign.c
function purge (line 10) | static void
function TEST_BEGIN (line 16) | TEST_BEGIN(test_alignment_errors) {
function TEST_END (line 33) | TEST_END
function TEST_END (line 71) | TEST_END
function TEST_END (line 119) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/rallocx.c
function get_nsizes_impl (line 3) | static unsigned
function get_nlarge (line 15) | static unsigned
function get_size_impl (line 20) | static size_t
function get_large_size (line 38) | static size_t
function TEST_BEGIN (line 43) | TEST_BEGIN(test_grow_and_shrink) {
function TEST_END (line 85) | TEST_END
function TEST_BEGIN (line 106) | TEST_BEGIN(test_zero) {
function TEST_END (line 148) | TEST_END
function TEST_END (line 172) | TEST_END
function TEST_END (line 209) | TEST_END
function TEST_END (line 235) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/sdallocx.c
function TEST_BEGIN (line 6) | TEST_BEGIN(test_basic) {
function TEST_END (line 10) | TEST_END
function TEST_END (line 48) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/thread_arena.c
function mallctl_failure (line 40) | static void
function TEST_BEGIN (line 48) | TEST_BEGIN(test_thread_arena) {
function TEST_END (line 80) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/thread_tcache_enabled.c
function TEST_BEGIN (line 65) | TEST_BEGIN(test_main_thread) {
function TEST_END (line 68) | TEST_END
function TEST_END (line 76) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/integration/xallocx.c
function arena_ind (line 8) | static unsigned
function TEST_BEGIN (line 21) | TEST_BEGIN(test_same_size) {
function TEST_END (line 34) | TEST_END
function TEST_END (line 49) | TEST_END
function TEST_END (line 64) | TEST_END
function get_nsmall (line 78) | static unsigned
function get_nlarge (line 83) | static unsigned
function get_size_impl (line 88) | static size_t
function get_small_size (line 106) | static size_t
function get_large_size (line 111) | static size_t
function TEST_BEGIN (line 116) | TEST_BEGIN(test_size) {
function TEST_END (line 143) | TEST_END
function TEST_END (line 174) | TEST_END
function TEST_END (line 205) | TEST_END
function TEST_END (line 274) | TEST_END
function validate_fill (line 295) | static bool
function test_zero (line 314) | static void
function TEST_BEGIN (line 362) | TEST_BEGIN(test_zero_large) {
function TEST_END (line 371) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/src/SFMT.c
type w128_t (line 77) | typedef union W128_T w128_t;
type w128_t (line 86) | typedef union W128_T w128_t;
type W128_T (line 91) | struct W128_T {
type w128_t (line 95) | typedef struct W128_T w128_t;
type sfmt_s (line 99) | struct sfmt_s {
function idxof (line 145) | static inline int idxof(int i) {
function idxof (line 149) | static inline int idxof(int i) {
function rshift128 (line 163) | static inline void rshift128(w128_t *out, w128_t const *in, int shift) {
function rshift128 (line 178) | static inline void rshift128(w128_t *out, w128_t const *in, int shift) {
function lshift128 (line 202) | static inline void lshift128(w128_t *out, w128_t const *in, int shift) {
function lshift128 (line 217) | static inline void lshift128(w128_t *out, w128_t const *in, int shift) {
function do_recursion (line 244) | static inline void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c,
function do_recursion (line 261) | static inline void do_recursion(w128_t *r, w128_t *a, w128_t *b, w128_t *c,
function gen_rand_all (line 285) | static inline void gen_rand_all(sfmt_t *ctx) {
function gen_rand_array (line 312) | static inline void gen_rand_array(sfmt_t *ctx, w128_t *array, int size) {
function swap (line 346) | static inline void swap(w128_t *array, int size) {
function func1 (line 366) | static uint32_t func1(uint32_t x) {
function func2 (line 376) | static uint32_t func2(uint32_t x) {
function period_certification (line 383) | static void period_certification(sfmt_t *ctx) {
function get_min_array_size32 (line 428) | int get_min_array_size32(void) {
function get_min_array_size64 (line 437) | int get_min_array_size64(void) {
function gen_rand32 (line 447) | uint32_t gen_rand32(sfmt_t *ctx) {
function gen_rand32_range (line 461) | uint32_t gen_rand32_range(sfmt_t *ctx, uint32_t limit) {
function gen_rand64 (line 482) | uint64_t gen_rand64(sfmt_t *ctx) {
function gen_rand64_range (line 511) | uint64_t gen_rand64_range(sfmt_t *ctx, uint64_t limit) {
function fill_array32 (line 551) | void fill_array32(sfmt_t *ctx, uint32_t *array, int size) {
function fill_array64 (line 587) | void fill_array64(sfmt_t *ctx, uint64_t *array, int size) {
function sfmt_t (line 607) | sfmt_t *init_gen_rand(uint32_t seed) {
function sfmt_t (line 638) | sfmt_t *init_by_array(uint32_t *init_key, int key_length) {
function fini_gen_rand (line 714) | void fini_gen_rand(sfmt_t *ctx) {
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/src/mq.c
function mq_nanosleep (line 7) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/src/mtx.c
function mtx_init (line 7) | bool
function mtx_fini (line 34) | void
function mtx_lock (line 44) | void
function mtx_unlock (line 57) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/src/test.c
type reentrancy_t (line 13) | typedef enum {
function do_hook (line 37) | static void
function libc_reentrancy_hook (line 49) | static void
function arena_new_reentrancy_hook (line 54) | static void
function test_is_reentrant (line 60) | bool
function test_skip (line 66) | void
function test_fail (line 78) | void
function p_test_init (line 99) | void
function p_test_fini (line 106) | void
function test_status_t (line 113) | static test_status_t
function test_status_t (line 170) | test_status_t
function test_status_t (line 183) | test_status_t
function test_status_t (line 196) | test_status_t
function p_test_fail (line 213) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/src/thd.c
function thd_create (line 4) | void
function thd_join (line 13) | void
function thd_create (line 23) | void
function thd_join (line 30) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/src/timer.c
function timer_start (line 3) | void
function timer_stop (line 9) | void
function timer_usec (line 15) | uint64_t
function timer_ratio (line 24) | void
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/stress/microbench.c
function time_func (line 3) | static inline void
function compare_funcs (line 18) | void
function malloc_free (line 43) | static void
function mallocx_free (line 54) | static void
function TEST_BEGIN (line 64) | TEST_BEGIN(test_malloc_vs_mallocx) {
function TEST_END (line 68) | TEST_END
function malloc_sdallocx (line 80) | static void
function TEST_BEGIN (line 90) | TEST_BEGIN(test_free_vs_dallocx) {
function TEST_END (line 94) | TEST_END
function TEST_END (line 100) | TEST_END
function malloc_sallocx_free (line 115) | static void
function TEST_BEGIN (line 130) | TEST_BEGIN(test_mus_vs_sallocx) {
function TEST_END (line 134) | TEST_END
function TEST_BEGIN (line 151) | TEST_BEGIN(test_sallocx_vs_nallocx) {
function TEST_END (line 155) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/SFMT.c
function TEST_BEGIN (line 1452) | TEST_BEGIN(test_gen_rand_32) {
function TEST_END (line 1484) | TEST_END
function TEST_END (line 1519) | TEST_END
function TEST_END (line 1554) | TEST_END
function TEST_END (line 1590) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/a0.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_a0) {
function TEST_END (line 10) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/arena_reset.c
function get_nsizes_impl (line 10) | static unsigned
function get_nsmall (line 22) | static unsigned
function get_nlarge (line 27) | static unsigned
function get_size_impl (line 32) | static size_t
function get_small_size (line 50) | static size_t
function get_large_size (line 55) | static size_t
function vsalloc (line 61) | static size_t
function do_arena_create (line 87) | static unsigned
function do_arena_reset_pre (line 97) | static void
function do_arena_reset_post (line 136) | static void
function do_arena_reset_destroy (line 160) | static void
function do_arena_reset (line 173) | static void
function do_arena_destroy (line 178) | static void
function TEST_BEGIN (line 183) | TEST_BEGIN(test_arena_reset) {
function TEST_END (line 193) | TEST_END
function TEST_BEGIN (line 218) | TEST_BEGIN(test_arena_destroy_initial) {
function TEST_END (line 222) | TEST_END
function TEST_END (line 262) | TEST_END
function TEST_BEGIN (line 301) | TEST_BEGIN(test_arena_destroy_hooks_unmap) {
function TEST_END (line 335) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/atomic.c
function TEST_BEGIN (line 179) | TEST_BEGIN(test_atomic_u64) {
function TEST_BEGIN (line 190) | TEST_BEGIN(test_atomic_u32) {
function TEST_BEGIN (line 196) | TEST_BEGIN(test_atomic_p) {
function TEST_BEGIN (line 202) | TEST_BEGIN(test_atomic_zu) {
function TEST_BEGIN (line 208) | TEST_BEGIN(test_atomic_zd) {
function TEST_BEGIN (line 215) | TEST_BEGIN(test_atomic_u) {
function TEST_END (line 218) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/background_thread.c
function test_switch_background_thread_ctl (line 5) | static void
function test_repeat_background_thread_ctl (line 24) | static void
function TEST_BEGIN (line 43) | TEST_BEGIN(test_background_thread_ctl) {
function TEST_END (line 71) | TEST_END
function TEST_END (line 111) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/background_thread_enable.c
function TEST_BEGIN (line 5) | TEST_BEGIN(test_deferred) {
function TEST_END (line 31) | TEST_END
function TEST_END (line 76) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/base.c
function TEST_BEGIN (line 29) | TEST_BEGIN(test_base_hooks_default) {
function TEST_END (line 59) | TEST_END
function TEST_END (line 104) | TEST_END
function TEST_END (line 226) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/bit_util.c
function TEST_BEGIN (line 36) | TEST_BEGIN(test_pow2_ceil_u64) {
function TEST_END (line 39) | TEST_END
function TEST_END (line 44) | TEST_END
function TEST_END (line 49) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/bitmap.c
function test_bitmap_initializer_body (line 95) | static void
function TEST_BEGIN (line 126) | TEST_BEGIN(test_bitmap_initializer) {
function TEST_END (line 137) | TEST_END
function TEST_BEGIN (line 149) | TEST_BEGIN(test_bitmap_size) {
function TEST_END (line 167) | TEST_END
function TEST_BEGIN (line 189) | TEST_BEGIN(test_bitmap_init) {
function TEST_END (line 204) | TEST_END
function TEST_BEGIN (line 220) | TEST_BEGIN(test_bitmap_set) {
function TEST_END (line 235) | TEST_END
function TEST_BEGIN (line 258) | TEST_BEGIN(test_bitmap_unset) {
function TEST_END (line 273) | TEST_END
function TEST_BEGIN (line 405) | TEST_BEGIN(test_bitmap_xfu) {
function TEST_END (line 420) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/ckh.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_new_delete) {
function TEST_END (line 17) | TEST_END
function TEST_END (line 104) | TEST_END
function TEST_END (line 203) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/decay.c
function check_background_thread_enabled (line 12) | static bool
function nstime_monotonic_mock (line 24) | static bool
function nstime_update_mock (line 29) | static bool
function do_arena_create (line 38) | static unsigned
function do_arena_destroy (line 64) | static void
function do_epoch (line 75) | void
function do_purge (line 82) | void
function do_decay (line 93) | void
function get_arena_npurge_impl (line 104) | static uint64_t
function get_arena_dirty_npurge (line 118) | static uint64_t
function get_arena_muzzy_npurge (line 124) | static uint64_t
function get_arena_npurge (line 130) | static uint64_t
function get_arena_pdirty (line 137) | static size_t
function get_arena_pmuzzy (line 152) | static size_t
function generate_dirty (line 174) | static void
function TEST_BEGIN (line 181) | TEST_BEGIN(test_decay_ticks) {
function TEST_END (line 373) | TEST_END
function TEST_BEGIN (line 421) | TEST_BEGIN(test_decay_ticker) {
function TEST_END (line 481) | TEST_END
function TEST_END (line 539) | TEST_END
function TEST_END (line 559) | TEST_END
function TEST_END (line 589) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/div.c
function TEST_BEGIN (line 5) | TEST_BEGIN(test_div_exhaustive) {
function TEST_END (line 23) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/emitter.c
type buf_descriptor_t (line 13) | typedef struct buf_descriptor_s buf_descriptor_t;
type buf_descriptor_s (line 14) | struct buf_descriptor_s {
function forwarding_cb (line 24) | static void
function assert_emit_output (line 67) | static void
function emit_dict (line 93) | static void
function TEST_BEGIN (line 127) | TEST_BEGIN(test_dict) {
function TEST_END (line 130) | TEST_END
function TEST_BEGIN (line 149) | TEST_BEGIN(test_table_printf) {
function TEST_END (line 153) | TEST_END
function TEST_BEGIN (line 194) | TEST_BEGIN(test_nested_dict) {
function TEST_END (line 198) | TEST_END
function TEST_BEGIN (line 249) | TEST_BEGIN(test_types) {
function TEST_END (line 252) | TEST_END
function TEST_BEGIN (line 295) | TEST_BEGIN(test_modal) {
function TEST_END (line 298) | TEST_END
function TEST_BEGIN (line 341) | TEST_BEGIN(test_json_arr) {
function TEST_END (line 344) | TEST_END
function TEST_BEGIN (line 398) | TEST_BEGIN(test_table_row) {
function TEST_END (line 401) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/extent_quantize.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_small_extent_size) {
function TEST_END (line 35) | TEST_END
function TEST_END (line 99) | TEST_END
function TEST_END (line 133) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/fork.c
function wait_for_child_exit (line 8) | static void
function TEST_BEGIN (line 31) | TEST_BEGIN(test_fork) {
function do_test_fork_multithreaded (line 97) | static void
function TEST_BEGIN (line 106) | TEST_BEGIN(test_fork_multithreaded) {
function TEST_END (line 134) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/hash.c
type hash_variant_t (line 33) | typedef enum {
function hash_variant_bits (line 39) | static int
function hash_variant_verify_key (line 60) | static void
function hash_variant_verify (line 139) | static void
function TEST_BEGIN (line 152) | TEST_BEGIN(test_hash_x86_32) {
function TEST_END (line 155) | TEST_END
function TEST_END (line 160) | TEST_END
function TEST_END (line 165) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/hooks.c
function hook (line 5) | static void
function func_to_hook (line 10) | static int
function TEST_BEGIN (line 17) | TEST_BEGIN(unhooked_call) {
function TEST_END (line 23) | TEST_END
function TEST_END (line 31) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/junk.c
function watch_junking (line 11) | static void
function arena_dalloc_junk_small_intercept (line 17) | static void
function large_dalloc_junk_intercept (line 32) | static void
function large_dalloc_maybe_junk_intercept (line 47) | static void
function test_junk (line 55) | static void
function TEST_BEGIN (line 124) | TEST_BEGIN(test_junk_small) {
function TEST_END (line 128) | TEST_END
function TEST_END (line 134) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/mallctl.c
function TEST_BEGIN (line 5) | TEST_BEGIN(test_mallctl_errors) {
function TEST_END (line 30) | TEST_END
function TEST_END (line 40) | TEST_END
function TEST_END (line 76) | TEST_END
function TEST_END (line 103) | TEST_END
function TEST_END (line 117) | TEST_END
function TEST_END (line 143) | TEST_END
function TEST_END (line 190) | TEST_END
function TEST_END (line 214) | TEST_END
function TEST_END (line 237) | TEST_END
function TEST_END (line 330) | TEST_END
function TEST_END (line 366) | TEST_END
function TEST_END (line 404) | TEST_END
function TEST_END (line 436) | TEST_END
function TEST_END (line 468) | TEST_END
function TEST_END (line 491) | TEST_END
function TEST_END (line 514) | TEST_END
function TEST_END (line 559) | TEST_END
function TEST_END (line 607) | TEST_END
function TEST_END (line 639) | TEST_END
function TEST_END (line 671) | TEST_END
function TEST_END (line 689) | TEST_END
function TEST_END (line 707) | TEST_END
function TEST_END (line 722) | TEST_END
function TEST_END (line 739) | TEST_END
function TEST_END (line 755) | TEST_END
function TEST_END (line 774) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/malloc_io.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_malloc_strtoumax_no_endptr) {
function TEST_END (line 11) | TEST_END
function TEST_END (line 105) | TEST_END
function TEST_END (line 137) | TEST_END
function TEST_END (line 249) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/math.c
function double_eq_rel (line 16) | static bool
function factorial (line 27) | static uint64_t
function TEST_BEGIN (line 39) | TEST_BEGIN(test_ln_gamma_factorial) {
function TEST_BEGIN (line 190) | TEST_BEGIN(test_ln_gamma_misc) {
function TEST_BEGIN (line 240) | TEST_BEGIN(test_pt_norm) {
function TEST_BEGIN (line 289) | TEST_BEGIN(test_pt_chi2) {
function TEST_BEGIN (line 350) | TEST_BEGIN(test_pt_gamma_shape) {
function TEST_END (line 367) | TEST_END
function TEST_END (line 379) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/mq.c
type mq_msg_t (line 6) | typedef struct mq_msg_s mq_msg_t;
type mq_msg_s (line 7) | struct mq_msg_s {
function TEST_BEGIN (line 12) | TEST_BEGIN(test_mq_basic) {
function TEST_END (line 30) | TEST_END
function TEST_BEGIN (line 61) | TEST_BEGIN(test_mq_threaded) {
function TEST_END (line 81) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/mtx.c
function TEST_BEGIN (line 6) | TEST_BEGIN(test_mtx_basic) {
function TEST_END (line 14) | TEST_END
function TEST_BEGIN (line 34) | TEST_BEGIN(test_mtx_race) {
function TEST_END (line 50) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/nstime.c
function TEST_BEGIN (line 5) | TEST_BEGIN(test_nstime_init) {
function TEST_END (line 13) | TEST_END
function TEST_END (line 22) | TEST_END
function TEST_END (line 33) | TEST_END
function TEST_END (line 67) | TEST_END
function TEST_END (line 86) | TEST_END
function TEST_END (line 103) | TEST_END
function TEST_END (line 122) | TEST_END
function TEST_END (line 139) | TEST_END
function TEST_END (line 156) | TEST_END
function TEST_END (line 175) | TEST_END
function TEST_END (line 202) | TEST_END
function TEST_END (line 207) | TEST_END
function TEST_END (line 231) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/pack.c
function binind_compute (line 19) | static unsigned
function nregs_per_run_compute (line 49) | static size_t
function arenas_create_mallctl (line 66) | static unsigned
function arena_reset_mallctl (line 78) | static void
function TEST_BEGIN (line 90) | TEST_BEGIN(test_pack) {
function TEST_END (line 160) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/pages.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_pages_huge) {
function TEST_END (line 23) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/ph.c
type node_t (line 5) | typedef struct node_s node_t;
type node_s (line 7) | struct node_s {
function node_cmp (line 14) | static int
function node_cmp_magic (line 30) | static int
type heap_t (line 39) | typedef ph(node_t) heap_t;
function node_print (line 42) | static void
function heap_print (line 64) | static void
function node_validate (line 87) | static unsigned
function heap_validate (line 115) | static unsigned
function TEST_BEGIN (line 141) | TEST_BEGIN(test_ph_empty) {
function TEST_END (line 149) | TEST_END
function node_t (line 158) | static node_t *
function node_t (line 165) | static node_t *
function TEST_BEGIN (line 172) | TEST_BEGIN(test_ph_random) {
function TEST_END (line 311) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/prng.c
function test_prng_lg_range_u32 (line 3) | static void
function test_prng_lg_range_u64 (line 40) | static void
function test_prng_lg_range_zu (line 76) | static void
function TEST_BEGIN (line 114) | TEST_BEGIN(test_prng_lg_range_u32_nonatomic) {
function TEST_END (line 117) | TEST_END
function TEST_END (line 122) | TEST_END
function TEST_END (line 127) | TEST_END
function TEST_END (line 132) | TEST_END
function TEST_END (line 137) | TEST_END
function test_prng_range_u64 (line 159) | static void
function test_prng_range_zu (line 179) | static void
function TEST_BEGIN (line 199) | TEST_BEGIN(test_prng_range_u32_nonatomic) {
function TEST_END (line 202) | TEST_END
function TEST_END (line 207) | TEST_END
function TEST_END (line 212) | TEST_END
function TEST_END (line 217) | TEST_END
function TEST_END (line 222) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/prof_accum.c
function prof_dump_open_intercept (line 8) | static int
function TEST_BEGIN (line 52) | TEST_BEGIN(test_idump) {
function TEST_END (line 75) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/prof_active.c
function mallctl_bool_get (line 3) | static void
function mallctl_bool_set (line 15) | static void
function mallctl_prof_active_get_impl (line 30) | static void
function mallctl_prof_active_set_impl (line 38) | static void
function mallctl_thread_prof_active_get_impl (line 47) | static void
function mallctl_thread_prof_active_set_impl (line 56) | static void
function prof_sampling_probe_impl (line 65) | static void
function TEST_BEGIN (line 81) | TEST_BEGIN(test_prof_active) {
function TEST_END (line 111) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/prof_gdump.c
function prof_dump_open_intercept (line 5) | static int
function TEST_BEGIN (line 17) | TEST_BEGIN(test_gdump) {
function TEST_END (line 68) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/prof_idump.c
function prof_dump_open_intercept (line 5) | static int
function TEST_BEGIN (line 17) | TEST_BEGIN(test_idump) {
function TEST_END (line 36) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/prof_reset.c
function prof_dump_open_intercept (line 3) | static int
function set_prof_active (line 13) | static void
function get_lg_prof_sample (line 19) | static size_t
function do_prof_reset (line 30) | static void
function TEST_BEGIN (line 39) | TEST_BEGIN(test_prof_reset_basic) {
function prof_dump_header_intercept (line 86) | static bool
function TEST_BEGIN (line 95) | TEST_BEGIN(test_prof_reset_cleanup) {
function TEST_BEGIN (line 182) | TEST_BEGIN(test_prof_reset) {
function TEST_BEGIN (line 227) | TEST_BEGIN(test_xallocx) {
function main (line 276) | int
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/prof_tctx.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_prof_realloc) {
function TEST_END (line 40) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/prof_thread_name.c
function mallctl_thread_name_get_impl (line 3) | static void
function mallctl_thread_name_set_impl (line 20) | static void
function TEST_BEGIN (line 32) | TEST_BEGIN(test_prof_thread_name_validation) {
function TEST_BEGIN (line 96) | TEST_BEGIN(test_prof_thread_name_threaded) {
function main (line 115) | int
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/ql.c
type list_t (line 8) | typedef struct list_s list_t;
type list_head_t (line 9) | typedef ql_head(list_t) list_head_t;
type list_s (line 11) | struct list_s {
function test_empty_list (line 16) | static void
function TEST_BEGIN (line 38) | TEST_BEGIN(test_ql_empty) {
function TEST_END (line 44) | TEST_END
function test_entries_list (line 56) | static void
function TEST_BEGIN (line 92) | TEST_BEGIN(test_ql_tail_insert) {
function TEST_END (line 105) | TEST_END
function TEST_END (line 124) | TEST_END
function TEST_END (line 139) | TEST_END
function TEST_END (line 158) | TEST_END
function TEST_END (line 193) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/qr.c
type ring_t (line 10) | typedef struct ring_s ring_t;
type ring_s (line 12) | struct ring_s {
function init_entries (line 17) | static void
function test_independent_entries (line 27) | static void
function TEST_BEGIN (line 64) | TEST_BEGIN(test_qr_one) {
function TEST_END (line 70) | TEST_END
function TEST_BEGIN (line 105) | TEST_BEGIN(test_qr_after_insert) {
function TEST_END (line 115) | TEST_END
function TEST_END (line 144) | TEST_END
function TEST_END (line 182) | TEST_END
function TEST_BEGIN (line 206) | TEST_BEGIN(test_qr_meld_split) {
function TEST_END (line 233) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/rb.c
type node_t (line 16) | typedef struct node_s node_t;
type node_s (line 18) | struct node_s {
function node_cmp (line 25) | static int
type tree_t (line 44) | typedef rb_tree(node_t) tree_t;
function TEST_BEGIN (line 47) | TEST_BEGIN(test_rb_empty) {
function TEST_END (line 69) | TEST_END
function node_t (line 120) | static node_t *
function tree_iterate (line 147) | static unsigned
function tree_iterate_reverse (line 157) | static unsigned
function node_remove (line 167) | static void
function node_t (line 199) | static node_t *
function node_t (line 209) | static node_t *
function destroy_cb (line 219) | static void
function TEST_BEGIN (line 227) | TEST_BEGIN(test_rb_random) {
function TEST_END (line 348) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/retained.c
function do_arena_create (line 13) | static unsigned
function do_arena_destroy (line 23) | static void
function do_refresh (line 36) | static void
function do_get_size_impl (line 43) | static size_t
function do_get_active (line 59) | static size_t
function do_get_mapped (line 64) | static size_t
function TEST_BEGIN (line 100) | TEST_BEGIN(test_retained) {
function TEST_END (line 175) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/rtree.c
function rtree_node_elm_t (line 13) | static rtree_node_elm_t *
function rtree_node_dalloc_intercept (line 29) | static void
function rtree_leaf_elm_t (line 40) | static rtree_leaf_elm_t *
function rtree_leaf_dalloc_intercept (line 56) | static void
function TEST_BEGIN (line 67) | TEST_BEGIN(test_rtree_read_empty) {
function TEST_BEGIN (line 86) | TEST_BEGIN(test_rtree_extrema) {
function TEST_END (line 119) | TEST_END
function TEST_END (line 156) | TEST_END
function TEST_END (line 209) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/size_classes.c
function get_max_size_class (line 3) | static size_t
function TEST_BEGIN (line 25) | TEST_BEGIN(test_size_classes) {
function TEST_END (line 81) | TEST_END
function TEST_END (line 137) | TEST_END
function TEST_END (line 175) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/slab.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_arena_slab_regind) {
function TEST_END (line 26) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/smoothstep.c
function TEST_BEGIN (line 10) | TEST_BEGIN(test_smoothstep_integral) {
function TEST_END (line 37) | TEST_END
function TEST_END (line 58) | TEST_END
function TEST_END (line 94) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/spin.c
function TEST_BEGIN (line 5) | TEST_BEGIN(test_spin) {
function TEST_END (line 12) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/stats.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_stats_summary) {
function TEST_END (line 26) | TEST_END
function TEST_END (line 66) | TEST_END
function TEST_END (line 128) | TEST_END
function no_lazy_lock (line 135) | static void
function TEST_BEGIN (line 143) | TEST_BEGIN(test_stats_arenas_small) {
function TEST_END (line 186) | TEST_END
function TEST_END (line 221) | TEST_END
function TEST_BEGIN (line 228) | TEST_BEGIN(test_stats_arenas_bins) {
function TEST_END (line 315) | TEST_END
function TEST_END (line 356) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/stats_print.c
type token_type_t (line 5) | typedef enum {
type parser_t (line 22) | typedef struct parser_s parser_t;
type token_t (line 23) | typedef struct {
type parser_s (line 32) | struct parser_s {
function token_init (line 42) | static void
function token_error (line 53) | static void
function parser_init (line 75) | static void
function parser_fini (line 85) | static void
function parser_append (line 92) | static bool
function parser_tokenize (line 107) | static bool
function parser_parse_value (line 668) | static bool
function parser_parse_pair (line 687) | static bool
function parser_parse_values (line 705) | static bool
function parser_parse_array (line 732) | static bool
function parser_parse_pairs (line 748) | static bool
function parser_parse_object (line 783) | static bool
function parser_parse (line 801) | static bool
function TEST_BEGIN (line 826) | TEST_BEGIN(test_json_parser) {
function TEST_END (line 920) | TEST_END
function TEST_BEGIN (line 930) | TEST_BEGIN(test_stats_print_json) {
function TEST_END (line 992) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/ticker.c
function TEST_BEGIN (line 5) | TEST_BEGIN(test_ticker_tick) {
function TEST_END (line 28) | TEST_END
function TEST_END (line 46) | TEST_END
function TEST_END (line 65) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/tsd.c
function data_cleanup (line 5) | void
function TEST_BEGIN (line 67) | TEST_BEGIN(test_tsd_main_thread) {
function TEST_END (line 70) | TEST_END
function TEST_END (line 85) | TEST_END
function TEST_BEGIN (line 120) | TEST_BEGIN(test_tsd_reincarnation) {
function TEST_END (line 125) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/witness.c
function witness_lock_error_intercept (line 13) | static void
function witness_owner_error_intercept (line 19) | static void
function witness_not_owner_error_intercept (line 24) | static void
function witness_depth_error_intercept (line 29) | static void
function witness_comp (line 35) | static int
function witness_comp_reverse (line 45) | static int
function TEST_BEGIN (line 56) | TEST_BEGIN(test_witness) {
function TEST_END (line 94) | TEST_END
function TEST_END (line 146) | TEST_END
function TEST_END (line 177) | TEST_END
function TEST_END (line 212) | TEST_END
function TEST_END (line 236) | TEST_END
function TEST_END (line 269) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/jemalloc/test/unit/zero.c
function test_zero (line 3) | static void
function TEST_BEGIN (line 42) | TEST_BEGIN(test_zero_small) {
function TEST_END (line 46) | TEST_END
function TEST_END (line 52) | TEST_END
FILE: Chapter02/redis-6.0.3/deps/linenoise/example.c
function completion (line 7) | void completion(const char *buf, linenoiseCompletions *lc) {
function main (line 23) | int main(int argc, char **argv) {
FILE: Chapter02/redis-6.0.3/deps/linenoise/linenoise.c
type termios (line 127) | struct termios
type linenoiseState (line 139) | struct linenoiseState {
type KEY_ACTION (line 154) | enum KEY_ACTION{
type linenoiseState (line 178) | struct linenoiseState
function linenoiseMaskModeEnable (line 205) | void linenoiseMaskModeEnable(void) {
function linenoiseMaskModeDisable (line 210) | void linenoiseMaskModeDisable(void) {
function linenoiseSetMultiLine (line 215) | void linenoiseSetMultiLine(int ml) {
function isUnsupportedTerm (line 221) | static int isUnsupportedTerm(void) {
function enableRawMode (line 232) | static int enableRawMode(int fd) {
function disableRawMode (line 267) | static void disableRawMode(int fd) {
function getCursorPosition (line 276) | static int getCursorPosition(int ifd, int ofd) {
function getColumns (line 300) | static int getColumns(int ifd, int ofd) {
function linenoiseClearScreen (line 334) | void linenoiseClearScreen(void) {
function linenoiseBeep (line 342) | static void linenoiseBeep(void) {
function freeCompletions (line 350) | static void freeCompletions(linenoiseCompletions *lc) {
function completeLine (line 364) | static int completeLine(struct linenoiseState *ls) {
function linenoiseSetCompletionCallback (line 423) | void linenoiseSetCompletionCallback(linenoiseCompletionCallback *fn) {
function linenoiseSetHintsCallback (line 429) | void linenoiseSetHintsCallback(linenoiseHintsCallback *fn) {
function linenoiseSetFreeHintsCallback (line 435) | void linenoiseSetFreeHintsCallback(linenoiseFreeHintsCallback *fn) {
function linenoiseAddCompletion (line 443) | void linenoiseAddCompletion(linenoiseCompletions *lc, const char *str) {
type abuf (line 465) | struct abuf {
function abInit (line 470) | static void abInit(struct abuf *ab) {
function abAppend (line 475) | static void abAppend(struct abuf *ab, const char *s, int len) {
function abFree (line 484) | static void abFree(struct abuf *ab) {
function refreshShowHints (line 490) | void refreshShowHints(struct abuf *ab, struct linenoiseState *l, int ple...
function refreshSingleLine (line 518) | static void refreshSingleLine(struct linenoiseState *l) {
function refreshMultiLine (line 563) | static void refreshMultiLine(struct linenoiseState *l) {
function refreshLine (line 653) | static void refreshLine(struct linenoiseState *l) {
function linenoiseEditInsert (line 663) | int linenoiseEditInsert(struct linenoiseState *l, char c) {
function linenoiseEditMoveLeft (line 691) | void linenoiseEditMoveLeft(struct linenoiseState *l) {
function linenoiseEditMoveRight (line 699) | void linenoiseEditMoveRight(struct linenoiseState *l) {
function linenoiseEditMoveHome (line 707) | void linenoiseEditMoveHome(struct linenoiseState *l) {
function linenoiseEditMoveEnd (line 715) | void linenoiseEditMoveEnd(struct linenoiseState *l) {
function linenoiseEditHistoryNext (line 726) | void linenoiseEditHistoryNext(struct linenoiseState *l, int dir) {
function linenoiseEditDelete (line 750) | void linenoiseEditDelete(struct linenoiseState *l) {
function linenoiseEditBackspace (line 760) | void linenoiseEditBackspace(struct linenoiseState *l) {
function linenoiseEditDeletePrevWord (line 772) | void linenoiseEditDeletePrevWord(struct linenoiseState *l) {
function linenoiseEdit (line 794) | static int linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, size_t ...
function linenoisePrintKeyCodes (line 981) | void linenoisePrintKeyCodes(void) {
function linenoiseRaw (line 1008) | static int linenoiseRaw(char *buf, size_t buflen, const char *prompt) {
function linenoiseFree (line 1095) | void linenoiseFree(void *ptr) {
function freeHistory (line 1103) | static void freeHistory(void) {
function linenoiseAtExit (line 1114) | static void linenoiseAtExit(void) {
function linenoiseHistoryAdd (line 1126) | int linenoiseHistoryAdd(const char *line) {
function linenoiseHistorySetMaxLen (line 1159) | int linenoiseHistorySetMaxLen(int len) {
function linenoiseHistorySave (line 1189) | int linenoiseHistorySave(const char *filename) {
function linenoiseHistoryLoad (line 1209) | int linenoiseHistoryLoad(const char *filename) {
FILE: Chapter02/redis-6.0.3/deps/linenoise/linenoise.h
type linenoiseCompletions (line 46) | typedef struct linenoiseCompletions {
FILE: Chapter02/redis-6.0.3/deps/lua/etc/min.c
function print (line 12) | static int print(lua_State *L)
function main (line 32) | int main(void)
FILE: Chapter02/redis-6.0.3/deps/lua/etc/noparser.c
function LUAI_FUNC (line 21) | LUAI_FUNC void luaX_init (lua_State *L) {
function LUAI_FUNC (line 25) | LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const...
function LUAI_FUNC (line 37) | LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, voi...
FILE: Chapter02/redis-6.0.3/deps/lua/src/fpconv.c
function fpconv_update_locale (line 52) | static void fpconv_update_locale()
function valid_number_character (line 75) | static inline int valid_number_character(char ch)
function strtod_buffer_size (line 94) | static int strtod_buffer_size(const char *s)
function fpconv_strtod (line 106) | double fpconv_strtod(const char *nptr, char **endptr)
function set_number_format (line 153) | static void set_number_format(char *fmt, int precision)
function fpconv_g_fmt (line 174) | int fpconv_g_fmt(char *str, double num, int precision)
function fpconv_init (line 199) | void fpconv_init()
FILE: Chapter02/redis-6.0.3/deps/lua/src/fpconv.h
function fpconv_init (line 10) | static inline void fpconv_init()
FILE: Chapter02/redis-6.0.3/deps/lua/src/lapi.c
function TValue (line 49) | static TValue *index2adr (lua_State *L, int idx) {
function Table (line 79) | static Table *getcurrenv (lua_State *L) {
function luaA_pushobject (line 89) | void luaA_pushobject (lua_State *L, const TValue *o) {
function LUA_API (line 95) | LUA_API int lua_checkstack (lua_State *L, int size) {
function LUA_API (line 110) | LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
function LUA_API (line 125) | LUA_API void lua_setlevel (lua_State *from, lua_State *to) {
function LUA_API (line 130) | LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
function LUA_API (line 140) | LUA_API lua_State *lua_newthread (lua_State *L) {
function LUA_API (line 159) | LUA_API int lua_gettop (lua_State *L) {
function LUA_API (line 164) | LUA_API void lua_settop (lua_State *L, int idx) {
function LUA_API (line 180) | LUA_API void lua_remove (lua_State *L, int idx) {
function LUA_API (line 191) | LUA_API void lua_insert (lua_State *L, int idx) {
function LUA_API (line 203) | LUA_API void lua_replace (lua_State *L, int idx) {
function LUA_API (line 228) | LUA_API void lua_pushvalue (lua_State *L, int idx) {
function LUA_API (line 242) | LUA_API int lua_type (lua_State *L, int idx) {
function LUA_API (line 248) | LUA_API const char *lua_typename (lua_State *L, int t) {
function LUA_API (line 254) | LUA_API int lua_iscfunction (lua_State *L, int idx) {
function LUA_API (line 260) | LUA_API int lua_isnumber (lua_State *L, int idx) {
function LUA_API (line 267) | LUA_API int lua_isstring (lua_State *L, int idx) {
function LUA_API (line 273) | LUA_API int lua_isuserdata (lua_State *L, int idx) {
function LUA_API (line 279) | LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
function LUA_API (line 287) | LUA_API int lua_equal (lua_State *L, int index1, int index2) {
function LUA_API (line 299) | LUA_API int lua_lessthan (lua_State *L, int index1, int index2) {
function LUA_API (line 313) | LUA_API lua_Number lua_tonumber (lua_State *L, int idx) {
function LUA_API (line 323) | LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) {
function LUA_API (line 337) | LUA_API int lua_toboolean (lua_State *L, int idx) {
function LUA_API (line 343) | LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
function LUA_API (line 361) | LUA_API size_t lua_objlen (lua_State *L, int idx) {
function LUA_API (line 379) | LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {
function LUA_API (line 385) | LUA_API void *lua_touserdata (lua_State *L, int idx) {
function LUA_API (line 395) | LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
function LUA_API (line 401) | LUA_API const void *lua_topointer (lua_State *L, int idx) {
function LUA_API (line 421) | LUA_API void lua_pushnil (lua_State *L) {
function LUA_API (line 429) | LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
function LUA_API (line 437) | LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
function LUA_API (line 445) | LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {
function LUA_API (line 454) | LUA_API void lua_pushstring (lua_State *L, const char *s) {
function LUA_API (line 462) | LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,
function LUA_API (line 473) | LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
function LUA_API (line 486) | LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
function LUA_API (line 503) | LUA_API void lua_pushboolean (lua_State *L, int b) {
function LUA_API (line 511) | LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
function LUA_API (line 519) | LUA_API int lua_pushthread (lua_State *L) {
function LUA_API (line 534) | LUA_API void lua_gettable (lua_State *L, int idx) {
function LUA_API (line 544) | LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
function LUA_API (line 557) | LUA_API void lua_rawget (lua_State *L, int idx) {
function LUA_API (line 567) | LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {
function LUA_API (line 578) | LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {
function LUA_API (line 587) | LUA_API int lua_getmetatable (lua_State *L, int objindex) {
function LUA_API (line 616) | LUA_API void lua_getfenv (lua_State *L, int idx) {
function LUA_API (line 645) | LUA_API void lua_settable (lua_State *L, int idx) {
function LUA_API (line 657) | LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
function LUA_API (line 671) | LUA_API void lua_rawset (lua_State *L, int idx) {
function LUA_API (line 684) | LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
function LUA_API (line 697) | LUA_API int lua_setmetatable (lua_State *L, int objindex) {
function LUA_API (line 734) | LUA_API int lua_setfenv (lua_State *L, int idx) {
function LUA_API (line 776) | LUA_API void lua_call (lua_State *L, int nargs, int nresults) {
type CallS (line 792) | struct CallS { /* data to `f_call' */
function f_call (line 798) | static void f_call (lua_State *L, void *ud) {
function LUA_API (line 805) | LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfun...
type CCallS (line 831) | struct CCallS { /* data to `f_Ccall' */
function f_Ccall (line 837) | static void f_Ccall (lua_State *L, void *ud) {
function LUA_API (line 850) | LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) {
function LUA_API (line 862) | LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
function LUA_API (line 875) | LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {
function LUA_API (line 890) | LUA_API int lua_status (lua_State *L) {
function LUA_API (line 899) | LUA_API int lua_gc (lua_State *L, int what, int data) {
function LUA_API (line 964) | LUA_API int lua_error (lua_State *L) {
function LUA_API (line 973) | LUA_API int lua_next (lua_State *L, int idx) {
function LUA_API (line 990) | LUA_API void lua_concat (lua_State *L, int n) {
function LUA_API (line 1007) | LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {
function LUA_API (line 1017) | LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {
function LUA_API (line 1025) | LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
function LUA_API (line 1057) | LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
function LUA_API (line 1071) | LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/lauxlib.c
function LUALIB_API (line 43) | LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extram...
function LUALIB_API (line 61) | LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) {
function tag_error (line 68) | static void tag_error (lua_State *L, int narg, int tag) {
function LUALIB_API (line 73) | LUALIB_API void luaL_where (lua_State *L, int level) {
function LUALIB_API (line 86) | LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
function LUALIB_API (line 99) | LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def,
function LUALIB_API (line 112) | LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {
function LUALIB_API (line 124) | LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tnam...
function LUALIB_API (line 140) | LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *me...
function LUALIB_API (line 146) | LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) {
function LUALIB_API (line 152) | LUALIB_API void luaL_checkany (lua_State *L, int narg) {
function LUALIB_API (line 158) | LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t...
function LUALIB_API (line 165) | LUALIB_API const char *luaL_optlstring (lua_State *L, int narg,
function LUALIB_API (line 176) | LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) {
function LUALIB_API (line 184) | LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number...
function LUALIB_API (line 189) | LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) {
function LUALIB_API (line 197) | LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,
function LUALIB_API (line 203) | LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *eve...
function LUALIB_API (line 219) | LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {
function LUALIB_API (line 229) | LUALIB_API void (luaL_register) (lua_State *L, const char *libname,
function libsize (line 235) | static int libsize (const luaL_Reg *l) {
function LUALIB_API (line 242) | LUALIB_API void luaI_openlib (lua_State *L, const char *libname,
function checkint (line 280) | static int checkint (lua_State *L, int topop) {
function getsizes (line 287) | static void getsizes (lua_State *L) {
function LUALIB_API (line 302) | LUALIB_API void luaL_setn (lua_State *L, int t, int n) {
function LUALIB_API (line 321) | LUALIB_API int luaL_getn (lua_State *L, int t) {
function LUALIB_API (line 340) | LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const cha...
function LUALIB_API (line 357) | LUALIB_API const char *luaL_findtable (lua_State *L, int idx,
function emptybuffer (line 398) | static int emptybuffer (luaL_Buffer *B) {
function adjuststack (line 410) | static void adjuststack (luaL_Buffer *B) {
function LUALIB_API (line 429) | LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) {
function LUALIB_API (line 436) | LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
function LUALIB_API (line 442) | LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {
function LUALIB_API (line 447) | LUALIB_API void luaL_pushresult (luaL_Buffer *B) {
function LUALIB_API (line 454) | LUALIB_API void luaL_addvalue (luaL_Buffer *B) {
function LUALIB_API (line 472) | LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {
function LUALIB_API (line 481) | LUALIB_API int luaL_ref (lua_State *L, int t) {
function LUALIB_API (line 504) | LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
type LoadF (line 522) | typedef struct LoadF {
function errfile (line 543) | static int errfile (lua_State *L, const char *what, int fnameindex) {
function LUALIB_API (line 552) | LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
type LoadS (line 593) | typedef struct LoadS {
function LUALIB_API (line 609) | LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t s...
function LUALIB_API (line 618) | LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) {
function panic (line 639) | static int panic (lua_State *L) {
function LUALIB_API (line 647) | LUALIB_API lua_State *luaL_newstate (void) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/lauxlib.h
type luaL_Reg (line 35) | typedef struct luaL_Reg {
type luaL_Buffer (line 129) | typedef struct luaL_Buffer {
FILE: Chapter02/redis-6.0.3/deps/lua/src/lbaselib.c
function luaB_print (line 31) | static int luaB_print (lua_State *L) {
function luaB_tonumber (line 53) | static int luaB_tonumber (lua_State *L) {
function luaB_error (line 81) | static int luaB_error (lua_State *L) {
function luaB_getmetatable (line 93) | static int luaB_getmetatable (lua_State *L) {
function luaB_setmetatable (line 104) | static int luaB_setmetatable (lua_State *L) {
function getfunc (line 117) | static void getfunc (lua_State *L, int opt) {
function luaB_getfenv (line 133) | static int luaB_getfenv (lua_State *L) {
function luaB_setfenv (line 143) | static int luaB_setfenv (lua_State *L) {
function luaB_rawequal (line 161) | static int luaB_rawequal (lua_State *L) {
function luaB_rawget (line 169) | static int luaB_rawget (lua_State *L) {
function luaB_rawset (line 177) | static int luaB_rawset (lua_State *L) {
function luaB_gcinfo (line 187) | static int luaB_gcinfo (lua_State *L) {
function luaB_collectgarbage (line 193) | static int luaB_collectgarbage (lua_State *L) {
function luaB_type (line 219) | static int luaB_type (lua_State *L) {
function luaB_next (line 226) | static int luaB_next (lua_State *L) {
function luaB_pairs (line 238) | static int luaB_pairs (lua_State *L) {
function ipairsaux (line 247) | static int ipairsaux (lua_State *L) {
function luaB_ipairs (line 257) | static int luaB_ipairs (lua_State *L) {
function load_aux (line 266) | static int load_aux (lua_State *L, int status) {
function luaB_loadstring (line 277) | static int luaB_loadstring (lua_State *L) {
function luaB_loadfile (line 285) | static int luaB_loadfile (lua_State *L) {
function luaB_load (line 315) | static int luaB_load (lua_State *L) {
function luaB_dofile (line 325) | static int luaB_dofile (lua_State *L) {
function luaB_assert (line 334) | static int luaB_assert (lua_State *L) {
function luaB_unpack (line 342) | static int luaB_unpack (lua_State *L) {
function luaB_select (line 358) | static int luaB_select (lua_State *L) {
function luaB_pcall (line 374) | static int luaB_pcall (lua_State *L) {
function luaB_xpcall (line 384) | static int luaB_xpcall (lua_State *L) {
function luaB_tostring (line 396) | static int luaB_tostring (lua_State *L) {
function luaB_newproxy (line 421) | static int luaB_newproxy (lua_State *L) {
function costatus (line 490) | static int costatus (lua_State *L, lua_State *co) {
function luaB_costatus (line 510) | static int luaB_costatus (lua_State *L) {
function auxresume (line 518) | static int auxresume (lua_State *L, lua_State *co, int narg) {
function luaB_coresume (line 543) | static int luaB_coresume (lua_State *L) {
function luaB_auxwrap (line 561) | static int luaB_auxwrap (lua_State *L) {
function luaB_cocreate (line 576) | static int luaB_cocreate (lua_State *L) {
function luaB_cowrap (line 586) | static int luaB_cowrap (lua_State *L) {
function luaB_yield (line 593) | static int luaB_yield (lua_State *L) {
function luaB_corunning (line 598) | static int luaB_corunning (lua_State *L) {
function auxopen (line 618) | static void auxopen (lua_State *L, const char *name,
function base_open (line 626) | static void base_open (lua_State *L) {
function LUALIB_API (line 648) | LUALIB_API int luaopen_base (lua_State *L) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/lcode.c
function isnumeral (line 30) | static int isnumeral(expdesc *e) {
function luaK_nil (line 35) | void luaK_nil (FuncState *fs, int from, int n) {
function luaK_jump (line 59) | int luaK_jump (FuncState *fs) {
function luaK_ret (line 69) | void luaK_ret (FuncState *fs, int first, int nret) {
function condjump (line 74) | static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {
function fixjump (line 80) | static void fixjump (FuncState *fs, int pc, int dest) {
function luaK_getlabel (line 94) | int luaK_getlabel (FuncState *fs) {
function getjump (line 100) | static int getjump (FuncState *fs, int pc) {
function Instruction (line 109) | static Instruction *getjumpcontrol (FuncState *fs, int pc) {
function need_value (line 122) | static int need_value (FuncState *fs, int list) {
function patchtestreg (line 131) | static int patchtestreg (FuncState *fs, int node, int reg) {
function removevalues (line 144) | static void removevalues (FuncState *fs, int list) {
function patchlistaux (line 150) | static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,
function dischargejpc (line 163) | static void dischargejpc (FuncState *fs) {
function luaK_patchlist (line 169) | void luaK_patchlist (FuncState *fs, int list, int target) {
function luaK_patchtohere (line 179) | void luaK_patchtohere (FuncState *fs, int list) {
function luaK_concat (line 185) | void luaK_concat (FuncState *fs, int *l1, int l2) {
function luaK_checkstack (line 199) | void luaK_checkstack (FuncState *fs, int n) {
function luaK_reserveregs (line 209) | void luaK_reserveregs (FuncState *fs, int n) {
function freereg (line 215) | static void freereg (FuncState *fs, int reg) {
function freeexp (line 223) | static void freeexp (FuncState *fs, expdesc *e) {
function addk (line 229) | static int addk (FuncState *fs, TValue *k, TValue *v) {
function luaK_stringK (line 250) | int luaK_stringK (FuncState *fs, TString *s) {
function luaK_numberK (line 257) | int luaK_numberK (FuncState *fs, lua_Number r) {
function boolK (line 264) | static int boolK (FuncState *fs, int b) {
function nilK (line 271) | static int nilK (FuncState *fs) {
function luaK_setreturns (line 280) | void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
function luaK_setoneret (line 292) | void luaK_setoneret (FuncState *fs, expdesc *e) {
function luaK_dischargevars (line 304) | void luaK_dischargevars (FuncState *fs, expdesc *e) {
function code_label (line 337) | static int code_label (FuncState *fs, int A, int b, int jump) {
function discharge2reg (line 343) | static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
function discharge2anyreg (line 382) | static void discharge2anyreg (FuncState *fs, expdesc *e) {
function exp2reg (line 390) | static void exp2reg (FuncState *fs, expdesc *e, int reg) {
function luaK_exp2nextreg (line 414) | void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
function luaK_exp2anyreg (line 422) | int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
function luaK_exp2val (line 436) | void luaK_exp2val (FuncState *fs, expdesc *e) {
function luaK_exp2RK (line 444) | int luaK_exp2RK (FuncState *fs, expdesc *e) {
function luaK_storevar (line 472) | void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {
function luaK_self (line 503) | void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {
function invertjump (line 516) | static void invertjump (FuncState *fs, expdesc *e) {
function jumponcond (line 524) | static int jumponcond (FuncState *fs, expdesc *e, int cond) {
function luaK_goiftrue (line 539) | void luaK_goiftrue (FuncState *fs, expdesc *e) {
function luaK_goiffalse (line 563) | static void luaK_goiffalse (FuncState *fs, expdesc *e) {
function codenot (line 586) | static void codenot (FuncState *fs, expdesc *e) {
function luaK_indexed (line 621) | void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
function constfolding (line 627) | static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {
function codearith (line 653) | static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e...
function codecomp (line 673) | static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1,
function luaK_prefix (line 689) | void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {
function luaK_infix (line 710) | void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
function luaK_posfix (line 737) | void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
function luaK_fixline (line 784) | void luaK_fixline (FuncState *fs, int line) {
function luaK_code (line 789) | static int luaK_code (FuncState *fs, Instruction i, int line) {
function luaK_codeABC (line 804) | int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {
function luaK_codeABx (line 812) | int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
function luaK_setlist (line 819) | void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/lcode.h
type BinOpr (line 26) | typedef enum BinOpr {
type UnOpr (line 36) | typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;
FILE: Chapter02/redis-6.0.3/deps/lua/src/ldblib.c
function db_getregistry (line 22) | static int db_getregistry (lua_State *L) {
function db_getmetatable (line 28) | static int db_getmetatable (lua_State *L) {
function db_setmetatable (line 37) | static int db_setmetatable (lua_State *L) {
function db_getfenv (line 47) | static int db_getfenv (lua_State *L) {
function db_setfenv (line 54) | static int db_setfenv (lua_State *L) {
function settabss (line 64) | static void settabss (lua_State *L, const char *i, const char *v) {
function settabsi (line 70) | static void settabsi (lua_State *L, const char *i, int v) {
function lua_State (line 76) | static lua_State *getthread (lua_State *L, int *arg) {
function treatstackoption (line 88) | static void treatstackoption (lua_State *L, lua_State *L1, const char *f...
function db_getinfo (line 99) | static int db_getinfo (lua_State *L) {
function db_getlocal (line 144) | static int db_getlocal (lua_State *L) {
function db_setlocal (line 165) | static int db_setlocal (lua_State *L) {
function auxupvalue (line 179) | static int auxupvalue (lua_State *L, int get) {
function db_getupvalue (line 192) | static int db_getupvalue (lua_State *L) {
function db_setupvalue (line 197) | static int db_setupvalue (lua_State *L) {
function hookf (line 207) | static void hookf (lua_State *L, lua_Debug *ar) {
function makemask (line 225) | static int makemask (const char *smask, int count) {
function gethooktable (line 245) | static void gethooktable (lua_State *L) {
function db_sethook (line 258) | static int db_sethook (lua_State *L) {
function db_gethook (line 282) | static int db_gethook (lua_State *L) {
function db_debug (line 302) | static int db_debug (lua_State *L) {
function db_errorfb (line 322) | static int db_errorfb (lua_State *L) {
function LUALIB_API (line 394) | LUALIB_API int luaopen_debug (lua_State *L) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/ldebug.c
function currentpc (line 36) | static int currentpc (lua_State *L, CallInfo *ci) {
function currentline (line 44) | static int currentline (lua_State *L, CallInfo *ci) {
function LUA_API (line 56) | LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int coun...
function LUA_API (line 69) | LUA_API lua_Hook lua_gethook (lua_State *L) {
function LUA_API (line 74) | LUA_API int lua_gethookmask (lua_State *L) {
function LUA_API (line 79) | LUA_API int lua_gethookcount (lua_State *L) {
function LUA_API (line 84) | LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
function Proto (line 107) | static Proto *getluaproto (CallInfo *ci) {
function LUA_API (line 127) | LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int...
function LUA_API (line 138) | LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int...
function funcinfo (line 150) | static void funcinfo (lua_Debug *ar, Closure *cl) {
function info_tailcall (line 167) | static void info_tailcall (lua_Debug *ar) {
function collectvalidlines (line 177) | static void collectvalidlines (lua_State *L, Closure *f) {
function auxgetinfo (line 193) | static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
function LUA_API (line 232) | LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
function precheck (line 276) | static int precheck (const Proto *pt) {
function luaG_checkopenop (line 290) | int luaG_checkopenop (Instruction i) {
function checkArgMode (line 304) | static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) {
function Instruction (line 317) | static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
function luaG_checkcode (line 484) | int luaG_checkcode (const Proto *pt) {
function isinstack (line 559) | static int isinstack (CallInfo *ci, const TValue *o) {
function luaG_typeerror (line 567) | void luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
function luaG_concaterror (line 581) | void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {
function luaG_aritherror (line 588) | void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) {
function luaG_ordererror (line 596) | int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {
function addinfo (line 607) | static void addinfo (lua_State *L, const char *msg) {
function luaG_errormsg (line 618) | void luaG_errormsg (lua_State *L) {
function luaG_runerror (line 631) | void luaG_runerror (lua_State *L, const char *fmt, ...) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/ldo.c
type lua_longjmp (line 44) | struct lua_longjmp {
function luaD_seterrorobj (line 51) | void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
function restore_stack_limit (line 71) | static void restore_stack_limit (lua_State *L) {
function resetstack (line 81) | static void resetstack (lua_State *L, int status) {
function luaD_throw (line 94) | void luaD_throw (lua_State *L, int errcode) {
function luaD_rawrunprotected (line 111) | int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
function correctstack (line 126) | static void correctstack (lua_State *L, TValue *oldstack) {
function luaD_reallocstack (line 141) | void luaD_reallocstack (lua_State *L, int newsize) {
function luaD_reallocCI (line 152) | void luaD_reallocCI (lua_State *L, int newsize) {
function luaD_growstack (line 161) | void luaD_growstack (lua_State *L, int n) {
function CallInfo (line 169) | static CallInfo *growCI (lua_State *L) {
function luaD_callhook (line 181) | void luaD_callhook (lua_State *L, int event, int line) {
function StkId (line 208) | static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
function StkId (line 244) | static StkId tryfuncTM (lua_State *L, StkId func) {
function luaD_precall (line 265) | int luaD_precall (lua_State *L, StkId func, int nresults) {
function StkId (line 332) | static StkId callrethooks (lua_State *L, StkId firstResult) {
function luaD_poscall (line 343) | int luaD_poscall (lua_State *L, StkId firstResult) {
function luaD_call (line 370) | void luaD_call (lua_State *L, StkId func, int nResults) {
function resume (line 384) | static void resume (lua_State *L, void *ud) {
function resume_error (line 409) | static int resume_error (lua_State *L, const char *msg) {
function LUA_API (line 418) | LUA_API int lua_resume (lua_State *L, int nargs) {
function LUA_API (line 444) | LUA_API int lua_yield (lua_State *L, int nresults) {
function luaD_pcall (line 456) | int luaD_pcall (lua_State *L, Pfunc func, void *u,
type SParser (line 485) | struct SParser { /* data to `f_parser' */
function f_parser (line 491) | static void f_parser (lua_State *L, void *ud) {
function luaD_protectedparser (line 509) | int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/ldump.c
type DumpState (line 18) | typedef struct {
function DumpBlock (line 29) | static void DumpBlock(const void* b, size_t size, DumpState* D)
function DumpChar (line 39) | static void DumpChar(int y, DumpState* D)
function DumpInt (line 45) | static void DumpInt(int x, DumpState* D)
function DumpNumber (line 50) | static void DumpNumber(lua_Number x, DumpState* D)
function DumpVector (line 55) | static void DumpVector(const void* b, int n, size_t size, DumpState* D)
function DumpString (line 61) | static void DumpString(const TString* s, DumpState* D)
function DumpConstants (line 80) | static void DumpConstants(const Proto* f, DumpState* D)
function DumpDebug (line 111) | static void DumpDebug(const Proto* f, DumpState* D)
function DumpFunction (line 129) | static void DumpFunction(const Proto* f, const TString* p, DumpState* D)
function DumpHeader (line 143) | static void DumpHeader(DumpState* D)
function luaU_dump (line 153) | int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, i...
FILE: Chapter02/redis-6.0.3/deps/lua/src/lfunc.c
function Closure (line 23) | Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) {
function Closure (line 33) | Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) {
function UpVal (line 44) | UpVal *luaF_newupval (lua_State *L) {
function UpVal (line 53) | UpVal *luaF_findupval (lua_State *L, StkId level) {
function unlinkupval (line 82) | static void unlinkupval (UpVal *uv) {
function luaF_freeupval (line 89) | void luaF_freeupval (lua_State *L, UpVal *uv) {
function luaF_close (line 96) | void luaF_close (lua_State *L, StkId level) {
function Proto (line 115) | Proto *luaF_newproto (lua_State *L) {
function luaF_freeproto (line 141) | void luaF_freeproto (lua_State *L, Proto *f) {
function luaF_freeclosure (line 152) | void luaF_freeclosure (lua_State *L, Closure *c) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/lgc.c
function removeentry (line 62) | static void removeentry (Node *n) {
function reallymarkobject (line 69) | static void reallymarkobject (global_State *g, GCObject *o) {
function marktmu (line 115) | static void marktmu (global_State *g) {
function luaC_separateudata (line 128) | size_t luaC_separateudata (lua_State *L, int all) {
function traversetable (line 158) | static int traversetable (global_State *g, Table *h) {
function traverseproto (line 203) | static void traverseproto (global_State *g, Proto *f) {
function traverseclosure (line 224) | static void traverseclosure (global_State *g, Closure *cl) {
function checkstacksizes (line 241) | static void checkstacksizes (lua_State *L, StkId max) {
function traversestack (line 256) | static void traversestack (global_State *g, lua_State *l) {
function l_mem (line 277) | static l_mem propagatemark (global_State *g) {
function propagateall (line 323) | static size_t propagateall (global_State *g) {
function iscleared (line 337) | static int iscleared (const TValue *o, int iskey) {
function cleartable (line 351) | static void cleartable (GCObject *l) {
function freeobj (line 378) | static void freeobj (lua_State *L, GCObject *o) {
function GCObject (line 407) | static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {
function checkSizes (line 431) | static void checkSizes (lua_State *L) {
function GCTM (line 445) | static void GCTM (lua_State *L) {
function luaC_callGCTM (line 477) | void luaC_callGCTM (lua_State *L) {
function luaC_freeall (line 483) | void luaC_freeall (lua_State *L) {
function markmt (line 493) | static void markmt (global_State *g) {
function markroot (line 501) | static void markroot (lua_State *L) {
function remarkupvals (line 515) | static void remarkupvals (global_State *g) {
function atomic (line 525) | static void atomic (lua_State *L) {
function l_mem (line 556) | static l_mem singlestep (lua_State *L) {
function luaC_step (line 610) | void luaC_step (lua_State *L) {
function luaC_fullgc (line 635) | void luaC_fullgc (lua_State *L) {
function luaC_barrierf (line 661) | void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) {
function luaC_barrierback (line 674) | void luaC_barrierback (lua_State *L, Table *t) {
function luaC_link (line 685) | void luaC_link (lua_State *L, GCObject *o, lu_byte tt) {
function luaC_linkupval (line 694) | void luaC_linkupval (lua_State *L, UpVal *uv) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/linit.c
function LUALIB_API (line 30) | LUALIB_API void luaL_openlibs (lua_State *L) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/liolib.c
function pushresult (line 30) | static int pushresult (lua_State *L, int i, const char *filename) {
function fileerror (line 48) | static void fileerror (lua_State *L, int arg, const char *filename) {
function io_type (line 57) | static int io_type (lua_State *L) {
function FILE (line 72) | static FILE *tofile (lua_State *L) {
function FILE (line 86) | static FILE **newfile (lua_State *L) {
function io_noclose (line 98) | static int io_noclose (lua_State *L) {
function io_pclose (line 108) | static int io_pclose (lua_State *L) {
function io_fclose (line 119) | static int io_fclose (lua_State *L) {
function aux_close (line 127) | static int aux_close (lua_State *L) {
function io_close (line 134) | static int io_close (lua_State *L) {
function io_gc (line 142) | static int io_gc (lua_State *L) {
function io_tostring (line 151) | static int io_tostring (lua_State *L) {
function io_open (line 161) | static int io_open (lua_State *L) {
function io_popen (line 174) | static int io_popen (lua_State *L) {
function io_tmpfile (line 183) | static int io_tmpfile (lua_State *L) {
function FILE (line 190) | static FILE *getiofile (lua_State *L, int findex) {
function g_iofile (line 200) | static int g_iofile (lua_State *L, int f, const char *mode) {
function io_input (line 221) | static int io_input (lua_State *L) {
function io_output (line 226) | static int io_output (lua_State *L) {
function aux_lines (line 234) | static void aux_lines (lua_State *L, int idx, int toclose) {
function f_lines (line 241) | static int f_lines (lua_State *L) {
function io_lines (line 248) | static int io_lines (lua_State *L) {
function read_number (line 273) | static int read_number (lua_State *L, FILE *f) {
function test_eof (line 286) | static int test_eof (lua_State *L, FILE *f) {
function read_line (line 294) | static int read_line (lua_State *L, FILE *f) {
function read_chars (line 316) | static int read_chars (lua_State *L, FILE *f, size_t n) {
function g_read (line 334) | static int g_read (lua_State *L, FILE *f, int first) {
function io_read (line 381) | static int io_read (lua_State *L) {
function f_read (line 386) | static int f_read (lua_State *L) {
function io_readline (line 391) | static int io_readline (lua_State *L) {
function g_write (line 413) | static int g_write (lua_State *L, FILE *f, int arg) {
function io_write (line 432) | static int io_write (lua_State *L) {
function f_write (line 437) | static int f_write (lua_State *L) {
function f_seek (line 442) | static int f_seek (lua_State *L) {
function f_setvbuf (line 458) | static int f_setvbuf (lua_State *L) {
function io_flush (line 470) | static int io_flush (lua_State *L) {
function f_flush (line 475) | static int f_flush (lua_State *L) {
function createmeta (line 510) | static void createmeta (lua_State *L) {
function createstdfile (line 518) | static void createstdfile (lua_State *L, FILE *f, int k, const char *fna...
function newfenv (line 530) | static void newfenv (lua_State *L, lua_CFunction cls) {
function LUALIB_API (line 537) | LUALIB_API int luaopen_io (lua_State *L) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/llex.c
function save (line 51) | static void save (LexState *ls, int c) {
function luaX_init (line 64) | void luaX_init (lua_State *L) {
function luaX_lexerror (line 102) | void luaX_lexerror (LexState *ls, const char *msg, int token) {
function luaX_syntaxerror (line 112) | void luaX_syntaxerror (LexState *ls, const char *msg) {
function TString (line 117) | TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
function inclinenumber (line 129) | static void inclinenumber (LexState *ls) {
function luaX_setinput (line 140) | void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) {
function check_next (line 163) | static int check_next (LexState *ls, const char *set) {
function buffreplace (line 171) | static void buffreplace (LexState *ls, char from, char to) {
function trydecpoint (line 179) | static void trydecpoint (LexState *ls, SemInfo *seminfo) {
function read_numeral (line 194) | static void read_numeral (LexState *ls, SemInfo *seminfo) {
function skip_sep (line 210) | static int skip_sep (LexState *ls) {
function read_long_string (line 223) | static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
function read_string (line 278) | static void read_string (LexState *ls, int del, SemInfo *seminfo) {
function llex (line 334) | static int llex (LexState *ls, SemInfo *seminfo) {
function luaX_next (line 448) | void luaX_next (LexState *ls) {
function luaX_lookahead (line 459) | void luaX_lookahead (LexState *ls) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/llex.h
type RESERVED (line 24) | enum RESERVED {
type SemInfo (line 43) | typedef union {
type Token (line 49) | typedef struct Token {
type LexState (line 55) | typedef struct LexState {
FILE: Chapter02/redis-6.0.3/deps/lua/src/llimits.h
type LUAI_UINT32 (line 18) | typedef LUAI_UINT32 lu_int32;
type LUAI_UMEM (line 20) | typedef LUAI_UMEM lu_mem;
type LUAI_MEM (line 22) | typedef LUAI_MEM l_mem;
type lu_byte (line 27) | typedef unsigned char lu_byte;
type LUAI_USER_ALIGNMENT_T (line 47) | typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
type LUAI_UACNUMBER (line 51) | typedef LUAI_UACNUMBER l_uacNumber;
type lu_int32 (line 88) | typedef lu_int32 Instruction;
FILE: Chapter02/redis-6.0.3/deps/lua/src/lmathlib.c
function math_abs (line 26) | static int math_abs (lua_State *L) {
function math_sin (line 31) | static int math_sin (lua_State *L) {
function math_sinh (line 36) | static int math_sinh (lua_State *L) {
function math_cos (line 41) | static int math_cos (lua_State *L) {
function math_cosh (line 46) | static int math_cosh (lua_State *L) {
function math_tan (line 51) | static int math_tan (lua_State *L) {
function math_tanh (line 56) | static int math_tanh (lua_State *L) {
function math_asin (line 61) | static int math_asin (lua_State *L) {
function math_acos (line 66) | static int math_acos (lua_State *L) {
function math_atan (line 71) | static int math_atan (lua_State *L) {
function math_atan2 (line 76) | static int math_atan2 (lua_State *L) {
function math_ceil (line 81) | static int math_ceil (lua_State *L) {
function math_floor (line 86) | static int math_floor (lua_State *L) {
function math_fmod (line 91) | static int math_fmod (lua_State *L) {
function math_modf (line 96) | static int math_modf (lua_State *L) {
function math_sqrt (line 104) | static int math_sqrt (lua_State *L) {
function math_pow (line 109) | static int math_pow (lua_State *L) {
function math_log (line 114) | static int math_log (lua_State *L) {
function math_log10 (line 119) | static int math_log10 (lua_State *L) {
function math_exp (line 124) | static int math_exp (lua_State *L) {
function math_deg (line 129) | static int math_deg (lua_State *L) {
function math_rad (line 134) | static int math_rad (lua_State *L) {
function math_frexp (line 139) | static int math_frexp (lua_State *L) {
function math_ldexp (line 146) | static int math_ldexp (lua_State *L) {
function math_min (line 153) | static int math_min (lua_State *L) {
function math_max (line 167) | static int math_max (lua_State *L) {
function math_random (line 181) | static int math_random (lua_State *L) {
function math_randomseed (line 209) | static int math_randomseed (lua_State *L) {
function LUALIB_API (line 251) | LUALIB_API int luaopen_math (lua_State *L) {
FILE: Chapter02/redis-6.0.3/deps/lua/src/loadlib.c
function ll_unloadli
Copy disabled (too large)
Download .json
Condensed preview — 1918 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (20,402K chars).
[
{
"path": ".gitignore",
"chars": 182,
"preview": ".DS_Store\nChapter01/.DS_Store\nChapter02/.DS_Store\nChapter03/.DS_Store\nChapter04/.DS_Store\nChapter06/.DS_Store\nChapter07/"
},
{
"path": "Chapter01/codes/TestRAII1/ReadMe.txt",
"chars": 1729,
"preview": "========================================================================\r\n CONSOLE APPLICATION : TestRAII1 Project Ov"
},
{
"path": "Chapter01/codes/TestRAII1/TestRAII1.cpp",
"chars": 2076,
"preview": "// #include <winsock2.h>\r\n// #include <stdio.h>\r\n\r\n// //链接Windows的socket库\r\n// #pragma comment(lib, \"ws2_32.lib\")\r\n\r\n// i"
},
{
"path": "Chapter01/codes/TestRAII1/TestRAII1.sln",
"chars": 961,
"preview": "\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 2013\r\nVisualStudioVersion = 12.0.30501.0"
},
{
"path": "Chapter01/codes/TestRAII1/TestRAII1.vcxproj",
"chars": 4598,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.micro"
},
{
"path": "Chapter01/codes/TestRAII1/TestRAII1.vcxproj.filters",
"chars": 1622,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbui"
},
{
"path": "Chapter01/codes/TestRAII1/TestRAII2.cpp",
"chars": 2191,
"preview": "// #include \"stdafx.h\"\r\n// #include <winsock2.h>\r\n// #include <stdio.h>\r\n\r\n// //链接Windows的socket库\r\n// #pragma comment(li"
},
{
"path": "Chapter01/codes/TestRAII1/TestRAII3.cpp",
"chars": 3794,
"preview": "#include \"stdafx.h\"\r\n//#include <winsock2.h>\r\n//#include <stdio.h>\r\n//\r\n////Windowssocket\r\n//#pragma comment(lib, \"ws2_3"
},
{
"path": "Chapter01/codes/TestRAII1/TestRAII4.cpp",
"chars": 3546,
"preview": "#include <winsock2.h>\r\n#include <stdio.h>\r\n\r\n//链接Windows的socket库\r\n#pragma comment(lib, \"ws2_32.lib\")\r\n\r\nclass ServerSock"
},
{
"path": "Chapter01/codes/TestRAII1/stdafx.cpp",
"chars": 296,
"preview": "// stdafx.cpp : source file that includes just the standard includes\r\n// TestRAII1.pch will be the pre-compiled header\r\n"
},
{
"path": "Chapter01/codes/TestRAII1/stdafx.h",
"chars": 320,
"preview": "// stdafx.h : include file for standard system include files,\r\n// or project specific include files that are used freque"
},
{
"path": "Chapter01/codes/TestRAII1/targetver.h",
"chars": 314,
"preview": "#pragma once\r\n\r\n// Including SDKDDKVer.h defines the highest available Windows platform.\r\n\r\n// If you wish to build your"
},
{
"path": "Chapter01/codes/construct_complex_objects.cpp",
"chars": 1926,
"preview": "// construct_complex_objects.cpp : 此文件包含 \"main\" 函数。程序执行将在此处开始并结束。\r\n//\r\n\r\n#include <iostream>\r\n#include <string>\r\n#inclu"
},
{
"path": "Chapter01/codes/test_auto_ptr.cpp",
"chars": 1079,
"preview": "// test_auto_ptr.cpp : This file contains the 'main' function. Program execution begins and ends there.\r\n//\r\n\r\n#include "
},
{
"path": "Chapter01/codes/test_custom_foreach_loop.cpp",
"chars": 546,
"preview": "#include <iostream>\r\n#include <string>\r\n\r\ntemplate<typename T, size_t N>\r\nclass A\r\n{\r\npublic:\r\n A()\r\n {\r\n f"
},
{
"path": "Chapter01/codes/test_initializer_list.cpp",
"chars": 851,
"preview": "#include <iostream>\r\n#include <initializer_list>\r\n#include <vector>\r\n\r\nclass A\r\n{\r\npublic:\r\n A(std::initializer_list<"
},
{
"path": "Chapter01/codes/test_map_insert_or_assign.cpp",
"chars": 1372,
"preview": "/** \r\n * std::map::try_emplace÷ʾ\r\n * zhangyl 2019.10.06\r\n */\r\n\r\n#include <iostream>\r\n#include <map>\r\n\r\nclass ChatDialog\r"
},
{
"path": "Chapter01/codes/test_map_try_emplace.cpp",
"chars": 1283,
"preview": "// test_map_try_emplace.cpp : This file contains the 'main' function. Program execution begins and ends there.\r\n//\r\n\r\n#i"
},
{
"path": "Chapter01/codes/test_map_try_emplace_with_directobject.cpp",
"chars": 994,
"preview": "/** \r\n * std::map::try_emplace÷ʾ\r\n * zhangyl 2019.10.06\r\n */\r\n\r\n#include <iostream>\r\n#include <map>\r\n\r\nclass ChatDialog\r"
},
{
"path": "Chapter01/codes/test_map_try_emplace_with_smartpointer.cpp",
"chars": 1024,
"preview": "/** \r\n * std::map::try_emplace÷ʾ\r\n * zhangyl 2019.10.06\r\n */\r\n\r\n#include <iostream>\r\n#include <map>\r\n#include <memory>\r\n"
},
{
"path": "Chapter01/codes/test_map_try_emplace_with_smartpointer2.cpp",
"chars": 1114,
"preview": "/** \r\n * std::map::try_emplace÷ʾ\r\n * zhangyl 2019.10.06\r\n */\r\n\r\n#include <iostream>\r\n#include <map>\r\n#include <memory>\r\n"
},
{
"path": "Chapter01/codes/test_shared_ptr_use_count.cpp",
"chars": 948,
"preview": "// test_shared_ptr.cpp : This file contains the 'main' function. Program execution begins and ends there.\r\n//\r\n\r\n#includ"
},
{
"path": "Chapter01/codes/test_std_enable_shared_from_this.cpp",
"chars": 579,
"preview": "// test_std_enable_shared_from_this.cpp\r\n#include <iostream>\r\n#include <memory>\r\n\r\nclass A : public std::enable_shared_f"
},
{
"path": "Chapter01/codes/test_std_enable_shared_from_this_problem.cpp",
"chars": 736,
"preview": "// test_std_enable_shared_from_this.cpp : This file contains the 'main' function. Program execution begins and ends ther"
},
{
"path": "Chapter01/codes/test_unique_ptr.cpp",
"chars": 654,
"preview": "// test_unique_ptr.cpp : This file contains the 'main' function. Program execution begins and ends there.\r\n//\r\n\r\n#includ"
},
{
"path": "Chapter01/codes/test_unique_ptr_deletor.cpp",
"chars": 530,
"preview": "#include <iostream>\r\n#include <memory>\r\n\r\nclass Socket\r\n{\r\npublic:\r\n Socket()\r\n {\r\n\r\n }\r\n\r\n ~Socket()\r\n {"
},
{
"path": "Chapter01/codes/test_unique_ptr_with_array.cpp",
"chars": 521,
"preview": "#include <iostream>\n#include <memory>\n\nint main()\n{\n //创建10个int类型的堆对象\n //形式1\n std::unique_ptr<int[]> sp1(new in"
},
{
"path": "Chapter01/codes/test_weak_ptr.cpp",
"chars": 717,
"preview": "// test_weak_ptr.cpp : This file contains the 'main' function. Program execution begins and ends there.\r\n//\r\n\r\n#include "
},
{
"path": "Chapter02/VisualGDB 下载与安装.md",
"chars": 149,
"preview": "# VisualGDB 下载与安装\n\n## VisualGDB 官网\n\n```\nhttps://visualgdb.com/\n```\n\n\n\n## 网络上流传的破解版\n\n> 链接: https://pan.baidu.com/s/1RlefT"
},
{
"path": "Chapter02/cgdb下载与安装.md",
"chars": 1034,
"preview": "# cgdb 下载与安装\n\n**下载地址**\n\n```\nhttp://cgdb.github.io/\n```\n\n\n\n下载完 cgdb 之后,进入 cgdb 目录,执行:\n\n```\n$ ./configure --prefix=/usr/lo"
},
{
"path": "Chapter02/codes/main.cpp",
"chars": 708,
"preview": "#include <stdio.h>\n#include <pthread.h>\n#include <unistd.h>\n\nlong g = 0;\n\nvoid* worker_thread_1(void* p)\n{\n\twhile (true)"
},
{
"path": "Chapter02/redis-6.0.3/.github/workflows/ci.yml",
"chars": 578,
"preview": "name: CI\n\non: [push, pull_request]\n\njobs:\n test-ubuntu-latest:\n runs-on: ubuntu-latest\n steps:\n - uses: action"
},
{
"path": "Chapter02/redis-6.0.3/.github/workflows/daily.yml",
"chars": 1094,
"preview": "name: Daily\n\non:\n schedule:\n - cron: '0 7 * * *'\n\njobs:\n test-jemalloc:\n runs-on: ubuntu-latest\n timeout-minu"
},
{
"path": "Chapter02/redis-6.0.3/.gitignore",
"chars": 408,
"preview": ".*.swp\n*.o\n*.xo\n*.so\n*.d\n*.log\ndump.rdb\nredis-benchmark\nredis-check-aof\nredis-check-rdb\nredis-check-dump\nredis-cli\nredis"
},
{
"path": "Chapter02/redis-6.0.3/00-RELEASENOTES",
"chars": 59588,
"preview": "Redis 6.0 release notes\n=======================\n\n-----------------------------------------------------------------------"
},
{
"path": "Chapter02/redis-6.0.3/BUGS",
"chars": 53,
"preview": "Please check https://github.com/antirez/redis/issues\n"
},
{
"path": "Chapter02/redis-6.0.3/CONTRIBUTING",
"chars": 2381,
"preview": "Note: by contributing code to the Redis project in any form, including sending\na pull request via Github, a code fragmen"
},
{
"path": "Chapter02/redis-6.0.3/COPYING",
"chars": 1487,
"preview": "Copyright (c) 2006-2015, Salvatore Sanfilippo\nAll rights reserved.\n\nRedistribution and use in source and binary forms, w"
},
{
"path": "Chapter02/redis-6.0.3/INSTALL",
"chars": 11,
"preview": "See README\n"
},
{
"path": "Chapter02/redis-6.0.3/MANIFESTO",
"chars": 6888,
"preview": "[Note: this is the Redis manifesto, for general information about\n installing and running Redis read the README fi"
},
{
"path": "Chapter02/redis-6.0.3/Makefile",
"chars": 151,
"preview": "# Top level makefile, the real shit is at src/Makefile\n\ndefault: all\n\n.DEFAULT:\n\tcd src && $(MAKE) $@\n\ninstall:\n\tcd src "
},
{
"path": "Chapter02/redis-6.0.3/README.md",
"chars": 20812,
"preview": "This README is just a fast *quick start* document. You can find more detailed documentation at [redis.io](https://redis."
},
{
"path": "Chapter02/redis-6.0.3/TLS.md",
"chars": 3167,
"preview": "TLS Support\n===========\n\nGetting Started\n---------------\n\n### Building\n\nTo build with TLS support you'll need OpenSSL de"
},
{
"path": "Chapter02/redis-6.0.3/deps/Makefile",
"chars": 2632,
"preview": "# Redis dependency Makefile\n\nuname_S:= $(shell sh -c 'uname -s 2>/dev/null || echo not')\n\nCCCOLOR=\"\\033[34m\"\nLINKCOLOR=\""
},
{
"path": "Chapter02/redis-6.0.3/deps/README.md",
"chars": 4413,
"preview": "This directory contains all Redis dependencies, except for the libc that\nshould be provided by the operating system.\n\n* "
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/.gitignore",
"chars": 79,
"preview": "/hiredis-test\n/examples/hiredis-example*\n/*.o\n/*.so\n/*.dylib\n/*.a\n/*.pc\n*.dSYM\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/.travis.yml",
"chars": 2230,
"preview": "language: c\nsudo: false\ncompiler:\n - gcc\n - clang\n\nos:\n - linux\n - osx\n\nbranches:\n only:\n - staging\n - trying"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/CHANGELOG.md",
"chars": 7997,
"preview": "### 1.0.0 (unreleased)\n\n**BREAKING CHANGES**:\n\n* Bulk and multi-bulk lengths less than -1 or greater than `LLONG_MAX` ar"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/CMakeLists.txt",
"chars": 2517,
"preview": "CMAKE_MINIMUM_REQUIRED(VERSION 3.4.0)\nINCLUDE(GNUInstallDirs)\nPROJECT(hiredis)\n\nOPTION(ENABLE_SSL \"Build hiredis_ssl for"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/COPYING",
"chars": 1588,
"preview": "Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\nCopyright (c) 2010-2011, Pieter Noordhuis <pcno"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/Makefile",
"chars": 9849,
"preview": "# Hiredis Makefile\n# Copyright (C) 2010-2011 Salvatore Sanfilippo <antirez at gmail dot com>\n# Copyright (C) 2010-2011 P"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/README.md",
"chars": 18376,
"preview": "[](https://travis-ci.org/redis/hiredis)\n\n**This Readme reflects "
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/adapters/ae.h",
"chars": 4219,
"preview": "/*\n * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>\n *\n * All rights reserved.\n *\n * Redistri"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/adapters/glib.h",
"chars": 3808,
"preview": "#ifndef __HIREDIS_GLIB_H__\n#define __HIREDIS_GLIB_H__\n\n#include <glib.h>\n\n#include \"../hiredis.h\"\n#include \"../async.h\"\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/adapters/ivykis.h",
"chars": 2275,
"preview": "#ifndef __HIREDIS_IVYKIS_H__\n#define __HIREDIS_IVYKIS_H__\n#include <iv.h>\n#include \"../hiredis.h\"\n#include \"../async.h\"\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/adapters/libev.h",
"chars": 4587,
"preview": "/*\n * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>\n *\n * All rights reserved.\n *\n * Redistri"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/adapters/libevent.h",
"chars": 5549,
"preview": "/*\n * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>\n *\n * All rights reserved.\n *\n * Redistri"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/adapters/libuv.h",
"chars": 2565,
"preview": "#ifndef __HIREDIS_LIBUV_H__\n#define __HIREDIS_LIBUV_H__\n#include <stdlib.h>\n#include <uv.h>\n#include \"../hiredis.h\"\n#inc"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/adapters/macosx.h",
"chars": 3850,
"preview": "//\n// Created by Дмитрий Бахвалов on 13.07.15.\n// Copyright (c) 2015 Dmitry Bakhvalov. All rights reserved.\n//\n\n#ifnde"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/adapters/qt.h",
"chars": 4233,
"preview": "/*-\n * Copyright (C) 2014 Pietro Cerutti <gahr@gahr.ch>\n *\n * Redistribution and use in source and binary forms, with or"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/appveyor.yml",
"chars": 743,
"preview": "# Appveyor configuration file for CI build of hiredis on Windows (under Cygwin)\nenvironment:\n matrix:\n - CYG_B"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/async.c",
"chars": 25388,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/async.h",
"chars": 5821,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/async_private.h",
"chars": 3374,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/dict.c",
"chars": 10551,
"preview": "/* Hash table implementation.\n *\n * This file implements in memory hash tables with insert/del/replace/find/\n * get-rand"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/dict.h",
"chars": 4691,
"preview": "/* Hash table implementation.\n *\n * This file implements in memory hash tables with insert/del/replace/find/\n * get-rand"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/CMakeLists.txt",
"chars": 1238,
"preview": "INCLUDE(FindPkgConfig)\n# Check for GLib\n\nPKG_CHECK_MODULES(GLIB2 glib-2.0)\nif (GLIB2_FOUND)\n INCLUDE_DIRECTORIES(${GL"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-ae.c",
"chars": 1583,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <async.h>\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-glib.c",
"chars": 1632,
"preview": "#include <stdlib.h>\n\n#include <hiredis.h>\n#include <async.h>\n#include <adapters/glib.h>\n\nstatic GMainLoop *mainloop;\n\nst"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-ivykis.c",
"chars": 1418,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <async.h>\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-libev.c",
"chars": 1405,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <async.h>\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-libevent-ssl.c",
"chars": 1999,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <hiredis_s"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-libevent.c",
"chars": 1719,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <async.h>\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-libuv.c",
"chars": 1445,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <async.h>\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-macosx.c",
"chars": 1639,
"preview": "//\n// Created by Дмитрий Бахвалов on 13.07.15.\n// Copyright (c) 2015 Dmitry Bakhvalov. All rights reserved.\n//\n\n#inclu"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-qt.cpp",
"chars": 1047,
"preview": "#include <iostream>\nusing namespace std;\n\n#include <QCoreApplication>\n#include <QTimer>\n\n#include \"example-qt.h\"\n\nvoid g"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-qt.h",
"chars": 620,
"preview": "#ifndef __HIREDIS_EXAMPLE_QT_H\n#define __HIREDIS_EXAMPLE_QT_H\n\n#include <adapters/qt.h>\n\nclass ExampleQt : public QObjec"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example-ssl.c",
"chars": 2764,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <hiredis.h>\n#include <hiredis_ssl.h>\n\nint main(int "
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/examples/example.c",
"chars": 2596,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <hiredis.h>\n\nint main(int argc, char **argv) {\n "
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/fmacros.h",
"chars": 225,
"preview": "#ifndef __HIREDIS_FMACRO_H\n#define __HIREDIS_FMACRO_H\n\n#define _XOPEN_SOURCE 600\n#define _POSIX_C_SOURCE 200112L\n\n#if de"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/hiredis.c",
"chars": 32709,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2014, Pieter Noordh"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/hiredis.h",
"chars": 11234,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2014, Pieter Noordh"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/hiredis.pc.in",
"chars": 317,
"preview": "prefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=${prefix}\nlibdir=${exec_prefix}/lib\nincludedir=${prefix}/include\npkgincludedir"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/hiredis_ssl.h",
"chars": 2186,
"preview": "\n/*\n * Copyright (c) 2019, Redis Labs\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/hiredis_ssl.pc.in",
"chars": 306,
"preview": "prefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=${prefix}\nlibdir=${exec_prefix}/lib\nincludedir=${prefix}/include\npkgincludedir"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/net.c",
"chars": 17884,
"preview": "/* Extracted from anet.c to work properly with Hiredis error reporting.\n *\n * Copyright (c) 2009-2011, Salvatore Sanfili"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/net.h",
"chars": 2712,
"preview": "/* Extracted from anet.c to work properly with Hiredis error reporting.\n *\n * Copyright (c) 2009-2011, Salvatore Sanfili"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/read.c",
"chars": 20493,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/read.h",
"chars": 4747,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/sds.c",
"chars": 40335,
"preview": "/* SDSLib 2.0 -- A C dynamic strings library\n *\n * Copyright (c) 2006-2015, Salvatore Sanfilippo <antirez at gmail dot c"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/sds.h",
"chars": 9144,
"preview": "/* SDSLib 2.0 -- A C dynamic strings library\n *\n * Copyright (c) 2006-2015, Salvatore Sanfilippo <antirez at gmail dot c"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/sdsalloc.h",
"chars": 2092,
"preview": "/* SDSLib 2.0 -- A C dynamic strings library\n *\n * Copyright (c) 2006-2015, Salvatore Sanfilippo <antirez at gmail dot c"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/sockcompat.c",
"chars": 8966,
"preview": "/*\n * Copyright (c) 2019, Marcus Geelnard <m at bitsnbites dot eu>\n *\n * All rights reserved.\n *\n * Redistribution and u"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/sockcompat.h",
"chars": 4312,
"preview": "/*\n * Copyright (c) 2019, Marcus Geelnard <m at bitsnbites dot eu>\n *\n * All rights reserved.\n *\n * Redistribution and u"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/ssl.c",
"chars": 12745,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/test.c",
"chars": 35517,
"preview": "#include \"fmacros.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <strings.h>\n#include <sys/socke"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/test.sh",
"chars": 1764,
"preview": "#!/bin/sh -ue\n\nREDIS_SERVER=${REDIS_SERVER:-redis-server}\nREDIS_PORT=${REDIS_PORT:-56379}\nREDIS_SSL_PORT=${REDIS_SSL_POR"
},
{
"path": "Chapter02/redis-6.0.3/deps/hiredis/win32.h",
"chars": 1042,
"preview": "#ifndef _WIN32_HELPER_INCLUDE\n#define _WIN32_HELPER_INCLUDE\n#ifdef _MSC_VER\n\n#include <winsock2.h> /* for struct timeval"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/.appveyor.yml",
"chars": 985,
"preview": "version: '{build}'\n\nenvironment:\n matrix:\n - MSYSTEM: MINGW64\n CPU: x86_64\n MSVC: amd64\n - MSYSTEM: MINGW32\n "
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/.autom4te.cfg",
"chars": 107,
"preview": "begin-language: \"Autoconf-without-aclocal-m4\"\nargs: --no-cache\nend-language: \"Autoconf-without-aclocal-m4\"\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/.gitattributes",
"chars": 19,
"preview": "* text=auto eol=lf\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/.gitignore",
"chars": 1913,
"preview": "/bin/jemalloc-config\n/bin/jemalloc.sh\n/bin/jeprof\n\n/config.stamp\n/config.log\n/config.status\n/configure\n\n/doc/html.xsl\n/d"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/.travis.yml",
"chars": 8862,
"preview": "language: generic\ndist: precise\n\nmatrix:\n include:\n - os: linux\n env: CC=gcc CXX=g++ COMPILER_FLAGS=\"\" CONFIGUR"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/COPYING",
"chars": 1703,
"preview": "Unless otherwise specified, files in the jemalloc source distribution are\nsubject to the following license:\n------------"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/ChangeLog",
"chars": 67526,
"preview": "Following are change highlights associated with official releases. Important\nbug fixes are all mentioned, but some inte"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/INSTALL.md",
"chars": 14947,
"preview": "Building and installing a packaged release of jemalloc can be as simple as\ntyping the following while in the root direct"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/Makefile.in",
"chars": 21316,
"preview": "# Clear out all vpaths, then set just one (default vpath) for the main build\n# directory.\nvpath\nvpath % .\n\n# Clear the d"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/README",
"chars": 1047,
"preview": "jemalloc is a general purpose malloc(3) implementation that emphasizes\nfragmentation avoidance and scalable concurrency "
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/TUNING.md",
"chars": 5920,
"preview": "This document summarizes the common approaches for performance fine tuning with\njemalloc (as of 5.1.0). The default con"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/autogen.sh",
"chars": 266,
"preview": "#!/bin/sh\n\nfor i in autoconf; do\n echo \"$i\"\n $i\n if [ $? -ne 0 ]; then\n\techo \"Error $? in $i\"\n\texit 1\n fi\ndo"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/bin/jemalloc-config.in",
"chars": 1598,
"preview": "#!/bin/sh\n\nusage() {\n\tcat <<EOF\nUsage:\n @BINDIR@/jemalloc-config <option>\nOptions:\n --help | -h : Print usage.\n --ve"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/bin/jemalloc.sh.in",
"chars": 151,
"preview": "#!/bin/sh\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\n\n@LD_PRELOAD_VAR@=${libdir}/libjemalloc.@SOREV@\nexp"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/bin/jeprof.in",
"chars": 179331,
"preview": "#! /usr/bin/env perl\n\n# Copyright (c) 1998-2007, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/build-aux/config.guess",
"chars": 43940,
"preview": "#! /bin/sh\n# Attempt to guess a canonical system name.\n# Copyright 1992-2016 Free Software Foundation, Inc.\n\ntimestamp"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/build-aux/config.sub",
"chars": 36339,
"preview": "#! /bin/sh\n# Configuration validation subroutine script.\n# Copyright 1992-2016 Free Software Foundation, Inc.\n\ntimesta"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/build-aux/install-sh",
"chars": 5585,
"preview": "#! /bin/sh\n#\n# install - install a program, script, or datafile\n# This comes from X11R5 (mit/util/scripts/install.sh).\n#"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/config.stamp.in",
"chars": 0,
"preview": ""
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/configure.ac",
"chars": 72550,
"preview": "dnl Process this file with autoconf to produce a configure script.\nAC_PREREQ(2.68)\nAC_INIT([Makefile.in])\n\nAC_CONFIG_AUX"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/doc/html.xsl.in",
"chars": 249,
"preview": "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n <xsl:import href=\"@XSLROOT@/html/docbo"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/doc/jemalloc.xml.in",
"chars": 154727,
"preview": "<?xml version='1.0' encoding='UTF-8'?>\n<?xml-stylesheet type=\"text/xsl\"\n href=\"http://docbook.sourceforge.net/rel"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/doc/manpages.xsl.in",
"chars": 207,
"preview": "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n <xsl:import href=\"@XSLROOT@/manpages/d"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/doc/stylesheet.xsl",
"chars": 415,
"preview": "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n <xsl:param name=\"funcsynopsis.style\">a"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_externs.h",
"chars": 4547,
"preview": "#ifndef JEMALLOC_INTERNAL_ARENA_EXTERNS_H\n#define JEMALLOC_INTERNAL_ARENA_EXTERNS_H\n\n#include \"jemalloc/internal/bin.h\"\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_inlines_a.h",
"chars": 1474,
"preview": "#ifndef JEMALLOC_INTERNAL_ARENA_INLINES_A_H\n#define JEMALLOC_INTERNAL_ARENA_INLINES_A_H\n\nstatic inline unsigned\narena_in"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_inlines_b.h",
"chars": 9570,
"preview": "#ifndef JEMALLOC_INTERNAL_ARENA_INLINES_B_H\n#define JEMALLOC_INTERNAL_ARENA_INLINES_B_H\n\n#include \"jemalloc/internal/jem"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_stats.h",
"chars": 6843,
"preview": "#ifndef JEMALLOC_INTERNAL_ARENA_STATS_H\n#define JEMALLOC_INTERNAL_ARENA_STATS_H\n\n#include \"jemalloc/internal/atomic.h\"\n#"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_structs_a.h",
"chars": 293,
"preview": "#ifndef JEMALLOC_INTERNAL_ARENA_STRUCTS_A_H\n#define JEMALLOC_INTERNAL_ARENA_STRUCTS_A_H\n\n#include \"jemalloc/internal/bit"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_structs_b.h",
"chars": 6693,
"preview": "#ifndef JEMALLOC_INTERNAL_ARENA_STRUCTS_B_H\n#define JEMALLOC_INTERNAL_ARENA_STRUCTS_B_H\n\n#include \"jemalloc/internal/are"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/arena_types.h",
"chars": 1477,
"preview": "#ifndef JEMALLOC_INTERNAL_ARENA_TYPES_H\n#define JEMALLOC_INTERNAL_ARENA_TYPES_H\n\n/* Maximum number of regions in one sla"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/assert.h",
"chars": 1330,
"preview": "#include \"jemalloc/internal/malloc_io.h\"\n#include \"jemalloc/internal/util.h\"\n\n/*\n * Define a custom assert() in order to"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/atomic.h",
"chars": 2466,
"preview": "#ifndef JEMALLOC_INTERNAL_ATOMIC_H\n#define JEMALLOC_INTERNAL_ATOMIC_H\n\n#define ATOMIC_INLINE static inline\n\n#if defined("
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/atomic_c11.h",
"chars": 3546,
"preview": "#ifndef JEMALLOC_INTERNAL_ATOMIC_C11_H\n#define JEMALLOC_INTERNAL_ATOMIC_C11_H\n\n#include <stdatomic.h>\n\n#define ATOMIC_IN"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/atomic_gcc_atomic.h",
"chars": 4113,
"preview": "#ifndef JEMALLOC_INTERNAL_ATOMIC_GCC_ATOMIC_H\n#define JEMALLOC_INTERNAL_ATOMIC_GCC_ATOMIC_H\n\n#include \"jemalloc/internal"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/atomic_gcc_sync.h",
"chars": 6121,
"preview": "#ifndef JEMALLOC_INTERNAL_ATOMIC_GCC_SYNC_H\n#define JEMALLOC_INTERNAL_ATOMIC_GCC_SYNC_H\n\n#define ATOMIC_INIT(...) {__VA_"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/atomic_msvc.h",
"chars": 5540,
"preview": "#ifndef JEMALLOC_INTERNAL_ATOMIC_MSVC_H\n#define JEMALLOC_INTERNAL_ATOMIC_MSVC_H\n\n#define ATOMIC_INIT(...) {__VA_ARGS__}\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/background_thread_externs.h",
"chars": 1368,
"preview": "#ifndef JEMALLOC_INTERNAL_BACKGROUND_THREAD_EXTERNS_H\n#define JEMALLOC_INTERNAL_BACKGROUND_THREAD_EXTERNS_H\n\nextern bool"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/background_thread_inlines.h",
"chars": 1962,
"preview": "#ifndef JEMALLOC_INTERNAL_BACKGROUND_THREAD_INLINES_H\n#define JEMALLOC_INTERNAL_BACKGROUND_THREAD_INLINES_H\n\nJEMALLOC_AL"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/background_thread_structs.h",
"chars": 1744,
"preview": "#ifndef JEMALLOC_INTERNAL_BACKGROUND_THREAD_STRUCTS_H\n#define JEMALLOC_INTERNAL_BACKGROUND_THREAD_STRUCTS_H\n\n/* This fil"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/base_externs.h",
"chars": 946,
"preview": "#ifndef JEMALLOC_INTERNAL_BASE_EXTERNS_H\n#define JEMALLOC_INTERNAL_BASE_EXTERNS_H\n\nextern metadata_thp_mode_t opt_metada"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/base_inlines.h",
"chars": 312,
"preview": "#ifndef JEMALLOC_INTERNAL_BASE_INLINES_H\n#define JEMALLOC_INTERNAL_BASE_INLINES_H\n\nstatic inline unsigned\nbase_ind_get(c"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/base_structs.h",
"chars": 1563,
"preview": "#ifndef JEMALLOC_INTERNAL_BASE_STRUCTS_H\n#define JEMALLOC_INTERNAL_BASE_STRUCTS_H\n\n#include \"jemalloc/internal/jemalloc_"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/base_types.h",
"chars": 1105,
"preview": "#ifndef JEMALLOC_INTERNAL_BASE_TYPES_H\n#define JEMALLOC_INTERNAL_BASE_TYPES_H\n\ntypedef struct base_block_s base_block_t;"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/bin.h",
"chars": 3064,
"preview": "#ifndef JEMALLOC_INTERNAL_BIN_H\n#define JEMALLOC_INTERNAL_BIN_H\n\n#include \"jemalloc/internal/extent_types.h\"\n#include \"j"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/bin_stats.h",
"chars": 1303,
"preview": "#ifndef JEMALLOC_INTERNAL_BIN_STATS_H\n#define JEMALLOC_INTERNAL_BIN_STATS_H\n\n#include \"jemalloc/internal/mutex_prof.h\"\n\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/bit_util.h",
"chars": 3201,
"preview": "#ifndef JEMALLOC_INTERNAL_BIT_UTIL_H\n#define JEMALLOC_INTERNAL_BIT_UTIL_H\n\n#include \"jemalloc/internal/assert.h\"\n\n#defin"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/bitmap.h",
"chars": 11232,
"preview": "#ifndef JEMALLOC_INTERNAL_BITMAP_H\n#define JEMALLOC_INTERNAL_BITMAP_H\n\n#include \"jemalloc/internal/arena_types.h\"\n#inclu"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/cache_bin.h",
"chars": 3381,
"preview": "#ifndef JEMALLOC_INTERNAL_CACHE_BIN_H\n#define JEMALLOC_INTERNAL_CACHE_BIN_H\n\n#include \"jemalloc/internal/ql.h\"\n\n/*\n * Th"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/ckh.h",
"chars": 3265,
"preview": "#ifndef JEMALLOC_INTERNAL_CKH_H\n#define JEMALLOC_INTERNAL_CKH_H\n\n#include \"jemalloc/internal/tsd.h\"\n\n/* Cuckoo hashing i"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/ctl.h",
"chars": 3613,
"preview": "#ifndef JEMALLOC_INTERNAL_CTL_H\n#define JEMALLOC_INTERNAL_CTL_H\n\n#include \"jemalloc/internal/jemalloc_internal_types.h\"\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/div.h",
"chars": 1172,
"preview": "#ifndef JEMALLOC_INTERNAL_DIV_H\n#define JEMALLOC_INTERNAL_DIV_H\n\n#include \"jemalloc/internal/assert.h\"\n\n/*\n * This modul"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/emitter.h",
"chars": 11537,
"preview": "#ifndef JEMALLOC_INTERNAL_EMITTER_H\n#define JEMALLOC_INTERNAL_EMITTER_H\n\n#include \"jemalloc/internal/ql.h\"\n\ntypedef enum"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_dss.h",
"chars": 728,
"preview": "#ifndef JEMALLOC_INTERNAL_EXTENT_DSS_H\n#define JEMALLOC_INTERNAL_EXTENT_DSS_H\n\ntypedef enum {\n\tdss_prec_disabled = 0,\n\t"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_externs.h",
"chars": 3294,
"preview": "#ifndef JEMALLOC_INTERNAL_EXTENT_EXTERNS_H\n#define JEMALLOC_INTERNAL_EXTENT_EXTERNS_H\n\n#include \"jemalloc/internal/mutex"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_inlines.h",
"chars": 11730,
"preview": "#ifndef JEMALLOC_INTERNAL_EXTENT_INLINES_H\n#define JEMALLOC_INTERNAL_EXTENT_INLINES_H\n\n#include \"jemalloc/internal/mutex"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_mmap.h",
"chars": 328,
"preview": "#ifndef JEMALLOC_INTERNAL_EXTENT_MMAP_EXTERNS_H\n#define JEMALLOC_INTERNAL_EXTENT_MMAP_EXTERNS_H\n\nextern bool opt_retain;"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_structs.h",
"chars": 7528,
"preview": "#ifndef JEMALLOC_INTERNAL_EXTENT_STRUCTS_H\n#define JEMALLOC_INTERNAL_EXTENT_STRUCTS_H\n\n#include \"jemalloc/internal/atomi"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/extent_types.h",
"chars": 493,
"preview": "#ifndef JEMALLOC_INTERNAL_EXTENT_TYPES_H\n#define JEMALLOC_INTERNAL_EXTENT_TYPES_H\n\ntypedef struct extent_s extent_t;\ntyp"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/hash.h",
"chars": 7702,
"preview": "#ifndef JEMALLOC_INTERNAL_HASH_H\n#define JEMALLOC_INTERNAL_HASH_H\n\n#include \"jemalloc/internal/assert.h\"\n\n/*\n * The foll"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/hooks.h",
"chars": 811,
"preview": "#ifndef JEMALLOC_INTERNAL_HOOKS_H\n#define JEMALLOC_INTERNAL_HOOKS_H\n\nextern JEMALLOC_EXPORT void (*hooks_arena_new_hook)"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_decls.h",
"chars": 2132,
"preview": "#ifndef JEMALLOC_INTERNAL_DECLS_H\n#define JEMALLOC_INTERNAL_DECLS_H\n\n#include <math.h>\n#ifdef _WIN32\n# include <windows"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_defs.h.in",
"chars": 10705,
"preview": "#ifndef JEMALLOC_INTERNAL_DEFS_H_\n#define JEMALLOC_INTERNAL_DEFS_H_\n/*\n * If JEMALLOC_PREFIX is defined via --with-jemal"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_externs.h",
"chars": 1689,
"preview": "#ifndef JEMALLOC_INTERNAL_EXTERNS_H\n#define JEMALLOC_INTERNAL_EXTERNS_H\n\n#include \"jemalloc/internal/atomic.h\"\n#include "
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_includes.h",
"chars": 4291,
"preview": "#ifndef JEMALLOC_INTERNAL_INCLUDES_H\n#define JEMALLOC_INTERNAL_INCLUDES_H\n\n/*\n * jemalloc can conceptually be broken int"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_a.h",
"chars": 4433,
"preview": "#ifndef JEMALLOC_INTERNAL_INLINES_A_H\n#define JEMALLOC_INTERNAL_INLINES_A_H\n\n#include \"jemalloc/internal/atomic.h\"\n#incl"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_b.h",
"chars": 2289,
"preview": "#ifndef JEMALLOC_INTERNAL_INLINES_B_H\n#define JEMALLOC_INTERNAL_INLINES_B_H\n\n#include \"jemalloc/internal/rtree.h\"\n\n/* Ch"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_inlines_c.h",
"chars": 7881,
"preview": "#ifndef JEMALLOC_INTERNAL_INLINES_C_H\n#define JEMALLOC_INTERNAL_INLINES_C_H\n\n#include \"jemalloc/internal/jemalloc_intern"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_macros.h",
"chars": 1016,
"preview": "#ifndef JEMALLOC_INTERNAL_MACROS_H\n#define JEMALLOC_INTERNAL_MACROS_H\n\n#ifdef JEMALLOC_DEBUG\n# define JEMALLOC_ALWAYS_I"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_internal_types.h",
"chars": 5140,
"preview": "#ifndef JEMALLOC_INTERNAL_TYPES_H\n#define JEMALLOC_INTERNAL_TYPES_H\n\n/* Page size index type. */\ntypedef unsigned pszind"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/jemalloc_preamble.h.in",
"chars": 3579,
"preview": "#ifndef JEMALLOC_PREAMBLE_H\n#define JEMALLOC_PREAMBLE_H\n\n#include \"jemalloc_internal_defs.h\"\n#include \"jemalloc/internal"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/large_externs.h",
"chars": 1238,
"preview": "#ifndef JEMALLOC_INTERNAL_LARGE_EXTERNS_H\n#define JEMALLOC_INTERNAL_LARGE_EXTERNS_H\n\nvoid *large_malloc(tsdn_t *tsdn, ar"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/log.h",
"chars": 3754,
"preview": "#ifndef JEMALLOC_INTERNAL_LOG_H\n#define JEMALLOC_INTERNAL_LOG_H\n\n#include \"jemalloc/internal/atomic.h\"\n#include \"jemallo"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/malloc_io.h",
"chars": 2985,
"preview": "#ifndef JEMALLOC_INTERNAL_MALLOC_IO_H\n#define JEMALLOC_INTERNAL_MALLOC_IO_H\n\n#ifdef _WIN32\n# ifdef _WIN64\n# define F"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/mutex.h",
"chars": 8089,
"preview": "#ifndef JEMALLOC_INTERNAL_MUTEX_H\n#define JEMALLOC_INTERNAL_MUTEX_H\n\n#include \"jemalloc/internal/atomic.h\"\n#include \"jem"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/mutex_pool.h",
"chars": 2875,
"preview": "#ifndef JEMALLOC_INTERNAL_MUTEX_POOL_H\n#define JEMALLOC_INTERNAL_MUTEX_POOL_H\n\n#include \"jemalloc/internal/hash.h\"\n#incl"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/mutex_prof.h",
"chars": 3016,
"preview": "#ifndef JEMALLOC_INTERNAL_MUTEX_PROF_H\n#define JEMALLOC_INTERNAL_MUTEX_PROF_H\n\n#include \"jemalloc/internal/atomic.h\"\n#in"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/nstime.h",
"chars": 1304,
"preview": "#ifndef JEMALLOC_INTERNAL_NSTIME_H\n#define JEMALLOC_INTERNAL_NSTIME_H\n\n/* Maximum supported number of seconds (~584 year"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/pages.h",
"chars": 3127,
"preview": "#ifndef JEMALLOC_INTERNAL_PAGES_EXTERNS_H\n#define JEMALLOC_INTERNAL_PAGES_EXTERNS_H\n\n/* Page size. LG_PAGE is determine"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/ph.h",
"chars": 12557,
"preview": "/*\n * A Pairing Heap implementation.\n *\n * \"The Pairing Heap: A New Form of Self-Adjusting Heap\"\n * https://www.cs.cmu.e"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/private_namespace.sh",
"chars": 95,
"preview": "#!/bin/sh\n\nfor symbol in `cat \"$@\"` ; do\n echo \"#define ${symbol} JEMALLOC_N(${symbol})\"\ndone\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/private_symbols.sh",
"chars": 1148,
"preview": "#!/bin/sh\n#\n# Generate private_symbols[_jet].awk.\n#\n# Usage: private_symbols.sh <sym_prefix> <sym>*\n#\n# <sym_prefix> is "
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prng.h",
"chars": 4804,
"preview": "#ifndef JEMALLOC_INTERNAL_PRNG_H\n#define JEMALLOC_INTERNAL_PRNG_H\n\n#include \"jemalloc/internal/atomic.h\"\n#include \"jemal"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prof_externs.h",
"chars": 3475,
"preview": "#ifndef JEMALLOC_INTERNAL_PROF_EXTERNS_H\n#define JEMALLOC_INTERNAL_PROF_EXTERNS_H\n\n#include \"jemalloc/internal/mutex.h\"\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prof_inlines_a.h",
"chars": 2479,
"preview": "#ifndef JEMALLOC_INTERNAL_PROF_INLINES_A_H\n#define JEMALLOC_INTERNAL_PROF_INLINES_A_H\n\n#include \"jemalloc/internal/mutex"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prof_inlines_b.h",
"chars": 5459,
"preview": "#ifndef JEMALLOC_INTERNAL_PROF_INLINES_B_H\n#define JEMALLOC_INTERNAL_PROF_INLINES_B_H\n\n#include \"jemalloc/internal/sz.h\""
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prof_structs.h",
"chars": 5170,
"preview": "#ifndef JEMALLOC_INTERNAL_PROF_STRUCTS_H\n#define JEMALLOC_INTERNAL_PROF_STRUCTS_H\n\n#include \"jemalloc/internal/ckh.h\"\n#i"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/prof_types.h",
"chars": 1778,
"preview": "#ifndef JEMALLOC_INTERNAL_PROF_TYPES_H\n#define JEMALLOC_INTERNAL_PROF_TYPES_H\n\ntypedef struct prof_bt_s prof_bt_t;\ntyped"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/public_namespace.sh",
"chars": 129,
"preview": "#!/bin/sh\n\nfor nm in `cat $1` ; do\n n=`echo ${nm} |tr ':' ' ' |awk '{print $1}'`\n echo \"#define je_${n} JEMALLOC_N(${n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/public_unnamespace.sh",
"chars": 111,
"preview": "#!/bin/sh\n\nfor nm in `cat $1` ; do\n n=`echo ${nm} |tr ':' ' ' |awk '{print $1}'`\n echo \"#undef je_${n}\"\ndone\n"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/ql.h",
"chars": 2504,
"preview": "#ifndef JEMALLOC_INTERNAL_QL_H\n#define JEMALLOC_INTERNAL_QL_H\n\n#include \"jemalloc/internal/qr.h\"\n\n/* List definitions. *"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/qr.h",
"chars": 2350,
"preview": "#ifndef JEMALLOC_INTERNAL_QR_H\n#define JEMALLOC_INTERNAL_QR_H\n\n/* Ring definitions. */\n#define qr(a_type)\t\t\t\t\t\t\t\\\nstruct"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/rb.h",
"chars": 38305,
"preview": "/*-\n *******************************************************************************\n *\n * cpp macro implementation of l"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/rtree.h",
"chars": 16320,
"preview": "#ifndef JEMALLOC_INTERNAL_RTREE_H\n#define JEMALLOC_INTERNAL_RTREE_H\n\n#include \"jemalloc/internal/atomic.h\"\n#include \"jem"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/rtree_tsd.h",
"chars": 1855,
"preview": "#ifndef JEMALLOC_INTERNAL_RTREE_CTX_H\n#define JEMALLOC_INTERNAL_RTREE_CTX_H\n\n/*\n * Number of leafkey/leaf pairs to cache"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/size_classes.sh",
"chars": 9798,
"preview": "#!/bin/sh\n#\n# Usage: size_classes.sh <lg_qarr> <lg_tmin> <lg_parr> <lg_g>\n\n# The following limits are chosen such that t"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/smoothstep.h",
"chars": 15626,
"preview": "#ifndef JEMALLOC_INTERNAL_SMOOTHSTEP_H\n#define JEMALLOC_INTERNAL_SMOOTHSTEP_H\n\n/*\n * This file was generated by the foll"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/smoothstep.sh",
"chars": 2970,
"preview": "#!/bin/sh\n#\n# Generate a discrete lookup table for a sigmoid function in the smoothstep\n# family (https://en.wikipedia.o"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/spin.h",
"chars": 613,
"preview": "#ifndef JEMALLOC_INTERNAL_SPIN_H\n#define JEMALLOC_INTERNAL_SPIN_H\n\n#define SPIN_INITIALIZER {0U}\n\ntypedef struct {\n\tunsi"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/stats.h",
"chars": 955,
"preview": "#ifndef JEMALLOC_INTERNAL_STATS_H\n#define JEMALLOC_INTERNAL_STATS_H\n\n/* OPTION(opt,\t\tvar_name,\tdefault,\tset_value_to) *"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/sz.h",
"chars": 8168,
"preview": "#ifndef JEMALLOC_INTERNAL_SIZE_H\n#define JEMALLOC_INTERNAL_SIZE_H\n\n#include \"jemalloc/internal/bit_util.h\"\n#include \"jem"
},
{
"path": "Chapter02/redis-6.0.3/deps/jemalloc/include/jemalloc/internal/tcache_externs.h",
"chars": 2183,
"preview": "#ifndef JEMALLOC_INTERNAL_TCACHE_EXTERNS_H\n#define JEMALLOC_INTERNAL_TCACHE_EXTERNS_H\n\n#include \"jemalloc/internal/size_"
}
]
// ... and 1718 more files (download for full content)
About this extraction
This page contains the full source code of the balloonwj/mybooksources GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1918 files (18.4 MB), approximately 4.9M tokens, and a symbol index with 13213 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.