diff --git a/Makefile b/Makefile index 50407846..d89a8b0c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ all : skynet snlua.so logger.so skynet.so gate.so client.so connection.so client skynet-master -skynet : skynet_main.c skynet_handle.c skynet_module.c skynet_mq.c skynet_server.c skynet_start.c skynet_timer.c skynet_error.c skynet_harbor.c - gcc -Wall -g -Wl,-E -o $@ $^ -lpthread -ldl -lrt -Wl,-E -llua -lm -lzmq +skynet : skynet_main.c skynet_handle.c skynet_module.c skynet_mq.c skynet_server.c skynet_start.c skynet_timer.c skynet_error.c skynet_harbor.c master/master.c + gcc -Wall -g -Wl,-E -o $@ $^ -Imaster -lpthread -ldl -lrt -Wl,-E -llua -lm -lzmq logger.so : skynet_logger.c gcc -Wall -g -fPIC --shared $^ -o $@ @@ -24,8 +24,8 @@ connection.so : connection/connection.c connection/main.c client : client.c gcc -Wall -g $^ -o $@ -lpthread -skynet-master : master/master.c - gcc -g -Wall -o $@ $^ -lzmq +skynet-master : master/master.c master/main.c + gcc -g -Wall -Imaster -o $@ $^ -lzmq clean : rm skynet client skynet-master *.so diff --git a/README.md b/README.md index 918a3a56..b3e97628 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,7 @@ make Run these in different console ``` -./skynet-master # Launch master server first -./skynet config # Launch first skynet node (Gate server) +./skynet config # Launch first skynet node (Gate server) and a skynet-master (see config for standalone option) ./skynet config_log # Launch second skynet node (Global logger server) ./clinet 127.0.0.1 8888 # Launch a client, and try to input some words. ``` @@ -20,8 +19,7 @@ Run these in different console ## Test connection server ``` -./skynet-master # Launch master server first -./skynet # Launch first skynet node +./skynet # Launch skynet ./nc -l 8000 # Listen on port 8000 ``` diff --git a/config b/config index ecdef693..3bda9c32 100644 --- a/config +++ b/config @@ -6,3 +6,4 @@ harbor = 1 address = "tcp://127.0.0.1:2525" master = "tcp://127.0.0.1:2012" start = "main.lua" +standalone = true diff --git a/master/Makefile b/master/Makefile index fae7e177..0246855c 100644 --- a/master/Makefile +++ b/master/Makefile @@ -1,7 +1,10 @@ all : master test -master : master.c +master : master.c main.c gcc -g -Wall -o $@ $^ -lzmq test : test.c gcc -g -Wall -o $@ $^ -lzmq + +clean : + rm master test diff --git a/master/main.c b/master/main.c new file mode 100644 index 00000000..4e83cc43 --- /dev/null +++ b/master/main.c @@ -0,0 +1,17 @@ +#include "skynet_master.h" +#include + +int +main (int argc, char * argv[]) { + const char * default_port = "tcp://127.0.0.1:2012"; + if (argc > 1) { + default_port = argv[2]; + } + + void *context = zmq_init (1); + + skynet_master(context, default_port); + + zmq_term (context); + return 0; +} diff --git a/master/master.c b/master/master.c index 7c0aeaf8..9eb3f72d 100644 --- a/master/master.c +++ b/master/master.c @@ -217,22 +217,16 @@ update(void * responder, struct hashmap *map, zmq_msg_t * msg) { query(responder, map, key); } -int -main (int argc, char * argv[]) { - const char * default_port = "tcp://127.0.0.1:2012"; - if (argc > 1) { - default_port = argv[2]; - } - - void *context = zmq_init (1); +void +skynet_master(void * context, const char * port) { void *responder = zmq_socket (context, ZMQ_REP); - int r = zmq_bind(responder, default_port); + int r = zmq_bind(responder, port); if (r < 0) { - fprintf(stderr, "Can't bind to %s\n",default_port); - return 1; + fprintf(stderr, "Can't bind to %s\n",port); + exit(1); } - printf("Start master on %s\n",default_port); + printf("Start master on %s\n", port); struct hashmap *map = _hash_new(context); @@ -245,6 +239,5 @@ main (int argc, char * argv[]) { } zmq_close (responder); - zmq_term (context); - return 0; } + diff --git a/master/skynet_master.h b/master/skynet_master.h new file mode 100644 index 00000000..d249d3e6 --- /dev/null +++ b/master/skynet_master.h @@ -0,0 +1,6 @@ +#ifndef SKYNET_MASTER_H +#define SKYNET_MASTER_H + +void skynet_master(void * context, const char * port); + +#endif diff --git a/skynet_harbor.c b/skynet_harbor.c index f5fe2a1d..ca91fba1 100644 --- a/skynet_harbor.c +++ b/skynet_harbor.c @@ -617,12 +617,11 @@ register_harbor(void *request, const char *local, int harbor) { } void -skynet_harbor_init(const char * master, const char *local, int harbor) { +skynet_harbor_init(void * context, const char * master, const char *local, int harbor) { if (harbor <=0 || harbor>255 || strlen(local) > 512) { fprintf(stderr,"Invalid harbor id\n"); exit(1); } - void *context = zmq_init (1); void *request = zmq_socket (context, ZMQ_REQ); int r = zmq_connect(request, master); if (r<0) { diff --git a/skynet_harbor.h b/skynet_harbor.h index 27d3557b..235420d9 100644 --- a/skynet_harbor.h +++ b/skynet_harbor.h @@ -16,6 +16,6 @@ void skynet_harbor_message_close(struct skynet_message * message); // harbor worker thread void * skynet_harbor_dispatch_thread(void *ud); -void skynet_harbor_init(const char * master, const char *local, int harbor); +void skynet_harbor_init(void * context, const char * master, const char *local, int harbor); #endif diff --git a/skynet_imp.h b/skynet_imp.h index 5a20e545..a9eedf11 100644 --- a/skynet_imp.h +++ b/skynet_imp.h @@ -10,6 +10,7 @@ struct skynet_config { const char * master; const char * local; const char * start; + int standalone; }; void skynet_start(struct skynet_config * config); diff --git a/skynet_main.c b/skynet_main.c index e75e0876..da15bb7a 100644 --- a/skynet_main.c +++ b/skynet_main.c @@ -17,6 +17,16 @@ optint(lua_State *L, const char *key, int opt) { return n; } +static int +optboolean(lua_State *L, const char *key, int opt) { + lua_getglobal(L, key); + int n = lua_toboolean(L,-1); + lua_pop(L,1); + if (n==0) + return opt; + return n; +} + static const char * optstring(lua_State *L, const char *key,const char * opt) { lua_getglobal(L, key); @@ -61,6 +71,7 @@ main(int argc, char *argv[]) { config.master = optstring(L,"master","tcp://127.0.0.1:2012"); config.start = optstring(L,"start","main.lua"); config.local = optstring(L,"address","tcp://127.0.0.1:2525"); + config.standalone = optboolean(L,"standalone",0); lua_close(L); skynet_start(&config); diff --git a/skynet_start.c b/skynet_start.c index 50b9c714..1b5e8e12 100644 --- a/skynet_start.c +++ b/skynet_start.c @@ -5,10 +5,12 @@ #include "skynet_module.h" #include "skynet_timer.h" #include "skynet_harbor.h" +#include "skynet_master.h" #include #include #include +#include static void * _timer(void *p) { @@ -46,10 +48,36 @@ _start(int thread) { } } +struct master_arg { + void * context; + const char * port; +}; + +static void * +_master_thread(void *ud) { + struct master_arg * args = ud; + skynet_master(args->context, args->port); + return NULL; +} + +static void +_start_master(void * context, const char * port) { + pthread_t pid; + struct master_arg args; + args.context = context; + args.port = port; + pthread_create(&pid, NULL, _master_thread, &args); +} + void skynet_start(struct skynet_config * config) { + void *context = zmq_init (1); + assert(context); + if (config->standalone) { + _start_master(context, config->master); + } // harbor must be init first - skynet_harbor_init(config->master , config->local, config->harbor); + skynet_harbor_init(context, config->master , config->local, config->harbor); skynet_handle_init(config->harbor); skynet_mq_init(config->mqueue_size); skynet_module_init(config->module_path);