From f92fc153e4adbe7e1e3bcf9092e3d1f453d40c0e Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Wed, 4 Jun 2014 02:51:29 +0000 Subject: [PATCH] bugfix: in freebsd, libthr may call calloc before globalinit --- platform.mk | 4 ++-- skynet-src/skynet_server.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/platform.mk b/platform.mk index 37291271e..345acabe5 100644 --- a/platform.mk +++ b/platform.mk @@ -33,8 +33,8 @@ linux freebsd : SKYNET_LIBS += -lrt # Turn off jemalloc and malloc hook on macosx and freebsd -freebsd macosx : MALLOC_STATICLIB := -freebsd macosx : SKYNET_DEFINES :=-DNOUSE_JEMALLOC +macosx : MALLOC_STATICLIB := +macosx : SKYNET_DEFINES :=-DNOUSE_JEMALLOC linux macosx freebsd : $(MAKE) all PLAT=$@ SKYNET_LIBS="$(SKYNET_LIBS)" SHARED="$(SHARED)" EXPORT="$(EXPORT)" MALLOC_STATICLIB="$(MALLOC_STATICLIB)" SKYNET_DEFINES="$(SKYNET_DEFINES)" diff --git a/skynet-src/skynet_server.c b/skynet-src/skynet_server.c index ab7094c80..98fcfcd5e 100644 --- a/skynet-src/skynet_server.c +++ b/skynet-src/skynet_server.c @@ -52,6 +52,7 @@ struct skynet_context { struct skynet_node { int total; + int init; uint32_t monitor_exit; pthread_key_t handle_key; }; @@ -75,8 +76,13 @@ context_dec() { uint32_t skynet_current_handle(void) { - void * handle = pthread_getspecific(G_NODE.handle_key); - return (uint32_t)(uintptr_t)handle; + if (G_NODE.init) { + void * handle = pthread_getspecific(G_NODE.handle_key); + return (uint32_t)(uintptr_t)handle; + } else { + uintptr_t v = (uint32_t)(-THREAD_MAIN); + return v; + } } static void @@ -650,6 +656,7 @@ void skynet_globalinit(void) { G_NODE.total = 0; G_NODE.monitor_exit = 0; + G_NODE.init = 1; if (pthread_key_create(&G_NODE.handle_key, NULL)) { fprintf(stderr, "pthread_key_create failed"); exit(1);