From 0846a6533d9f8dde40197f0cfaa84a916340785a Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Mon, 12 Feb 2018 17:47:57 +0800 Subject: [PATCH] fix a legacy problem. make harbor service more stable --- service-src/service_harbor.c | 12 +++++++++--- skynet-src/skynet_harbor.c | 11 +++++++---- skynet-src/skynet_harbor.h | 1 + skynet-src/skynet_server.c | 6 ++++-- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/service-src/service_harbor.c b/service-src/service_harbor.c index 37157d34..9b84e9d0 100644 --- a/service-src/service_harbor.c +++ b/service-src/service_harbor.c @@ -690,21 +690,27 @@ mainloop(struct skynet_context * context, void * ud, int type, int session, uint harbor_command(h, msg,sz,session,source); return 0; } - default: { + case PTYPE_SYSTEM : { // remote message out const struct remote_message *rmsg = msg; if (rmsg->destination.handle == 0) { - if (remote_send_name(h, source , rmsg->destination.name, type, session, rmsg->message, rmsg->sz)) { + if (remote_send_name(h, source , rmsg->destination.name, rmsg->type, session, rmsg->message, rmsg->sz)) { return 0; } } else { - if (remote_send_handle(h, source , rmsg->destination.handle, type, session, rmsg->message, rmsg->sz)) { + if (remote_send_handle(h, source , rmsg->destination.handle, rmsg->type, session, rmsg->message, rmsg->sz)) { return 0; } } skynet_free((void *)rmsg->message); return 0; } + default: + skynet_error(context, "recv invalid message from %x, type = %d", source, type); + if (session != 0) { + skynet_send(context,0,source,PTYPE_ERROR, session, NULL, 0); + } + return 0; } } diff --git a/skynet-src/skynet_harbor.c b/skynet-src/skynet_harbor.c index 5e39ca62..832642aa 100644 --- a/skynet-src/skynet_harbor.c +++ b/skynet-src/skynet_harbor.c @@ -11,12 +11,15 @@ static struct skynet_context * REMOTE = 0; static unsigned int HARBOR = ~0; +static inline int +invalid_type(int type) { + return type != PTYPE_SYSTEM && type != PTYPE_HARBOR; +} + void skynet_harbor_send(struct remote_message *rmsg, uint32_t source, int session) { - int type = rmsg->sz >> MESSAGE_TYPE_SHIFT; - rmsg->sz &= MESSAGE_TYPE_MASK; - assert(type != PTYPE_SYSTEM && type != PTYPE_HARBOR && REMOTE); - skynet_context_send(REMOTE, rmsg, sizeof(*rmsg) , source, type , session); + assert(invalid_type(rmsg->type) && REMOTE); + skynet_context_send(REMOTE, rmsg, sizeof(*rmsg) , source, PTYPE_SYSTEM , session); } int diff --git a/skynet-src/skynet_harbor.h b/skynet-src/skynet_harbor.h index 97a76c20..2cde0c2e 100644 --- a/skynet-src/skynet_harbor.h +++ b/skynet-src/skynet_harbor.h @@ -16,6 +16,7 @@ struct remote_message { struct remote_name destination; const void * message; size_t sz; + int type; }; void skynet_harbor_send(struct remote_message *rmsg, uint32_t source, int session); diff --git a/skynet-src/skynet_server.c b/skynet-src/skynet_server.c index d730d1dd..fc79bdd7 100644 --- a/skynet-src/skynet_server.c +++ b/skynet-src/skynet_server.c @@ -718,7 +718,8 @@ skynet_send(struct skynet_context * context, uint32_t source, uint32_t destinati struct remote_message * rmsg = skynet_malloc(sizeof(*rmsg)); rmsg->destination.handle = destination; rmsg->message = data; - rmsg->sz = sz; + rmsg->sz = sz & MESSAGE_TYPE_MASK; + rmsg->type = sz >> MESSAGE_TYPE_SHIFT; skynet_harbor_send(rmsg, source, session); } else { struct skynet_message smsg; @@ -758,7 +759,8 @@ skynet_sendname(struct skynet_context * context, uint32_t source, const char * a copy_name(rmsg->destination.name, addr); rmsg->destination.handle = 0; rmsg->message = data; - rmsg->sz = sz; + rmsg->sz = sz & MESSAGE_TYPE_MASK; + rmsg->type = sz >> MESSAGE_TYPE_SHIFT; skynet_harbor_send(rmsg, source, session); return session;