From bad9a5fc549beeeb20081239cefc78905b80a21c Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Thu, 24 Apr 2014 17:55:43 +0800 Subject: [PATCH] use pthread_getspecific instead of __thread --- skynet-src/skynet_imp.h | 6 ++++++ skynet-src/skynet_main.c | 6 ++++++ skynet-src/skynet_server.c | 37 ++++++++++++++++++++++++++++++++----- skynet-src/skynet_server.h | 4 ++++ skynet-src/skynet_start.c | 4 ++++ test/testlog.lua | 9 --------- 6 files changed, 52 insertions(+), 14 deletions(-) delete mode 100644 test/testlog.lua diff --git a/skynet-src/skynet_imp.h b/skynet-src/skynet_imp.h index a5c7e078..63b6c139 100644 --- a/skynet-src/skynet_imp.h +++ b/skynet-src/skynet_imp.h @@ -12,6 +12,12 @@ struct skynet_config { const char * standalone; }; +#define THREAD_WORKER 0 +#define THREAD_MAIN 1 +#define THREAD_SOCKET 2 +#define THREAD_TIMER 3 +#define THREAD_MONITOR 4 + void skynet_start(struct skynet_config * config); #endif diff --git a/skynet-src/skynet_main.c b/skynet-src/skynet_main.c index 8cebd00e..1e7689ef 100644 --- a/skynet-src/skynet_main.c +++ b/skynet-src/skynet_main.c @@ -2,6 +2,8 @@ #include "skynet_imp.h" #include "skynet_env.h" +#include "skynet_server.h" +#include "malloc_hook.h" #include #include @@ -87,6 +89,9 @@ main(int argc, char *argv[]) { if (argc > 1) { config_file = argv[1]; } + skynet_globalinit(); + + malloc_inithook(); skynet_env_init(); sigign(); @@ -129,6 +134,7 @@ main(int argc, char *argv[]) { lua_close(L); skynet_start(&config); + skynet_globalexit(); printf("skynet exit\n"); diff --git a/skynet-src/skynet_server.c b/skynet-src/skynet_server.c index 4c879cb2..f8f12f4c 100644 --- a/skynet-src/skynet_server.c +++ b/skynet-src/skynet_server.c @@ -8,6 +8,9 @@ #include "skynet_harbor.h" #include "skynet_env.h" #include "skynet_monitor.h" +#include "skynet_imp.h" + +#include #include #include @@ -50,10 +53,10 @@ struct skynet_context { struct skynet_node { int total; uint32_t monitor_exit; + pthread_key_t handle_key; }; -static struct skynet_node G_NODE = { 0,0 }; -static __thread uint32_t handle_tls = 0xffffffff; +static struct skynet_node G_NODE; int skynet_context_total() { @@ -72,7 +75,8 @@ _context_dec() { uint32_t skynet_current_handle(void) { - return handle_tls; + void * handle = pthread_getspecific(G_NODE.handle_key); + return (uint32_t)(uintptr_t)handle; } static void @@ -199,13 +203,12 @@ static void _dispatch_message(struct skynet_context *ctx, struct skynet_message *msg) { assert(ctx->init); CHECKCALLING_BEGIN(ctx) - handle_tls = ctx->handle; + pthread_setspecific(G_NODE.handle_key, (void *)(uintptr_t)(ctx->handle)); int type = msg->sz >> HANDLE_REMOTE_SHIFT; size_t sz = msg->sz & HANDLE_MASK; if (!ctx->cb(ctx, ctx->cb_ud, type, msg->session, msg->source, msg->data, sz)) { skynet_free(msg->data); } - handle_tls = 0xffffffff; CHECKCALLING_END(ctx) } @@ -590,3 +593,27 @@ skynet_context_send(struct skynet_context * ctx, void * msg, size_t sz, uint32_t skynet_mq_push(ctx->queue, &smsg); } + +void +skynet_globalinit(void) { + G_NODE.total = 0; + G_NODE.monitor_exit = 0; + if (pthread_key_create(&G_NODE.handle_key, NULL)) { + fprintf(stderr, "pthread_key_create failed"); + exit(1); + } + // set mainthread's key + skynet_initthread(THREAD_MAIN); +} + +void +skynet_globalexit(void) { + pthread_key_delete(G_NODE.handle_key); +} + +void +skynet_initthread(int m) { + uintptr_t v = (uint32_t)(-m); + pthread_setspecific(G_NODE.handle_key, (void *)v); +} + diff --git a/skynet-src/skynet_server.h b/skynet-src/skynet_server.h index 604529fe..7adc1292 100644 --- a/skynet-src/skynet_server.h +++ b/skynet-src/skynet_server.h @@ -21,4 +21,8 @@ int skynet_context_total(); void skynet_context_endless(uint32_t handle); // for monitor +void skynet_globalinit(void); +void skynet_globalexit(void); +void skynet_initthread(int m); + #endif diff --git a/skynet-src/skynet_start.c b/skynet-src/skynet_start.c index bdb8c811..764c1a05 100644 --- a/skynet-src/skynet_start.c +++ b/skynet-src/skynet_start.c @@ -50,6 +50,7 @@ wakeup(struct monitor *m, int busy) { static void * _socket(void *p) { struct monitor * m = p; + skynet_initthread(THREAD_SOCKET); for (;;) { int r = skynet_socket_poll(); if (r==0) @@ -81,6 +82,7 @@ _monitor(void *p) { struct monitor * m = p; int i; int n = m->count; + skynet_initthread(THREAD_MONITOR); for (;;) { CHECK_ABORT for (i=0;iid; struct monitor *m = wp->m; struct skynet_monitor *sm = m->m[id]; + skynet_initthread(THREAD_WORKER); for (;;) { if (skynet_context_message_dispatch(sm)) { CHECK_ABORT diff --git a/test/testlog.lua b/test/testlog.lua deleted file mode 100644 index f14e8066..00000000 --- a/test/testlog.lua +++ /dev/null @@ -1,9 +0,0 @@ -local skynet = require "skynet" -local log = require "log" - -skynet.start(function() - log.Info("hello world") - skynet.exit() -end) - -