Skip to content

Commit

Permalink
bugfix: in freebsd, libthr may call calloc before globalinit
Browse files Browse the repository at this point in the history
  • Loading branch information
cloudwu committed Jun 4, 2014
1 parent c10e541 commit f92fc15
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 4 deletions.
4 changes: 2 additions & 2 deletions platform.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
11 changes: 9 additions & 2 deletions skynet-src/skynet_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ struct skynet_context {

struct skynet_node {
int total;
int init;
uint32_t monitor_exit;
pthread_key_t handle_key;
};
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit f92fc15

Please sign in to comment.