在zmalloc中分析zmalloc_get_allocator_info
函数时,主要依赖的api是je_mallctl
,但是并没有找到这个函数的实现。
在jemalloc的git上我们看到如下描述:
所以,我们需要重新看一遍makefile中的规则编写,尤其是如何将jemalloc编译到项目中的。
1 根目录Makefile
1 2 3 4 5
|
.DEFAULT: cd src && $(MAKE) $@
|
2 src目录下Makefile
2.1 all
1 2 3 4 5 6 7 8 9 10 11 12
|
all: $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME) @echo "" @echo "Hint: It's a good idea to run 'make test' ;)" @echo ""
|
2.2 redis-server
以redis-server的编译为例进行分析make的整个执行流程。
1 2 3 4
|
$(REDIS_SERVER_NAME): $(REDIS_SERVER_OBJ) $(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/lua/src/liblua.a $(FINAL_LIBS)
|
2.3 .o汇编
1 2 3 4 5
| %.o: %.c .make-prerequisites $(REDIS_CC) -MMD -o $@ -c $<
|
2.4 .make=prerequisites
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| .make-prerequisites: touch $@
ifneq ($(strip $(PREV_FINAL_CFLAGS)), $(strip $(FINAL_CFLAGS))) .make-prerequisites: persist-settings endif
ifneq ($(strip $(PREV_FINAL_LDFLAGS)), $(strip $(FINAL_LDFLAGS))) .make-prerequisites: persist-settings endif
|
2.5 presist-settings
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| persist-settings: distclean echo STD=$(STD) >> .make-settings echo WARN=$(WARN) >> .make-settings echo OPT=$(OPT) >> .make-settings echo MALLOC=$(MALLOC) >> .make-settings echo BUILD_TLS=$(BUILD_TLS) >> .make-settings echo USE_SYSTEMD=$(USE_SYSTEMD) >> .make-settings echo CFLAGS=$(CFLAGS) >> .make-settings echo LDFLAGS=$(LDFLAGS) >> .make-settings echo REDIS_CFLAGS=$(REDIS_CFLAGS) >> .make-settings echo REDIS_LDFLAGS=$(REDIS_LDFLAGS) >> .make-settings echo PREV_FINAL_CFLAGS=$(FINAL_CFLAGS) >> .make-settings echo PREV_FINAL_LDFLAGS=$(FINAL_LDFLAGS) >> .make-settings -(cd ../deps && $(MAKE) $(DEPENDENCY_TARGETS))
|
重要的是最后一句-(cd ../deps && $(MAKE) $(DEPENDENCY_TARGETS))
,即关注../deps/Makefile
即可。
3 deps目录下Makefile
1 2 3 4 5 6 7
| 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_ CFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)" cd jemalloc && $(MAKE) CFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)" lib/libjemalloc.a
|
至此,结合jemalloc的文档说明,jemalloc为了避免malloc
系列函数的同名混淆,在configure
生成makefile时候指定--with-jemalloc-prefix=je_
,那么编译出来的jemallc系列函数都会变成形如je_malloc
这样。